Я просматривал свои функции. add_filter
и задавался вопросом, почему CODE A использует add_action
а CODE B использует add_filter
?
Основная цель CODE A заключается в том, чтобы включать и исключать определенные категории.
Основная цель CODE B – исключить определенные категории.
Правильно ли использовать add_action
для CODE A
и add_filter
для CODE B?
,
CODE A: Отобразить определенную категорию (называемую «признаком») для главной страницы, а не «последние сообщения»,
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' );
,
,
CODE B: Исключить «категории статей, спонсируемых по почте» для результатов поиска
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 работает, не возвращая ничего.
CODE B возвращает $query
но снова этот код работает, потому что запрос передан по ссылке. Возвращаемое значение крючка не привязано ни к чему.
do_action_ref_array( 'pre_get_posts', array( &$this ) );
add_action
и add_filter
используются в разных контекстах, но код тот же ( add_action
– это псевдоним add_filter
). В то время как оба набора кода будут работать, правильное использование – add_action
.