欢迎来到我们系列的第三部分“ Mastering WP_Query”。 在上一部分中,我们介绍了与WP_Query
类相关的13个WordPress函数。 在这一部分中,我们将回顾可与WP_Query
结合使用的WordPress挂钩(过滤器和操作)。
因此,事不宜迟,让我们开始吧!
WP_Query相关过滤器
在食典的“过滤器参考”中,标题“ WP_Query过滤器”下列出了16个WordPress过滤器。 在本节中,我们将讨论它们。 这将是一个相当快的部分,因为大多数过滤器都是关于WP_Query
类进行的数据库查询的不同“子句”。
在通过了与子句无关的过滤器之后,我们将立即与他们联系。
过滤查询的找到的帖子数: found_posts
使用此过滤器,可以更改找到的项目数,而不受WP_Query
的posts_per_page
参数的限制。
该过滤器对于创建自定义分页特别有用。 让我们看一下食典的内容 :
例如,如果您在查询中声明自定义偏移量值,则WordPress不会从$ wp_query-> found_posts参数中扣除偏移量(例如,如果偏移量为10后有45个可用帖子,则WordPress会忽略偏移量,仍将found_posts的值设为55)。
说得通。
筛选查询以运行以检索找到的帖子: found_posts_query
找到的项目数是使用MySQL中的SELECT FOUND_ROWS()
命令计算的。 如果需要以其他方式计算找到的项目数,则可以使用此过滤器将此命令更改为其他命令。
筛选整个SQL查询: posts_request
如果要更改完成的SQL查询,则应使用该过滤器。 它基本上会覆盖由WP_Query
类组成的整个SQL查询。
过滤查询返回的数组: posts_results
如果要更改WP_Query
随SQL查询生成的PHP array
,可以使用此过滤器。 Codex上有一个简洁的示例,因此您可以了解它的工作原理。
(请注意,此过滤器处理从SQL查询生成的原始数组。)
筛选检索到的帖子数组: the_posts
与posts_results
不同, the_posts
过滤器等待对该数组进行内部处理,这意味着将检查该数组是否包含未发布和粘性的帖子。 如果您不想在数组中发布或发布,请使用此选项。
过滤查询的字段列表(和SELECT
子句): posts_fields
SQL查询的SELECT
子句确定将从结果数据库行中选择哪些数据库字段,此过滤器帮助您过滤它。
过滤查询的LIMIT
子句: post_limits
SQL查询的LIMIT
子句设置查询的限制,此过滤器可帮助您过滤它。
过滤查询的DISTINCT
子句: posts_distinct
SQL查询的DISTINCT
子句指出查询应仅返回不同的结果,此过滤器可帮助您过滤它。 自然, WP_Query
不会返回不同的结果,但是当您将此过滤器与返回"DISTINCT"
的函数一起使用时,查询将被调整为仅返回不同的结果。
过滤查询的WHERE
子句: posts_where
SQL查询的WHERE
子句用于过滤MySQL的SELECT
, INSERT
, UPDATE
或DELETE
语句,此过滤器可帮助您过滤此过滤器。 尽管WP_Query
类完成了过滤结果所需的所有工作,但您可以通过使用此过滤器使它更进一步。
计算分页后过滤查询的WHERE
子句: posts_where_paged
该过滤器是posts_where
过滤器的迭代,可与分页查询一起使用。
过滤搜索查询的WHERE
子句: posts_search
这个过滤器是posts_where
过滤器的另一个迭代,您可以使用它来更改查询的WHERE
子句,该查询用于在WordPress中获取搜索结果。
过滤查询的JOIN
子句: posts_join
SQL查询的JOIN
子句允许您在多个数据库表中使用SQL命令,此过滤器有助于您对其进行过滤。 这是MySQL的高级部分之一,因此,除非您非常了解MySQL JOIN
的工作原理,否则不建议使用此过滤器。
计算分页后过滤查询的JOIN
子句: posts_join_paged
正如posts_where_paged
是一个迭代posts_where
,这是一个迭代的posts_join
过滤器,寻呼查询作品。
过滤查询的ORDER BY
子句: posts_orderby
SQL查询的ORDER BY
子句可安排查询的顺序,此过滤器可帮助您过滤顺序。
过滤查询的GROUP BY
子句: posts_groupby
SQL查询的GROUP BY
子句使查询按数据库字段返回“分组的”结果,此过滤器帮助您过滤如何对结果进行分组。
过滤查询的所有子句: posts_clauses
如果您想同时处理所有子句,那么也有一个过滤器: posts_clauses
。 此过滤器涵盖WHERE
, GROUP BY
, JOIN
, ORDER BY
, DISTINCT
, SELECT
和LIMITS
子句。
WP_Query相关动作
现在,我们已经审查了与WP_Query
相关的过滤器,让我们继续进行另一种挂钩:动作。
在运行查询之前对其进行干预: pre_get_posts
在解析查询之前,您可以使用此操作与其进行交互(例如,注入其他查询变量)。 让我们看一下汤姆·麦克法兰(Tom McFarlin)的一个简单示例,以学习如何从主循环中排除类别:
<?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
不同, pre_get_posts
在设置查询变量之前会干预查询,而parse_query
动作会在设置查询变量之后处理该过程。 因此,如果要检查当前变量并根据它们采取措施,则应使用此措施。
修改发布对象: the_post
术语the_action
有点令人困惑,因为它是动作挂钩,与WP_Query
相关的函数的名称,也是WP_Query
类的方法。
正如食品法典所述,此操作使我们可以在查询和设置后立即修改post对象。 使用此操作,您可以直接更改输出。 让我们看一个简单的例子:
<?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
类的属性和方法!
翻译自: https://code.tutsplus.com/tutorials/mastering-wp_query-actions-and-filters--cms-23112