Фильтр 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()) {}
, но это не возымело никакого эффекта. Есть ли определенный синтаксис, который я должен использовать?
Обратите внимание, я использую гутенберга... может ли это быть причиной?
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
}
Здесь я собираюсь ответить на свой собственный вопрос. Похоже, что is_admin
не работает при использовании редактора гутенберга, потому что гутенберг также использует API для выполнения запросов.
Я установил классический редактор, и проблема решена. Хотя было бы неплохо знать, как реализовать аналогичную проверку для гутенберга.