【问题标题】:Second loop on Wordpress page not workingWordpress 页面上的第二个循环不起作用
【发布时间】:2020-09-14 19:39:13
【问题描述】:

免责声明:我正在尝试帮助某人将另一个部分添加到他们的 Wordpress 网站。这段代码大部分不是我写的。

我为每个 WP_Query 循环使用不同的自定义帖子类型。两个循环都可以自己正常工作,但是当我尝试在同一页面上运行它们时,第二个不会显示任何帖子。

我尝试过的事情:

  • wp_reset_query();
  • wp_reset_postdata();
  • 更改 $query 和 $args 的名称,使每个名称都是唯一的
  • 将重置函数移到 if() 内部(但仍在 while 循环之外)

我查看了我能找到的关于该主题的所有帖子并尝试了所有建议,但没有任何效果。当然我错过了一些东西。也许另一双眼睛可以帮助我找到问题。我已经在下面发布了相关代码。

/* ---- First Loop ---- */
<?php
    $args = array(
        'post_type'      => 'casestudies',
        'post_status'    => 'publish',
        'order'          => 'ASC',
        'posts_per_page' => -1
    );
                        
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) :
        while ( $query->have_posts() ) : 
            $query->the_post();

            /* ---- Do Stuff ---- */

        endwhile;               
    endif;
    wp_reset_query();
?>

/* ---- Second Loop ---- */
<?php
    $args = array(
        'post_type'      => 'whitepages',
        'post_status'    => 'publish',
        'order'          => 'ASC',
        'posts_per_page' => -1
    );
                        
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) :
        while ( $query->have_posts() ) : 
            $query->the_post();

            /* ---- Do Stuff ---- */    
                                
        endwhile;
    endif;
    wp_reset_query();
?>

编辑:

我在接受的答案的帮助下找到了解决方案。我在下面的另一个答案中发布了我为解决所有问题所做的工作。

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    刚刚在我的本地环境中尝试过这段代码,唯一的变化是$args 数组中的post_type 值,它似乎工作正常。

    我建议做的事情如下:

    1. 仔细检查post_type 的值是否与帖子类型的 slug 匹配。这可能只是一个拼写错误的情况,而且多年来我想承认的次数比我想承认的要多。
      您可以通过转到 functions.php 并查找 register_post_type 函数调用来找到它。
    2. 检查该帖子类型下是否确实有已发布的帖子。再说一次,这也是我被抓过几次的事情。

    此外,您可能需要考虑对代码进行一些整理,以防止可能遗漏某些内容并使其在将来更易于管理。
    循环一个可用的帖子类型数组,然后为每个可用的帖子类型构造一个WP_Query,这是我喜欢执行您所描述的任务的偏好,它看起来像这样:

    <?php
        $post_types       = array( 'yourposttype', 'yourotherposttype' );
        $common_arguments = array(
            'post_status'    => 'publish',
            'order'          => 'ASC',
            'posts_per_page' => -1,
        );
    ?>
    
    <?php foreach ( $post_types as $post_type ): ?>
        <?php
            $post_type_argument = array( 'post_type' => $post_type );
            $arguments          = array_merge( $common_arguments, $post_type_argument );
            $query              = new WP_Query( $arguments );
        ?>
    
        <?php if ( $query->have_posts() ): ?>
            <?php while ( $query->have_posts() ) : $query->the_post(); ?>
    
                <?php // Example output ?>
                <?php the_title(); ?>
    
            <?php endwhile; ?>
            <?php wp_reset_postdata(); ?>
        <?php endif; ?>
        
    <?php endforeach; ?>
    

    这样,如果您需要显示其他帖子类型,可以将其添加到 $post_types 数组中,而无需复制代码块。

    最后,当您使用wp_reset_postdata() 时,您是正确的,建议在循环自定义WP_Query 后运行该函数,wp_reset_query() 在这种情况下有点多余。
    You can read this answer by Stephen Harris for a bit more depth.

    【讨论】:

    • 感谢您的回复!这些循环中的每一个都位于页面的单独部分中,其他部分位于它们之间。每个都使用轮播容器来显示与自定义帖子类型匹配的帖子的卡片。你发布的东西会为此工作吗?好像我需要单独做,但我可能是错的。 post_type 名称是正确的,并且每个都有帖子(当它是页面上的第一个循环时,每个循环都可以正常工作),但它仍然不适合我。
    • 我明白了。因此,由于循环由 HTML 标记分隔,因此最好坚持使用问题中的代码,尽管我建议无论如何减少常见参数的重复。至于问题可能是什么,我唯一能想到的是两个循环之间有一些 PHP 不允许第二个循环运行。查看实际循环之后可能没有wp_reset_postdata() 的任何其他无关循环。还请查看我的答案中的链接,因为缺少 wp_reset_postdata 并不是唯一可以破坏模板的东西。
    • 好吧,我知道出了什么问题——这是与轮播 ID 相关联的 javascript 函数。它被重新用于两个轮播,这就是它没有出现的原因。我在新答案中发布了我所做的事情。我仍然会赞成您的回答,因为您在 WP_Query 方面帮助了我。再次感谢!
    【解决方案2】:

    我找到了解决办法!事实上,导致问题的不是 WP_Query() 循环,而是显示帖子的轮播。每个循环都将自定义帖子放入轮播中,并且我为页面上的每个轮播重复使用相同的 id。这与 JavaScript 不兼容。

    为了纠正这个问题,我在主 js 文件中复制了 JavaScript 函数,但将 #original-name 更改为 #other-name。我还将 carousel id 更改为 other-name。

    现在一切都按预期工作。感谢@tomekpryjma 帮助我确认我的循环看起来不错,这样我就可以停止关注这个问题。

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多