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

如何实现WordPress短码支持自定义内部列表内容?

解决方案:支持内容包裹的WordPress闭包短码+自动生成富代码片段

当然可以搞定!你遇到的可视化编辑器丢标记的问题,核心原因是手动写的Schema HTML在编辑器切换时容易被过滤,而用**闭包短码(支持包裹内容的短码)**就能彻底解决——让短码自动帮你生成富代码片段的结构化标记,你只需要在短码里写列表内容就行,切换编辑器完全不会丢东西。

实现思路

普通短码是自闭合的(比如[ReviewMg title="Test"]),而闭包短码是成对的([ReviewMg]...[/ReviewMg]),短码的处理函数会接收包裹的内容作为参数,我们可以在函数里把用户输入的列表内容,自动包裹进富代码片段的Schema标记里,这样用户完全不用手动写复杂的HTML。

完整代码示例

把这段代码添加到你的主题functions.php文件里(或者自定义插件里更安全):

function review_mg_shortcode($atts, $content = null) {
    // 设置短码属性的默认值,可根据需求调整
    $default_atts = array(
        'title' => '默认评论标题',
        'rating' => '4.5', // 用于Schema的评分,满分5
        'author' => '匿名用户',
        'date' => date('Y-m-d') // 评论日期,默认当前日期
    );
    $atts = shortcode_atts($default_atts, $atts);

    // 处理用户输入的内部内容:允许嵌套短码,同时过滤不安全的HTML标签
    $allowed_tags = array(
        'li' => array(),
        'ul' => array(),
        'strong' => array(),
        'em' => array(),
        'a' => array(
            'href' => array(),
            'title' => array()
        )
    );
    $processed_content = wp_kses(do_shortcode($content), $allowed_tags);

    // 自动生成富代码片段(Schema.org Review类型)的结构化HTML
    $output = '<div class="review-mg-container" itemscope itemtype="https://schema.org/Review">';
    // 评论标题
    $output .= '<h3 itemprop="name">' . esc_html($atts['title']) . '</h3>';
    // 评分(隐藏的meta标签,用于搜索引擎识别)
    $output .= '<div itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">';
    $output .= '<meta itemprop="ratingValue" content="' . esc_attr($atts['rating']) . '">';
    $output .= '<meta itemprop="bestRating" content="5">';
    $output .= '</div>';
    // 评论者和日期
    $output .= '<p class="review-meta">';
    $output .= '<span itemprop="author">' . esc_html($atts['author']) . '</span>';
    $output .= ' | <time itemprop="datePublished" datetime="' . esc_attr($atts['date']) . '">' . esc_html($atts['date']) . '</time>';
    $output .= '</p>';
    // 评论内容(用户输入的列表)
    $output .= '<div itemprop="reviewBody">';
    // 自动判断用户是否已经写了<ul>,没有的话自动添加
    if (strpos($processed_content, '<ul') === false) {
        $output .= '<ul>' . $processed_content . '</ul>';
    } else {
        $output .= $processed_content;
    }
    $output .= '</div>';
    $output .= '</div>';

    return $output;
}
// 注册短码
add_shortcode('ReviewMg', 'review_mg_shortcode');

使用方法

你可以在编辑器里这样写短码,内部直接放列表内容就行:

[ReviewMg title="Test Product Review" rating="4.8" author="Polly" date="2024-05-20"]
<li>产品质量超出预期,材质很耐用</li>
<li><strong>包装很用心</strong>,完全没有破损</li>
<li>客服响应速度快,<a href="/support">解决问题很及时</a></li>
[/ReviewMg]

或者你也可以直接写完整的<ul>列表,短码会自动识别并保留格式:

[ReviewMg title="Test Review"]
<ul>
<li>第一点体验</li>
<li>第二点体验</li>
</ul>
[/ReviewMg]

为什么这能解决你的问题?

  1. 标记不会丢失:你不需要手动写Schema的HTML,所有结构化标记都是短码自动生成的,编辑器只会识别短码本身,切换可视化/文本模式时不会破坏内容;
  2. 灵活编辑内容:短码内部的列表可以直接在可视化编辑器里编辑(比如添加项目符号、加粗、链接),编辑体验和普通内容完全一样;
  3. 安全可靠:代码里用了wp_kses过滤用户输入的内容,避免XSS风险,同时用esc_html/esc_attr处理属性,符合WordPress的安全规范。

可选优化

  • 如果需要支持更多Schema属性(比如reviewBody外的其他字段),可以在$default_atts里添加对应的属性;
  • 可以给生成的HTML添加自定义CSS类,方便你样式化评论模块;
  • 如果需要支持不同类型的富代码片段(比如Product、Recipe),只需要修改itemtype和对应的Schema属性即可。

内容的提问来源于stack exchange,提问作者Polly McDoogle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:42:49