如何实现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]
为什么这能解决你的问题?
- 标记不会丢失:你不需要手动写Schema的HTML,所有结构化标记都是短码自动生成的,编辑器只会识别短码本身,切换可视化/文本模式时不会破坏内容;
- 灵活编辑内容:短码内部的列表可以直接在可视化编辑器里编辑(比如添加项目符号、加粗、链接),编辑体验和普通内容完全一样;
- 安全可靠:代码里用了
wp_kses过滤用户输入的内容,避免XSS风险,同时用esc_html/esc_attr处理属性,符合WordPress的安全规范。
可选优化
- 如果需要支持更多Schema属性(比如
reviewBody外的其他字段),可以在$default_atts里添加对应的属性; - 可以给生成的HTML添加自定义CSS类,方便你样式化评论模块;
- 如果需要支持不同类型的富代码片段(比如Product、Recipe),只需要修改
itemtype和对应的Schema属性即可。
内容的提问来源于stack exchange,提问作者Polly McDoogle
相关产品推荐
相关产品推荐

