You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress短码随机显示重复问题:单篇多次调用需无重复

解决WordPress短码单篇文章内多次调用不重复的问题

首先修正原函数的两个核心问题:

  1. 原函数使用print_r返回内容是错误的,print_r会直接输出内容并返回布尔值,导致短码显示异常,应该直接返回HTML内容。
  2. 每次调用都重新生成数组并随机选择,没有跟踪已使用的项,导致重复。

以下是修改后的代码,实现单篇文章内多次调用[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:22:35