WordPress短码随机显示重复问题:单篇多次调用需无重复
解决WordPress短码单篇文章内多次调用不重复的问题
首先修正原函数的两个核心问题:
- 原函数使用
print_r返回内容是错误的,print_r会直接输出内容并返回布尔值,导致短码显示异常,应该直接返回HTML内容。 - 每次调用都重新生成数组并随机选择,没有跟踪已使用的项,导致重复。
以下是修改后的代码,实现单篇文章内多次调用[joke]短码时不显示重复内容:
function my_shortcode() { // 原始带链接的图片内容数组 $arr = array( '1' => '<a href="https://google.com"> <img src="img_1.jpg" /> </a>', '2' => '<a href="https://yahoo.com"> <img src="img_2.jpg" /></a>', '3' => '<a href="https://apple.com"> <img src="img_3.jpg" /></a>', '4' => '<a href="https://zdf.com"> <img src="img_4.jpg" /></a>', '5' => '<a href="https://air.com"> <img src="img_5.jpg" /></a>', '6' => '<a href="https://bing.com"> <img src="img_6.jpg" /></a>' ); // 从请求级缓存获取已使用过的内容key,仅当前文章请求有效 $used_keys = wp_cache_get('joke_shortcode_used_keys', 'shortcodes'); if (!$used_keys) { $used_keys = array(); } // 过滤掉已使用的项,得到剩余可选内容 $available_items = array_diff_key($arr, array_flip($used_keys)); // 没有剩余内容时返回空(可根据需求改成提示文本) if (empty($available_items)) { return ''; } // 随机选择一个未使用的项 $key = array_rand($available_items); // 将选中的key存入缓存,标记为已使用 $used_keys[] = $key; wp_cache_set('joke_shortcode_used_keys', $used_keys, 'shortcodes'); // 返回选中的HTML内容 return $available_items[$key]; } add_shortcode('joke', 'my_shortcode');
关键逻辑说明
- 请求级缓存跟踪已使用项:使用
wp_cache存储已选中的key,缓存仅在当前文章的请求周期内有效,不同文章的调用不会互相干扰,完美满足需求。 - 过滤可选内容:每次调用时通过
array_diff_key排除已使用的项,确保不会重复返回内容。 - 修正返回方式:直接返回HTML字符串,替代原函数错误的
print_r用法,保证短码正常渲染内容。
内容的提问来源于stack exchange,提问作者SubZer0
相关产品推荐
相关产品推荐

