欢迎光临
我们一直在努力

掌握 WP_Query:行动器和过滤器

建站超值云服务器,限时71元/月

本文目录
[隐藏]

  • 1WP_Query相关的过滤器
    • 1.1过滤Query查询找到的文章数:found_posts
    • 1.2当Query查询去检索寻找文章的时候,过滤Query查询:found_posts_querys
    • 1.3过滤整个SQL的Query查询:posts_request
    • 1.4过滤由Query查询返回的结果:posts_results
    • 1.5检索文章列表的时候进行过滤:the_posts
    • 1.6过滤Query查询的(SELECT子句)的查询范围:posts_fields
    • 1.7过滤查询的LIMIT子句:post_limits
    • 1.8过滤查询的DISTINCT子句:posts_distinct
    • 1.9过滤查询的WHERE子句:posts_where
    • 1.10在计算分页之后,过滤查询的WHERE子句:posts_where_paged
    • 1.11过滤搜索查询的WHERE子句:posts_search
    • 1.12过滤查询的JOIN子句:posts_join
    • 1.13当分页被计算,过滤查询的JOIN子句:posts_join_paged
    • 1.14过滤查询的OREDER BY子句:posts_orderby
    • 1.15过滤查询的GROUP BY子句:posts_groupby
    • 1.16过滤所有的查询子句:posts_clauses
  • 2WP_Query相关的行动器(Actions)
    • 2.1在运行查询之前去插入:pre_get_posts
    • 2.2查询在解析的时候,进行干预:parse_query
    • 2.3修改文章对象:the_post
  • 3第三部分完

本文是《掌握 WP_Query》系列教程的第 4 部分,该系列共包含以下 19 个部分:

  1. 掌握 WP_Query : 入门介绍
  2. 掌握 WP_Query:教你使用Loop循环
  3. 掌握 WP_Query:相关的函数
  4. 掌握 WP_Query:行动器和过滤器
  5. 掌握 WP_Query:WP_Query类的属性和方法
  6. WP_Query 参数:文章、页面和文章类型
  7. WP_Query 参数:分类和标签
  8. WP_Query 参数:分类法(Taxonomies)
  9. WP_Query 参数:自定义字段(Custom Fields)
  10. WP_Query 参数:日期
  11. WP_Query 参数:状态、排序和分页
  12. WP_Query 参数:作者、搜索、密码、权限、缓存和返回字段
  13. 掌握 WP_Query:10个有用的例子
  14. 结合 WP_Query 与主查询(the Main Query)
  15. 掌握 WP_User_Query
  16. 掌握 WP_Comment_Query
  17. 掌握 WP_Meta_Query 和 WP_Date_Query
  18. WordPress 4.1的查询改进
  19. 掌握 WP_Query:结尾

欢迎来到掌握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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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' );
 
?>

<?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类的方法。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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' )
 

<?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类的属性和方法。

阅读该系列的其他文章: 上一篇:掌握 WP_Query:相关的函数 下一篇:掌握 WP_Query:WP_Query类的属性和方法

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 掌握 WP_Query:行动器和过滤器
分享到: 更多 (0)