Фильтр Wordpress Rest для пользовательской таксономии применяется в области администрирования


У меня есть пользовательская таксономия, называемая коллекцией, с расширенными пользовательскими полями в ней.

Я использую API wordpress, поэтому, поскольку мне нужно фильтровать ответы API по значениям ACF, у меня есть этот фильтр в моей теме functions.php:

 add_filter( 'rest_collection_query', function( $args ) {
            $ignore = array('page', 'per_page', 'search', 'order', 'orderby', 'slug');
            foreach ( $_GET as $key => $value ) {
            if (!in_array($key, $ignore)) {
                $args['meta_query'][] = array(
                'key'   => $key,
                'value' => $value,
                );
            }
            }
            return $args; 
    });

Это отлично работает, за исключением того, что теперь в администраторе WP мой список флажков таксономии больше не отображается для пользовательского типа записи, для которого он зарегистрирован.

Я попытался обернуть этот блок внутри if(!is_admin()) {}, но это не возымело никакого эффекта. Есть ли определенный синтаксис, который я должен использовать?

Обратите внимание, я использую гутенберга... может ли это быть причиной?

Author: geochanto, 2019-04-06

2 answers

Я использую гутенберга... может быть, в этом причина?

Да, Гутенберг (или редактор блоков) использует API REST WordPress при работе с терминами таксономии (и другими вещами, такими как пользовательские типы записей).

Таким образом, фильтр rest_collection_query (или rest_{taxonomy}_query) будет применен независимо от того, кто/что сделал запрос REST API или откуда он был сделан (например, через /wp-admin/ или интерфейс сайта?).

Я использую API wordpress

Предполагая, что что вы делаете ручные запросы к конечной точке таксономии "коллекция" (/wp-json/wp/v2/collection), вы можете определить источник запроса, используя пользовательский параметр, например, так, где имя параметра my_key - и если значение 1, то мы можем отфильтровать $args (т.Е. Параметры запроса):

add_filter( 'rest_collection_query', function( $args, $request ){
    if ( '1' === $request->get_param( 'my_key' ) ) {
        // your code here
    } // else, don't filter/modify $args

    return $args;
}, 10, 2 );

А затем, например, используя window.fetch() в JavaScript, вы могли бы сделать что-то вроде:

window.fetch( '/wp-json/wp/v2/collection?per_page=2&my_key=1' )
    .then( res => res.json() )
    .then( terms => console.log( terms ) );

Альтернативное Решение

Добавьте свою собственную пользовательскую конечную точку и делай все, что пожелает твое сердце..

Классический редактор может помочь, но если плагин или пользовательский код выполняет запрос к точно такой же конечной точке таксономии "коллекция", то вы знаете, что может произойти.;)

Последнее, но не менее важное..

По умолчанию is_admin() возвращает false в конечной точке/URL API REST. Так что, например, если вы находитесь на http://example.com/wp-json/wp/v2/posts (или делаете запрос API к этой конечной точке), то:

if ( ! is_admin() ) {
    // code here runs
}
 1
Author: Sally CJ, 2019-04-15 07:53:52

Здесь я собираюсь ответить на свой собственный вопрос. Похоже, что is_admin не работает при использовании редактора гутенберга, потому что гутенберг также использует API для выполнения запросов.

Я установил классический редактор, и проблема решена. Хотя было бы неплохо знать, как реализовать аналогичную проверку для гутенберга.

 1
Author: geochanto, 2019-04-10 19:54:34