2014-10-20 69 views
4

我正在查看我的functions.php並想知道爲什麼代碼A使用add_action,而代碼B使用add_filter
CODE A的主要目標是對都包含和排除特定類別。
CODE B的主要目標是排除特定類別。add_filter與add_action之間的區別

對於代碼B,使用add_action代碼A
add_filter是否正確?


代碼:顯示特定類別(稱爲 「特色」)的網頁,而不是 「最近的帖子」

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



代碼B:排除 「主辦的崗位類別」 的搜索結果

功能search_filter($查詢){

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是一個動作,而不是一個過濾器。 $query通過引用傳遞,這就是爲什麼CODE A可以在不返回任何內容的情況下工作。

代碼B返回$query但該代碼再次工作,因爲查詢已通過引用傳遞。鉤子的返回值沒有分配給任何東西。

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

add_actionadd_filter在不同的上下文中使用,但該代碼是相同的(add_actionadd_filter的別名)。雖然發佈的這兩套代碼都可以正常使用,但它的作用是add_action

+0

謝謝,我將使用'add_action'。但只是好奇,就網站速度而言,這會加快網站速度,'add_action'或'add_filter'? ----另外,請注意我在上面使用了三個'$ query-> set' - 做了很多'$ query-> set'導致一個緩慢的網站? – leko 2014-10-20 17:14:44

+1

'add_action' vs'add_filter'對速度沒有影響。執行完全相同的過程。你正在使用set方法。如果這些是你需要設置的選項,那麼這就是你需要做的。你不能以某種方式將它們組合成一個電話。我不得不看看set方法,但是我看不出它對性能有任何影響(不包括當然最終運行的數據庫查詢)。 – 2014-10-20 17:38:46

相關問題