当前位置:首页>WordPress建站>WordPress开发>掌握 WP_Query:行动器和过滤器

掌握 WP_Query:行动器和过滤器

文本是《掌握 WP_Query(共19篇)》专题的第 4 篇。阅读本文前,建议先阅读前面的文章:

欢迎来到掌握WP_Query系列的第三部分。在先前的部分,我们学习了wordpress的13个与WP_Query类相关的函数。在这个部分,我们将学习到与WP_Query相关的WordPress的钩子(行动器和过滤器)。

WP_Query相关的过滤器

在过滤器“官方参考”中,有16个与WP_Query相关的WordPress过滤器。在这个部分中,我们将要学习它们。这是个很简短的部分,因为所有的过滤器都是WP_Query类不同的数据库查询操作。

我们将会在之后学习数据库的一些查询操作。

过滤Query查询找到的文章数:found_posts

这个过滤器可以无限制的改变由WP_Query的posts_per_page变量而找到的项目数量。

这个过滤器可以用来创立用户自定义的页码。让我们看看官方文档怎么说:

例如,如果你想在查询中重新自定义值,通过$wp_query->found_posts 参数,WordPress不会修改这个定义值(就比如说,你有45篇可用的文章当你设置这个参考值为10篇,WordPress会忽略参考值,仍然会给你找到55篇文章。)

多读几遍,理解一下吧。

当Query查询去检索寻找文章的时候,过滤Query查询:found_posts_querys

查询结果是MySQL的 SELECT FOUND_ROWS() 命令计算出来的。这个过滤器可以去改变这个命令,当需要用一种不同的方式去计算查询项目的数量时候,这个过滤器非常的有用。

过滤整个SQL的Query查询:posts_request

如果需要改变整个SQL的query查询,这个过滤器是非常好的帮手,它可以很简单的重写整个由WP_Query类生成的SQL的query查询。

过滤由Query查询返回的结果:posts_results

如果需要改变由WP_Query的SQL语言产生的PHP的数组(这组数据:后称文章列表),可以使用posts_results这个过滤器。这里有一个官方的例子,可以看看它是怎么工作的。

检索文章列表的时候进行过滤:the_posts

不像posts_results,the_posts过滤器等到检索文章列表,即将操作检索的时候,进行过滤——意思是这个文章列表会被再次与未发表的和置顶的文章进行核对。使用这个过滤器的情景:当你不想在你的文章列表中出现未发表的文章的时候。

过滤Query查询的(SELECT子句)的查询范围:posts_fields

SQL中的SELECT子句会决定数据中的哪个表或者范围被选择,可以使用posts_fields过滤器来实现。

过滤查询的LIMIT子句:post_limits

SQL查询的LIMIT子句将限制查询,该过滤器可以帮助你过滤。

过滤查询的DISTINCT子句:posts_distinct

SQL查询的DISTINCT子句指出查询应该只返回不同的结果,而这种过滤器可以帮助你过滤。

当然,WP_Query不返回不同的结果,但是当你使用此过滤器,它会返回像“DISTINCT”功能的结果,查询将被调整为只返回不同的结果。

过滤查询的WHERE子句:posts_where

SQL查询中的WHERE子句是用来过滤MySQL的SELECT,INSERT,UPDATE或者DELETE状态的,这个过滤器可以实现过滤WHERE子句。当WP_Query类实现了所有所需要的过滤结果工作,依旧可以在WP_Query之前使用这个过滤器来实现过滤功能。

在计算分页之后,过滤查询的WHERE子句:posts_where_paged

这个过滤器其实就是posts_where过滤器的一个反复过程,可以用在分页查询中。

过滤搜索查询的WHERE子句:posts_search

另一种迭代的posts_where过滤器的方法——posts_search过滤器,可以用其来改变(用来获取WordPress的搜索结果)查询的WHERE子句。

过滤查询的JOIN子句:posts_join

查询的JOIN子句允许SQL语句在多个数据库表内的联合工作,该过滤器可以帮助你过滤JOIN子句。JOIN是MySQL的比较牛B的地方,除非你知道MySQL的JOIN工作原理,不然的话,我不建议使用这种过滤器。

当分页被计算,过滤查询的JOIN子句:posts_join_paged

就像posts_where_paged过滤器去迭代posts_where过滤器一样,posts_join_paged过滤器是当在进行分页查询时迭代psots_join过滤器。

过滤查询的OREDER BY子句:posts_orderby

ORDER BY子句是SQL查询用来对查询结果进行排序的,这个过滤器是用来过滤排序的。

过滤查询的GROUP BY子句:posts_groupby

Group BY子句使SQL查询返回一个数据库字段的“分组”结果,该过滤器可以帮助你过滤如何分组的结果。

过滤所有的查询子句:posts_clauses

如果想要在同一时间去处理所有的子句,这里有一个过滤器可以实现posts_clases。这个过滤器涵盖了WHERE,GROUP,BY,JOIN,ORDER BY,DISTINCT,SELECT和LIMITS子句。

WP_Query相关的行动器(Actions)

现在,我们已经学习了与WP_Query相关的过滤器,让我们继续学习另一种挂钩:行动器(Actions)。

在运行查询之前去插入:pre_get_posts

在查询解释之前,可以通过这个行动器与其进行一些交互(比如:插入一个附加的查询变量)。让我们看一个简单的例子,学习如何从主循环中排除分类。

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

查询在解析的时候,进行干预:parse_query

不像pre_get_posts那样,这个行动器会在查询设置查询变量之前进行干预,parse_query行动器会控制查询变量设置之后的进程。因此,当需要去检查当前的变量,并需要一些附加的操作的时候,使用这个行动器

修改文章对象:the_post

the_post 这个标签有一点点的让人搞不清楚头脑,因为这个名字其实是一个行动器钩子,是一个WP_Query相关函数,也是一个WP_Query类的方法。

这个行动器,按照文档的说法,可以在查询和获取结果之后,立即修改文章对象。使用这个行动器,可以轻松的改变输出结果。来看一个例子吧:

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

第三部分完

过滤器和行动器一直是一个很有趣的大有可谈的部分(我可以从我的两个系列 WordPress行动器WordPress过滤器 读者的反馈看出来)。希望大家能像我去享受谈这个部分一样,去喜欢这个部分的文章。

你想说些什么吗?请在文章下方留言。如果你喜欢这篇文章,请分享吧!

在下一个部分,我们会谈到WP_Query类的属性和方法。

原文出自:http://code.tutsplus.com/tutorials/mastering-wp_query-actions-and-filters–cms-23112

痴空见观@WordPress大学 原创翻译,未经允许,禁止转载和采用本译文。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
欢迎关注WordPress大学公众号 WPDAXUE
WordPress开发

掌握 WP_Query:相关的函数

2016-2-23 17:54:24

WordPress开发

掌握 WP_Query:WP_Query类的属性和方法

2016-2-28 8:56:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索