文本是《掌握 WP_Query(共19篇)》專題的第 4 篇。閱讀本文前,建議先閱讀前面的文章:
歡迎來(lái)到掌握WP_Query系列的第三部分。在先前的部分,我們學(xué)習(xí)了wordpress的13個(gè)與WP_Query類相關(guān)的函數(shù)。在這個(gè)部分,我們將學(xué)習(xí)到與WP_Query相關(guān)的WordPress的鉤子(行動(dòng)器和過(guò)濾器)。
WP_Query相關(guān)的過(guò)濾器
在過(guò)濾器“官方參考”中,有16個(gè)與WP_Query相關(guān)的WordPress過(guò)濾器。在這個(gè)部分中,我們將要學(xué)習(xí)它們。這是個(gè)很簡(jiǎn)短的部分,因?yàn)樗械倪^(guò)濾器都是WP_Query類不同的數(shù)據(jù)庫(kù)查詢操作。
我們將會(huì)在之后學(xué)習(xí)數(shù)據(jù)庫(kù)的一些查詢操作。
過(guò)濾Query查詢找到的文章數(shù):found_posts
這個(gè)過(guò)濾器可以無(wú)限制的改變由WP_Query的posts_per_page變量而找到的項(xiàng)目數(shù)量。
這個(gè)過(guò)濾器可以用來(lái)創(chuàng)立用戶自定義的頁(yè)碼。讓我們看看官方文檔怎么說(shuō):
例如,如果你想在查詢中重新自定義值,通過(guò)$wp_query->found_posts 參數(shù),WordPress不會(huì)修改這個(gè)定義值(就比如說(shuō),你有45篇可用的文章當(dāng)你設(shè)置這個(gè)參考值為10篇,WordPress會(huì)忽略參考值,仍然會(huì)給你找到55篇文章。)
多讀幾遍,理解一下吧。
當(dāng)Query查詢?nèi)z索尋找文章的時(shí)候,過(guò)濾Query查詢:found_posts_querys
查詢結(jié)果是MySQL的 SELECT FOUND_ROWS() 命令計(jì)算出來(lái)的。這個(gè)過(guò)濾器可以去改變這個(gè)命令,當(dāng)需要用一種不同的方式去計(jì)算查詢項(xiàng)目的數(shù)量時(shí)候,這個(gè)過(guò)濾器非常的有用。
過(guò)濾整個(gè)SQL的Query查詢:posts_request
如果需要改變整個(gè)SQL的query查詢,這個(gè)過(guò)濾器是非常好的幫手,它可以很簡(jiǎn)單的重寫整個(gè)由WP_Query類生成的SQL的query查詢。
過(guò)濾由Query查詢返回的結(jié)果:posts_results
如果需要改變由WP_Query的SQL語(yǔ)言產(chǎn)生的PHP的數(shù)組(這組數(shù)據(jù):后稱文章列表),可以使用posts_results這個(gè)過(guò)濾器。這里有一個(gè)官方的例子,可以看看它是怎么工作的。
檢索文章列表的時(shí)候進(jìn)行過(guò)濾:the_posts
不像posts_results,the_posts過(guò)濾器等到檢索文章列表,即將操作檢索的時(shí)候,進(jìn)行過(guò)濾——意思是這個(gè)文章列表會(huì)被再次與未發(fā)表的和置頂?shù)奈恼逻M(jìn)行核對(duì)。使用這個(gè)過(guò)濾器的情景:當(dāng)你不想在你的文章列表中出現(xiàn)未發(fā)表的文章的時(shí)候。
過(guò)濾Query查詢的(SELECT子句)的查詢范圍:posts_fields
SQL中的SELECT子句會(huì)決定數(shù)據(jù)中的哪個(gè)表或者范圍被選擇,可以使用posts_fields過(guò)濾器來(lái)實(shí)現(xiàn)。
過(guò)濾查詢的LIMIT子句:post_limits
SQL查詢的LIMIT子句將限制查詢,該過(guò)濾器可以幫助你過(guò)濾。
過(guò)濾查詢的DISTINCT子句:posts_distinct
SQL查詢的DISTINCT子句指出查詢應(yīng)該只返回不同的結(jié)果,而這種過(guò)濾器可以幫助你過(guò)濾。
當(dāng)然,WP_Query不返回不同的結(jié)果,但是當(dāng)你使用此過(guò)濾器,它會(huì)返回像“DISTINCT”功能的結(jié)果,查詢將被調(diào)整為只返回不同的結(jié)果。
過(guò)濾查詢的WHERE子句:posts_where
SQL查詢中的WHERE子句是用來(lái)過(guò)濾MySQL的SELECT,INSERT,UPDATE或者DELETE狀態(tài)的,這個(gè)過(guò)濾器可以實(shí)現(xiàn)過(guò)濾WHERE子句。當(dāng)WP_Query類實(shí)現(xiàn)了所有所需要的過(guò)濾結(jié)果工作,依舊可以在WP_Query之前使用這個(gè)過(guò)濾器來(lái)實(shí)現(xiàn)過(guò)濾功能。
在計(jì)算分頁(yè)之后,過(guò)濾查詢的WHERE子句:posts_where_paged
這個(gè)過(guò)濾器其實(shí)就是posts_where過(guò)濾器的一個(gè)反復(fù)過(guò)程,可以用在分頁(yè)查詢中。
過(guò)濾搜索查詢的WHERE子句:posts_search
另一種迭代的posts_where過(guò)濾器的方法——posts_search過(guò)濾器,可以用其來(lái)改變(用來(lái)獲取WordPress的搜索結(jié)果)查詢的WHERE子句。
過(guò)濾查詢的JOIN子句:posts_join
查詢的JOIN子句允許SQL語(yǔ)句在多個(gè)數(shù)據(jù)庫(kù)表內(nèi)的聯(lián)合工作,該過(guò)濾器可以幫助你過(guò)濾JOIN子句。JOIN是MySQL的比較牛B的地方,除非你知道MySQL的JOIN工作原理,不然的話,我不建議使用這種過(guò)濾器。
當(dāng)分頁(yè)被計(jì)算,過(guò)濾查詢的JOIN子句:posts_join_paged
就像posts_where_paged過(guò)濾器去迭代posts_where過(guò)濾器一樣,posts_join_paged過(guò)濾器是當(dāng)在進(jìn)行分頁(yè)查詢時(shí)迭代psots_join過(guò)濾器。
過(guò)濾查詢的OREDER BY子句:posts_orderby
ORDER BY子句是SQL查詢用來(lái)對(duì)查詢結(jié)果進(jìn)行排序的,這個(gè)過(guò)濾器是用來(lái)過(guò)濾排序的。
過(guò)濾查詢的GROUP BY子句:posts_groupby
Group BY子句使SQL查詢返回一個(gè)數(shù)據(jù)庫(kù)字段的“分組”結(jié)果,該過(guò)濾器可以幫助你過(guò)濾如何分組的結(jié)果。
過(guò)濾所有的查詢子句:posts_clauses
如果想要在同一時(shí)間去處理所有的子句,這里有一個(gè)過(guò)濾器可以實(shí)現(xiàn)posts_clases。這個(gè)過(guò)濾器涵蓋了WHERE,GROUP,BY,JOIN,ORDER BY,DISTINCT,SELECT和LIMITS子句。
WP_Query相關(guān)的行動(dòng)器(Actions)
現(xiàn)在,我們已經(jīng)學(xué)習(xí)了與WP_Query相關(guān)的過(guò)濾器,讓我們繼續(xù)學(xué)習(xí)另一種掛鉤:行動(dòng)器(Actions)。
在運(yùn)行查詢之前去插入:pre_get_posts
在查詢解釋之前,可以通過(guò)這個(gè)行動(dòng)器與其進(jìn)行一些交互(比如:插入一個(gè)附加的查詢變量)。讓我們看一個(gè)簡(jiǎn)單的例子,學(xué)習(xí)如何從主循環(huán)中排除分類。
<?php
function tutsplus_exclude_category( $wp_query ) {
/*
* Add the category to an array of excluded categories. In this case, though,
* it's really just one.
*/
$excluded = array( '-1' );
/*
* Note that this is a different, perhaps, cleaner way to write:
*
* $wp_query->set( 'category__not_in', $excluded );
*/
set_query_var( 'category__not_in', $excluded );
}
add_action( 'pre_get_posts', 'tutsplus_exclude_category' );
?>
查詢?cè)诮馕龅臅r(shí)候,進(jìn)行干預(yù):parse_query
不像pre_get_posts那樣,這個(gè)行動(dòng)器會(huì)在查詢?cè)O(shè)置查詢變量之前進(jìn)行干預(yù),parse_query行動(dòng)器會(huì)控制查詢變量設(shè)置之后的進(jìn)程。因此,當(dāng)需要去檢查當(dāng)前的變量,并需要一些附加的操作的時(shí)候,使用這個(gè)行動(dòng)器
修改文章對(duì)象:the_post
the_post 這個(gè)標(biāo)簽有一點(diǎn)點(diǎn)的讓人搞不清楚頭腦,因?yàn)檫@個(gè)名字其實(shí)是一個(gè)行動(dòng)器鉤子,是一個(gè)WP_Query相關(guān)函數(shù),也是一個(gè)WP_Query類的方法。
這個(gè)行動(dòng)器,按照文檔的說(shuō)法,可以在查詢和獲取結(jié)果之后,立即修改文章對(duì)象。使用這個(gè)行動(dòng)器,可以輕松的改變輸出結(jié)果。來(lái)看一個(gè)例子吧:
<?php
function tutsplus_featured_badge( $post ) {
if ( is_single() && in_category( 'featured' ) ) {
echo '<div class="featured-badge">' . __( 'FEATURED', 'tutsplus' ) . '</div>';
}
}
add_action( 'the_post', 'tutsplus_featured_badge' );
?>
第三部分完
過(guò)濾器和行動(dòng)器一直是一個(gè)很有趣的大有可談的部分(我可以從我的兩個(gè)系列 WordPress行動(dòng)器 和 WordPress過(guò)濾器 讀者的反饋看出來(lái))。希望大家能像我去享受談這個(gè)部分一樣,去喜歡這個(gè)部分的文章。
你想說(shuō)些什么嗎?請(qǐng)?jiān)谖恼孪路搅粞浴H绻阆矚g這篇文章,請(qǐng)分享吧!
在下一個(gè)部分,我們會(huì)談到WP_Query類的屬性和方法。
原文出自:http://code.tutsplus.com/tutorials/mastering-wp_query-actions-and-filters–cms-23112
由 癡空見(jiàn)觀@WordPress大學(xué) 原創(chuàng)翻譯,未經(jīng)允許,禁止轉(zhuǎn)載和采用本譯文。
您已閱讀完《掌握 WP_Query(共19篇)》專題的第 4 篇。請(qǐng)繼續(xù)閱讀該專題下面的文章:
- 5.掌握 WP_Query:WP_Query類的屬性和方法
- 6.WP_Query 參數(shù):文章、頁(yè)面和文章類型
- 7.WP_Query 參數(shù):分類和標(biāo)簽
- 8.WP_Query 參數(shù):分類法(Taxonomies)
- 9.WP_Query 參數(shù):自定義字段(Custom Fields)
- 10.WP_Query 參數(shù):日期
- 11.WP_Query 參數(shù):狀態(tài)、排序和分頁(yè)
- 12.WP_Query 參數(shù):作者、搜索、密碼、權(quán)限、緩存和返回字段
- 13.掌握 WP_Query:10個(gè)有用的例子
- 14.結(jié)合 WP_Query 與主查詢(the Main Query)
- 15.掌握 WP_User_Query
- 16.掌握 WP_Comment_Query
- 17.掌握 WP_Meta_Query 和 WP_Date_Query
- 18.WordPress 4.1的查詢改進(jìn)
- 19.掌握 WP_Query:結(jié)尾





