【问题标题】:Continuous Previous and Next Post Links in WordpressWordpress 中连续的上一篇和下一篇文章链接
【发布时间】:2016-03-03 07:16:15
【问题描述】:

我有一个页面,它显示了一个类别的帖子,底部有一个上一个和下一个帖子链接。我遇到的问题是,当它到达最后一个时,我想循环回到起点。如果您在第一个帖子上,它会一直运行到最后,如果您在最后一个帖子上,它不会回到开头,如果您在最后一个帖子上,它只会显示最后一个帖子。

到目前为止,这是我的代码:

<?php 
$prev_post = get_adjacent_post( true, '', true );
$next_post = get_adjacent_post( true, '', false );
$prev_post_id = $prev_post->ID;
$next_post_id = $next_post->ID;
?>

<?php if ($prev_post_id == '') {
$query = new WP_Query( array ( 'orderby' => 'ASC', 'posts_per_page' => '1', 'cat=4' ));

  while($query->have_posts()):
       $query->the_post();
       $prev_post_id = $query->post->ID;
  endwhile;
} ?>
<?php if ($next_post_id == '') {
  $query2 = new WP_Query( array ( 'orderby' => 'DESC', 'posts_per_page' => '1', 'cat=4'    ));
  while($query2->have_posts()):
       $query2->the_post();
       $next_post_id = $query2->post->ID;
  endwhile;
} ?>

<a href="<?php echo get_permalink($prev_post_id); ?>" class="prev-footer-item">
  <div class="prev-inner">
    <h3 class="gamma"><?php echo get_the_title($prev_post_id ); ?></h3>
    <h4 class="delta"><?php the_field('subtitle', $prev_post_id ); ?></h4>
    <div class="footer-overlay"></div>
  </div>
 </a>
<a href="<?php echo get_permalink($next_post_id); ?>" class="next-footer-item">
  <div class="next-inner">
    <h3 class="gamma"><?php echo get_the_title($next_post_id); ?></h3>
    <h4 class="delta"><?php the_field('subtitle', $next_post_id); ?></h4>
    <div class="footer-overlay"></div>
  </div>
</a>

我确定我错过了一些很明显的东西,对吧?

更新: 工作上一篇:

[request] => SELECT SQL_CALC_FOUND_ROWS  as1_posts.ID FROM as1_posts  WHERE 1=1  AND as1_posts.post_type = 'post' AND (as1_posts.post_status = 'publish' OR as1_posts.post_status = 'private')  ORDER BY as1_posts.post_date DESC LIMIT 0, 1

下一篇文章不工作:

[request] => SELECT SQL_CALC_FOUND_ROWS  as1_posts.ID FROM as1_posts  WHERE 1=1  AND as1_posts.post_type = 'post' AND (as1_posts.post_status = 'publish' OR as1_posts.post_status = 'private')  ORDER BY as1_posts.post_date DESC LIMIT 0, 1

【问题讨论】:

  • +1 用于发布您的代码 - 很多人不这样做!
  • 在那段代码中,'orderby' =&gt; 'ASC' 似乎没有意义?例如,'orderby' =&gt; 'title', 'order' =&gt; 'ASC'?

标签: wordpress-theming wordpress


【解决方案1】:

我看不到有什么东西在我身上跳出来,但是我在两个循环中都添加了 if 语句(以防止错误),在每个循环之后添加了 wp_reset_postdata(),并且不再需要$query$query2 - 如果您不希望将查询结果用于除此之外的任何内容,则可以将 $query 用于两者。

另一个想法 - 如果 Post ID 不存在,您确定 get_adjacent_post() 返回 '' 吗?例如,可以是null,还是'0'。可能值得做var_dump($next_post_id) 和检查。

编辑

我忘了提,get_adjacent_post() 假设相邻帖子的post_type 与您当前查看的帖子相同。虽然我不认为这是一个问题,正如你已经说过的那样,它可以反过来工作,但这是未来要记住的事情。

<?php
if($prev_post_id === '') :

    $query = new WP_Query(array('orderby' => 'ASC', 'posts_per_page' => '1', 'cat=4'));

    if($query->have_posts()) : while($query->have_posts()) :
        $query->the_post();
        $prev_post_id = get_the_ID();
        endwhile;
    endif;

    wp_reset_postdata();

endif;

if($next_post_id === '') :

    $query = new WP_Query(array('orderby' => 'DESC', 'posts_per_page' => '1', 'cat=4'));

    if($query->have_posts()) : while($query->have_posts()) :
            $query->the_post();
            $next_post_id = get_the_ID();
        endwhile;
    endif;

    wp_reset_postdata();

endif;
?>

【讨论】:

  • 干杯。我检查了 get_adjacent_post() 返回的内容,你是对的,它是 null。我已经更改了 if 语句来检查它,它仍然只返回您当前所在的帖子。但它仍然无法使用您的代码:( 是的,它是相同的帖子类型。
  • 好的,在$query = ...之后,放上echo '&lt;pre&gt;'; print_r($query); echo '&lt;/pre&gt;';。这将输出整个查询的结果,您可以准确地看到 WP 在做什么。查找[request],这是发送到 MySQL 的实际查询。这是寻找关于为什么没有结果的线索的好地方。
  • 好的,我已经拿到了请求数据。我不确定我应该从中推断出什么,但我确实注意到以前的帖子(工作)的查询比下一个帖子的查询短得多(不工作)。在原始帖子中更新。
  • 第二个想法,这是因为我尝试将'cat=4' 更改为'cat' =&gt; 4。它们是相等的,实际上是相同的字符串。
  • 奇怪!你会注意到声明 INNER JOIN 在不工作的那个 - 这是正确的,工作的那个只是抓住第一个帖子,不管 cat。好的,你能试试(在$query = ... 之后)这个 - $wpdb-&gt;last_result;$wpdb-&gt;last_error;。这将告诉您最新的查询结果和错误,以便您查看查询是否正常工作。
猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多