gpt4 book ai didi

php - query_posts() 应该避免吗?

转载 作者:可可西里 更新时间:2023-11-01 00:43:55 25 4
gpt4 key购买 nike

我读到应该避免使用 query_posts(),而使用 wp_query()pre_get_posts()。我对弄乱循环没有信心,也不完全理解法典。

下面的代码是否使用了 query_posts() ?如果是,并且由于应避免使用 query_posts(),您能否建议一种不使用 query_posts() 但仍能完成相同事情的方法?

functions.php 中的这段代码用于按随机或按价格对帖子进行排序。

function my_custom_query($query){
if ( $query->is_home() && $query->is_main_query() ) {

$sort= $_GET['sort'];

if($sort == "pricelow"){
$query->set( 'meta_key', 'price' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
}

if($sort == "random"){
$query->set( 'orderby', 'rand' );
}

}
}
add_action( 'pre_get_posts', 'my_custom_query' );

.
使用此代码将链接 A(随机)和链接 B(价格)发布在我的菜单中。因此,网站访问者只需单击链接即可对帖子进行排序。

<a href="http://website.com/?sort=A">Random</a>
<a href="http://website.com/?sort=B">Price</a>

最佳答案

我已经在 WPSE 上对这个主题做了非常详细的解释,为了它可能对 SO 用户具有的值(value)和好处,这里是从 WPSE 上的那个问题复制的完整帖子。为了感兴趣,这里是 WPSE 上完整帖子的链接:Some doubts about how the main query and the custom query works in this custom theme?

您的实际问题基本上是何时运行自定义查询以及何时使用主查询。让我们把它分成三个部分

第一部分

何时运行自定义查询(这不是最终列表)

  • 创建自定义内容 slider

  • 在页面中创建特色内容区域

  • 如果您需要显示帖子,请在 page.php 模板上

  • 如果您需要在静态首页上显示自定义内容

  • 显示相关的、热门的或信息性的帖子

  • 主查询范围之外的任何其他次要或补充内容

何时使用主查询。

显示主要内容

  • 在您的主页和后台设置为博客页面的页面

  • 所有存档页面,包括 archive.php、category.php、author.php、taxonomy.php、tag.php 和 date.php 等模板

第二部分

To select all the featured posts I use this line that create a new WP_Query object that define a query having the specific tag featured:

So, from what I have understand, this is not the WordPres main query but it is a new query created by me. From what I have understand it is better create a new query (as done) and not use the main query when I want perform this kind of operations

正确。这超出了主查询的范围。这是无法使用主查询创建的次要或补充内容。您应该始终使用 WP_Queryget_posts创建您的自定义查询。

切勿使用 query_posts创建自定义查询,甚至任何其他查询。我的重点。

Note: This function isn't meant to be used by plugins or themes. As explained later, there are better, more performant options to alter the main query. query_posts() is overly simplistic and problematic way to modify main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination).

继续前进

Ok, going on I show all the posts that have not the featured tag, to do this I use this code snippet that on the contrary modify the main query:

query_posts( array( 'tag__not_in' => array ( $term->term_id )));

So I think that this is pretty horrible. Is it true?

那都是错误的,不幸的是你的说法是正确的。如前所述,从不使用query_posts。它运行一个全新的查询,这对性能不利,并且在大多数情况下它会破坏分页,而分页是使分页正常工作的主要查询的组成部分。

这是您的主要内容,因此您应该使用带有默认循环的主查询,它应该如下所示,这就是您所需要的

<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part('content', get_post_format());

endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');

endif;
?>

你完全可以去掉这部分,删掉,烧掉,忘掉

<?
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

好的,完成后,您会看到来自功能标签的帖子使用主查询和默认循环出现在您的主页中。

从主页删除此标签的正确方法是使用 pre_get_posts .这是更改主查询的正确方法,也是您应该始终用来更改主要内容循环的 Hook 。

因此,带有 pre_get_posts 的代码是正确的,这就是您应该使用的功能。只有一件事,请始终检查您是否在管理页面上,因为 pre_get_posts 也会更改后端。所以这是在 functions.php 中使用的正确代码,用于从主页中删除标记为 featured 的帖子

function exclude_featured_tag( $query ) {
if ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
$query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
}
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );

第三部分

额外的阅读 Material ,对以后有帮助

关于php - query_posts() 应该避免吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25587009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com