如何避免wp_Query返回与我在搜索结果中相同的帖子?

时间:2021-02-13 作者:sackadelic

我对WP\\u Query返回我在结果中的同一帖子有问题。在我的帖子页面底部,我有以下代码:

//Displays 3 Recent Posts:

<section id="related-posts">
        <?php

        //Start Related Posts Logic

        $args = array(
            \'post_type\' => \'post\',
            \'posts_per_page\' => 3,
        );

        $chord_melody_blog_query = new WP_Query($args);
        
        $countBlog = 1;

        while ($chord_melody_blog_query->have_posts()) : $chord_melody_blog_query->the_post();
            $blogId = $post->ID;
            $thumbnail = \'post-thumb\';
            $get_featured_image_link = wp_get_attachment_image_src(get_post_thumbnail_id($blogId), $thumbnail, false, \'\');

//Echoes out the posts:
            echo \'<div class="related-post">
                    <a href="\' . get_permalink($blogId) . \'"><img src="\' . $get_featured_image_link[0] . \'"></a>
                    <div class="related-post-title">
                    <h5>\' . get_the_title() . \'</h5>
                    <a href="\' . get_permalink($blogId) . \'" role="link" title="Read Full Lesson">View Lesson</a>
                    </div>
                </div>
                \';
            $countBlog++;

        endwhile;

        wp_reset_postdata();

        ?>
问题是,如果我在最近的帖子上(我们称之为“关于胡萝卜的一切”),结果将是;“关于胡萝卜的一切”"E;最近发布的第二篇文章“"E;最近发布的第三篇文章;。

如何避免当前查看的帖子填充结果?

谢谢

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

有两种方法。超慢法和快速法

超慢方法这种方法很容易实现,但会给数据库带来巨大的负载,并可能导致严重的性能问题(以及严重减少可以同时访问站点的人数)。

这是post__not_in 论点I do not recommend using this. 我提到它只是为了完整性,因为不知道性能受到影响的人会推荐它。

为什么这么可怕

数据库查询是围绕着搜索你想要的而不是你不想要的内容构建的。

因此,如果在数据库级别排除posts,数据库有时会将整个posts表复制到内存中,删除要排除的行,然后执行查询。这是非常缓慢和昂贵的。

在我从事企业WordPress托管工作期间,我看到NOT IN 类型查询会使站点瘫痪,其方式可能是降低站点的运行速度,也可能是将站点的运行速度降低到无法使用的程度。移除它带来了巨大的改进。

危险在于,当在一个较小的测试站点上测试这些查询时,它们看起来并不慢,也不是很好,但还好。。。再加上多个用户同时访问该站点,会增加帖子和元表的大小,看起来不错的查询会增长到惊人的比例。

快速方法要求4篇帖子,然后过滤掉PHP中不需要的帖子。

This method is super fast.

例如:

$args = [
    \'posts_per_page\' => 4,
];

$q = new WP_Query($args);
$count = 0;
while ( $q->have_posts() ) {
    $q->the_post();
    if ( $excluded_id === get_ID() ) {
        continue;
    }
    $count += 1;
    if ( $count > 3 ) {
        break;
    }

    //  ......
}
请注意,如果我们已经显示了3篇帖子,或者如果我们显示的帖子被排除在外,那么我们将中断/继续。

最后一点注意,上述内容也适用于以__not_in, 他们的表现都很糟糕。另一个不适用于此用例的解决方案是使用数据来解决问题。例如,不是添加复选框以从主页隐藏帖子,而是添加一个名为show_on_homepage 这是默认添加的。

还要注意,while循环需要包装在if语句中,检查ifhave_posts 退货true. 如果没有,那么就有一个bug,如果没有找到帖子,那么wp_reset_postdata() 在没有要重置的post数据时调用,从而干扰任何周围的post循环。

问题中的代码也缺少转义,因此容易受到HTML注入攻击。

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post