Have_Posts()执行失败

时间:2014-05-09 作者:NakedCat

我想创建一个循环,在搜索中显示搜索结果。php文件。

我遵循了WordPress Codex教程中的所有说明,该教程位于:

https://codex.wordpress.org/The_Loop

我在页面上实现了建议的代码,如下所示:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e(\'Sorry, no posts matched your criteria.\'); ?></p>
<?php endif; ?>
问题是else 条件触发(显示“抱歉,没有帖子符合您的条件。”)表明have_posts() 函数失败或未返回帖子,但我确信我在搜索框中键入的内容应该会返回大量结果。

IMPORTANT: 我知道很多人在这种情况下建议使用WP_Query 实例来获取搜索结果,这确实有效,但问题是我无法实现此建议。这是因为我还使用了一个搜索增强插件。它增强了搜索结果的相关性,并要求no 自定义(WP_Query) 调用,它只允许标准的循环调用。

这就是为什么我需要用have_posts().

Could anybody suggest me what might be the cause of have_posts() execution failiure?

整页代码如下:

<?php

get_header(); 
    the_post(); 
?>

<?php define(\'WP_USE_THEMES\', false); get_header(); ?>


    <div class="iecontent">
        <div class="g960">
            <div id="search">
                <div id="search-box">
                        <form action="<?php bloginfo( \'url\' ); ?>" method="get">
                        <div>

                            <input type="text" name="s" value="<?php echo get_search_query()?>"  placeholder="Search..."/>
                            <input type="submit" name="searchsubmit" value="" class="submit"/>

                        </div>
                        </form>
                </div>
                 <div id="search-results">
                    <div class="search-result">
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e(\'Sorry, no posts matched your criteria.\'); ?></p>
<?php endif; ?>

                </div>
                </div>
                                <?php wpbeginner_numeric_posts_nav(); ?>
                <div class="clearfix"></div>
            </div>
        </div>
    </div>

<?php get_footer(); ?>

2 个回复
SO网友:Tom J Nowell

你的问题是页面顶部的奇怪代码。为了了解发生了什么,让我用伪代码描述一个标准循环:

if we still have posts to process
    while we still have posts to process
        mark this post as processed and move to the next one
        do things with it ( like printing the title and contents
您所拥有的相当于:

mark the first post as processed
if we still have posts to process
    while we still have posts to process
        mark this post as processed and move to the next one
        do things with it ( like printing the title and contents
因此,如果您的搜索结果只返回一个结果,它将永远不会显示。

因此,我建议您这样做:

每当您看到类似的情况时,请删除标题中的hocus pocus:

<?php

get_header(); 
    the_post(); 
?>

<?php define(\'WP_USE_THEMES\', false); get_header(); ?>
我希望警铃开始响起来。那代码毫无意义,没有理由滥用WP_USE_THEMES 就像那样,它在主题中没有位置。the_post 只能在post循环内调用,而不能在外部调用get_header 两次都没有好处。调用一次,然后删除其余的。

我有一种强烈的感觉,您不理解代码的作用或工作原理。没关系,其他人也没有,把它拿走。每当你发现自己求助于这样的代码,或是胡乱摆弄一些东西,试图让这些东西发挥作用时,停下来,去研究一下基础知识。这会节省你的时间,让你头脑清醒。

缩进和php标记垃圾邮件有很多潜在问题,很容易发现,但隐藏在难以阅读的代码中

例如,这是一个不好的迹象,并且浪费你的时间来打印:

?>每个语句都应该在自己的行上,并且应该一致地缩进。您的posts循环是缺少缩进的一个主要示例。您的编辑器应该自动为您执行此操作,但如果不行,我建议您选择Sublimitext或PHPStorm之类的工具。还有很多其他人。

get_template_part

您对get\\u标题的滥用表明您将从如何使用的知识中受益匪浅get_template_part.

SO网友:s_ha_dum

我非常怀疑have_posts() 是故障点。该函数非常简单,基本上只是检查$wp_query 有尚未显示的post结果。

748   function have_posts() {
749           global $wp_query;
750   
751           return $wp_query->have_posts();
752   }

https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/query.php#L748

3520          function have_posts() {
3521                  if ( $this->current_post + 1 < $this->post_count ) {
3522                          return true;
3523                  } elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) {
                // truncated

https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/query.php#L3520

您在错误的位置查找问题。顶部奇怪的代码可能会导致这种情况,具体取决于所连接的对象get_header() 但更可能的问题是你的“搜索增强插件”。要让它像您所描述的那样工作,它必须改变主查询,我的猜测是,您没有得到任何搜索结果,而不是您所期望的“增强相关性”。您可以做两件事来验证:

禁用插件,查看默认搜索机制是否返回任何内容var_dump($wp_query->request,$wp_query->posts) 请手动分析SQL并检查结果,无需have_posts() 参与其中

结束

相关推荐

在unctions.php文件中链接Java脚本

下面是我从html模板中嵌入的原始javascript。但我不知道如何将其添加到我的函数中。php文件。这似乎很难。请您使用wp_enqueue_script 作用<script src=\"../assets/components/plugins/ajaxify/script.min.js?v=v1.9.6&sv=v0.0.1\"></script> <script>var App = {};</script>