Difference between add_filter versus add_action

泪湿孤枕 提交于 2019-12-10 13:26:56

问题


I was looking over my functions.php and wondering why CODE A uses add_action while CODE B uses add_filter ?
The main goal of CODE A is to both include and exclude specific categories.
The main goal of CODE B is to exclude specific categories.

Is it correct to use add_action for CODE A
and add_filter for CODE B?



CODE A: Display specific category (called "featured") for homepage, instead of "the most recent posts"

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: Exclude "sponsored posts categories" for search results

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');

回答1:


pre_get_posts is an action and not a filter. $query is passed by reference which is why CODE A works without returning anything.

CODE B returns $query but again that code works because query has been passed by reference. The return value of the hook isn't assigned to anything.

do_action_ref_array( 'pre_get_posts', array( &$this ) ); 

add_action and add_filter are used in different contexts but the code is the same (add_action is an alias of add_filter). While both sets of code posted will work the correct usage is add_action.



来源:https://stackoverflow.com/questions/26458037/difference-between-add-filter-versus-add-action

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!