Я просматривал свои функции. 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 .