自定义插件中同分类文章Widget标题重复显示问题求助
问题解决:插件中Widget重复显示同一文章标题
嘿,我一眼就发现问题出在哪了——你把wp_reset_postdata()的位置放错了!
问题根源
在主题代码里,wp_reset_postdata()是放在整个foreach循环结束之后的,这才是正确的用法:它的作用是把全局$post变量恢复到循环之前的状态,避免影响后续的模板渲染。
但你在插件代码里,把wp_reset_postdata()写到了foreach循环的内部——也就是说,每次刚用setup_postdata($post)把全局$post换成当前循环的文章,立刻就调用wp_reset_postdata()把它恢复回去了。这就导致the_permalink()、the_title()这些依赖全局$post的模板标签,实际上拿到的还是重置后的原始全局文章数据,自然就会重复显示同一个标题了(哪怕你var_dump($post)看起来是对的,因为你打印的是循环里的局部$post变量,不是全局的)。
修正后的插件核心代码
// before and after widget arguments are defined by themes echo $args['before_widget']; if ( ! empty( $title ) ) echo $args['before_title'] . $title . $args['after_title']; // This is where you run the code and display the output if(have_posts()) { $Cate = get_queried_object(); $related = get_posts( array( 'category__in' => $Cate->term_id, 'numberposts' => 8, ) ); if( $related ) echo ' <p>Posts in the same category:</p>'; foreach( $related as $post ) { setup_postdata($post); ?> <li> <a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a> </li> <?php } wp_reset_postdata(); // 把这行移到foreach循环外面! }; echo $args['after_widget'];
额外优化建议
如果你想彻底避免全局变量带来的这类问题,还可以不用setup_postdata(),直接使用带参数的模板函数,比如get_the_permalink($post)和get_the_title($post),这样不需要修改全局$post,也不用调用wp_reset_postdata():
foreach( $related as $post ) { ?> <li> <a href="<?php echo get_the_permalink($post) ?>" rel="bookmark" title="<?php echo get_the_title($post); ?>"><?php echo get_the_title($post); ?></a> </li> <?php } // 这里不需要wp_reset_postdata()了
这种写法更安全,尤其在插件环境下,因为插件可能在各种不同的上下文被调用,减少全局变量的修改能避免很多潜在冲突。
内容的提问来源于stack exchange,提问作者Dương Công Toại
相关产品推荐
相关产品推荐

