当前位置: 首页 > 面试题库 >

应该避免使用query_posts()吗?

魏勇军
2023-03-14
问题内容

我读到query_posts()应该避免赞成wp_query()pre_get_posts()。我对弄乱Loop并没有信心,也没有完全理解Codex。

下面的代码是否使用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用户的价值和利益的考虑,这是从WPSE问题中复制的完整文章。出于兴趣的考虑,这里是WPSE完整文章的链接:有关主查询和自定义查询在此自定义主题中如何工作的一些疑问?

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

第一部分

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

  • 创建自定义内容滑块

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

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

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

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

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

何时使用主查询。

在上显示主要内容

  • 在您的主页上,并将该页面设置为后端中的博客页面

  • 所有存档页面,包括诸如archive.php,category.php,author.php,taxonomy.php,tag.php和date.php之类的模板

第二部分

要选择所有具有特色的帖子,我使用以下行来创建一个新的WP_Query对象,该对象定义具有具有特定标签特色的查询:

因此,据我了解,这不是WordPres主查询,而是由我创建的新查询。据我了解,最好是创建一个新查询(如已完成),并且当我要执行此类操作时不使用主查询

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

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

注意:
此功能并不旨在由插件或主题使用。如后面所述,有更好的,性能更高的选项可以更改主查询。query_posts()是通过将页面的主查询替换为新的查询实例来修改页面的主查询的过于简单和有问题的方式。它效率低下(重新运行SQL查询),并且在某些情况下(特别是在处理帖子分页时,通常会完全失败)。

继续

好的,继续,我显示所有没有featured标签的帖子,为此,我使用此代码段,相反,该代码段修改了主查询:

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

所以我认为这太可怕了。是真的吗

完全错误,您的陈述很遗憾是正确的。如前所述, 切勿
使用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 )));
?>

好的,一旦完成,您将看到来自feature标签的帖子使用主查询和默认循环显示在您的主页中。

从首页删除此标签的正确方法是使用pre_get_posts。这是
更改主查询 和应 始终 用于更改主内容循环的挂钩的 正确方法

因此,带有的代码pre_get_posts正确,这是您应该使用的功能。只是一件事,请务必检查您是否不在管理页面上,因为pre_get_posts这也会更改后端。因此,这是在functions.php中使用的正确代码,以删除首页中标记
为特色的 帖子

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

第三部分

额外的阅读材料将对将来有所帮助

  • 条件标签

  • 什么时候应该使用WP_Query vs query_posts()vs get_posts()?

  • 何时使用WP_query(),query_posts()和pre_get_posts

  • 查询总览

  • CMS的The Loop指南



 类似资料:
  • 问题内容: 今天,我有一个同事建议我重构代码,以使用label语句控制通过我创建的2个嵌套的for循环的流。我以前从未使用过它们,因为我个人认为它们会降低程序的可读性。如果论点足够扎实,我愿意改变使用它们的想法。人们对标签陈述有何看法? 问题答案: 如果您可以跳过两个循环(或一个包含switch语句的循环),则许多算法的表达会更容易。不要为此感到难过。另一方面,它可能表明解决方案过于复杂。因此,退

  • 问题内容: 有时是有用的,例如,如果我为网站上的所有链接(例如选择器)定义了通用样式,但是当我要覆盖某些规则时,可以有以下选择: 使用更具体(更长)的选择器 采用 哪种方法更好,可能有一些指导原则? 问题答案: 使用非常,非常谨慎- 它会覆盖刚才的一切,甚至是内联样式和混乱在低于显而易见的方式与样式规则“梯级”,让CSS的名字。它很容易使用不当,而且容易成倍增加,尤其是在滥用时。您可以轻松地得出一

  • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!

  • 问题内容: 我曾经在如下所示的接口中一起定义了一组相关的常量(如键): 这为我提供了一种更好的方式将相关常量分组在一起,并通过进行静态导入(而非实现)来使用它们。我知道框架也使用像一样的常量,。 但是,我经常感到,提供代表常数的更好,更强大的方法。 但是使用on 会有性能问题吗? 经过一番研究,我最终陷入了混乱。从这个问题中, 从Android的性能提示中删除了“避免枚举,您只需要整数吗?”很明显

  • 我曾在如下界面中定义一组相关常量,如

  • 问题内容: 我有一个容器,需要更改显示表单或显示成功页面的UI表单。 容器具有state.showSuccess,我需要MyFormModule才能调用容器以更改状态。 下面的代码有效,但出现以下警告: “ JSX道具不应该使用.bind()” 不使用.bind()怎么办? 问题答案: 您应该首先了解 为什么 这是一个不好的做法。 这里的主要原因是返回一个新的函数引用。 每次通话都会发生这种情况,