Я просматривал свои functions.php и удивлялся, почему CODE A использует add_action
в то время как код B использует add_filter
?
Основная цель КОДА А заключается в как включить, так и исключить конкретные категории.
Основная цель Кодекса B состоит в том, чтобы исключать конкретные категории.
Это правильно использовать add_action
для кода A
а также add_filter
для кода B?
КОД А. Отображение определенной категории (называемой «избранная») для домашней страницы вместо «самых последних сообщений»
function featured_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'category_name', 'featured' );
$query->set( 'category__not_in', array(60, 61) );
$query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'featured_category' );
КОД Б: Исключить «категории спонсируемых сообщений» для результатов поиска
function search_filter($query) {
if ( $query->is_search && $query->is_main_query() ) {
$query->set('post_type', 'post');
$query->set( 'category__not_in', array(60, 61) );
$query->set( 'posts_per_page', 20 );
}
return $query;
}
add_filter('pre_get_posts', 'search_filter');
pre_get_posts
это действие, а не фильтр. $query
передается по ссылке, поэтому CODE A работает, ничего не возвращая.
Код B возвращается $query
но опять же, этот код работает, потому что запрос был передан по ссылке. Возвращаемое значение ловушки не назначено ни для чего.
do_action_ref_array( 'pre_get_posts', array( &$this ) );
add_action
а также add_filter
используются в разных контекстах, но код один и тот же (add_action
псевдоним add_filter
). Хотя оба набора размещенного кода будут работать, правильное использование add_action
,
Других решений пока нет …