當(dāng)前位置:首頁(yè)>WordPress建站>WordPress開發(fā)>掌握 WP_Query:行動(dòng)器和過(guò)濾器

掌握 WP_Query:行動(dòng)器和過(guò)濾器

歡迎來(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)載和采用本譯文。

聲明:本站所有文章,如無(wú)特殊說(shuō)明或標(biāo)注,均為本站原創(chuàng)發(fā)布。任何個(gè)人或組織,在未征得本站同意時(shí),禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書籍等各類媒體平臺(tái)。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。

給TA打賞
共{{data.count}}人
人已打賞
歡迎關(guān)注WordPress大學(xué)公眾號(hào) WPDAXUE
WordPress開發(fā)

掌握 WP_Query:相關(guān)的函數(shù)

2016-2-23 17:54:24

WordPress開發(fā)

掌握 WP_Query:WP_Query類的屬性和方法

2016-2-28 8:56:12

0 條回復(fù) A文章作者 M管理員
    暫無(wú)討論,說(shuō)說(shuō)你的看法吧
?
個(gè)人中心
購(gòu)物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

河津市| 阿尔山市| 师宗县| 绥棱县| 农安县| 万宁市| 绍兴县| 神池县| 塔城市| 铜梁县| 天水市| 阳信县| 都江堰市| 延庆县| 开化县| 铜鼓县| 团风县| 万宁市| 武冈市| 陕西省| 措美县| 皋兰县| 小金县| 区。| 博野县| 嵊州市| 漳州市| 新田县| 柳州市| 东方市| 凤台县| 乌拉特中旗| 河间市| 香港 | 江门市| 尼勒克县| 翁源县| 高安市| 广灵县| 延长县| 香河县|