欢迎来到掌握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大学 原创翻译,未经允许,禁止转载和采用本译文。
来源:
https://www.wpdaxue.com/mastering-wp_query-actions-and-filters.html