我需要通过帖子显示档案列表。我使用以下代码创建了插件:
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]
时,我会得到列表,但每个项目都显示当前页面标题和自己的链接。
知道如何做到这一点吗?
答案 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
。