循环中的the_permalink给出了相同的结果

时间:2016-03-14 21:18:19

标签: php wordpress wordpress-plugin

我需要通过帖子显示档案列表。我使用以下代码创建了插件:

function posts_by_year() {
  // array to use for results
  $years = array();

  // get posts from WP
  $posts = get_posts(array(
    'numberposts' => -1,
    'orderby' => 'post_date',
    'order' => 'ASC',
    'post_type' => 'post',
    'post_status' => 'publish'
  ));

  // loop through posts, populating $years arrays
  foreach($posts as $post) {
    $years[date('Y', strtotime($post->post_date))][] = $post;
  }

  // reverse sort by year
  krsort($years);

  return $years;
}
?>

<?php function wyswietl_archiwum (){ ob_start(); ?>

<?php foreach(posts_by_year() as $year => $posts) : ?>
  <h2><?php echo $year; ?></h2>
  <ul>
    <?php foreach($posts as $post) : setup_postdata($post); ?>
      <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      </li>
    <?php endforeach; ?>
  </ul>
<?php endforeach; ?>
<?php
    return ob_get_clean();
} ?>

<?php add_shortcode( 'archiwum', 'wyswietl_archiwum' );

当我在任何页面上放置短代码[archiwum]时,我会得到列表,但每个项目都显示当前页面标题和自己的链接。

截图: screenshot

知道如何做到这一点吗?

1 个答案:

答案 0 :(得分:0)

the_permalink()the_title()(及类似函数)使用全局$post变量来确定要显示的帖子。由于您的foreach循环位于函数中,因此除了调用setup_postdata($post)之外,您还需要更新全局$post变量。

documentation详细说明了这一点:

  

setup_postdata()不会分配全局$ post变量,因此您自己执行此操作非常重要。如果不这样做,将导致任何使用上述全局变量和$ post全局变量的钩子出现问题,因为它们将引用单独的实体。

最简单的方法是在global $post;函数的顶部添加wyswietl_archiwum。或者,您可以在$GLOBALS["post"] = $post;循环中执行foreach