在WordPress主题开发中,使用get_posts()循环输出文章时,若未将当前文章对象显式传递给get_permalink()等函数,会导致所有链接指向同一篇文章。应手动传入循环中的文章对象,避免依赖全局$post变量。
在WordPress主题开发中,用get_posts()循环输出文章时,如果不小心把全局$post变量传给了get_permalink()这类函数,所有链接都会指向同一篇文章。本文就来聊聊如何修正这个变量引用的错误,并彻底避开类似的坑。
各位做WordPress主题开发的同行,应该都用过get_posts()吧?这函数确实好用,能帮你灵活地拉取一组自定义文章列表。但有一个坑,不得不提——这恰恰是很多新手甚至有些经验的开发者容易跌进去的地方。
当你用get_posts()获取了一批文章,并在循环中逐个渲染时,必须记住一个核心原则:所有依赖当前文章的模板函数(比如get_permalink()、get_the_post_thumbnail()、get_the_author()等等),都要显式地把循环中的当前文章对象传进去,而不是依赖那个全局的$post变量。否则,这些函数会默认去读主查询中全局$post的内容——通常是当前页面或文章——结果就是,你看到的链接、缩略图甚至作者信息,全都指向同一个东西,白忙活一场。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
看看你刚才贴出来的那段代码,问题出在哪儿?
6,
'meta_key' => 'post_views_count',
'orderby' => 'meta_value_num',
'order' => 'DESC'
));
foreach ($recent_posts as $post_item) : ?>
post_author;
// 正确:应该用 $post_item
$author_id = $post_item->post_author;
?>
你看,代码里用$post_item去取post_author是对的,但关键是传给get_permalink()和get_the_post_thumbnail()时,必须仍然是这个$post_item。如果写成了get_permalink($post),它就会去读全局$post,自然所有链接都一样了。
下面这几条值得你留意一下:
get_posts()返回的是一个WP_Post对象数组,它并不会自动设置全局$post,所以你不能偷懒省掉参数;get_permalink()、get_the_title()、get_the_excerpt()、get_post_meta()等——都需要老老实实传入$post_item;esc_url()包裹一下get_permalink()的结果,安全方面没坏处;posts_per_page这个参数要写成整数(比如6),千万别带什么不可见字符——比如你代码里那个6可能就藏了一个零宽空格,容易引发奇怪的bug;the_title()这类无参模板标签,也可以临时设置全局$post,用完后记得重置回来: global $post;
$original_post = $post;
foreach ($recent_posts as $post_item) {
$post = $post_item;
setup_postdata($post);
// 现在可以放心用 the_title(), the_permalink() 了
the_title();
the_permalink();
wp_reset_postdata(); // 恢复原始 $post
}
$post = $original_post;总而言之,要搞清楚数据来源:get_posts()这种手动循环,必须“显式传参”;只有主循环(比如while (ha ve_posts()))才依赖全局$post。养成一个习惯——写任何函数前,先翻翻它的签名,看看要不要传参数。这个小动作,能帮你省下不少排查重复链接、重复缩略图的工夫。说到底,这类逻辑陷阱,很多时候就是差那么一点点细心。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述