Adresář článků
在 WordPress Zadejte do sekce komentářů k článku [shortcode]Výsledek však zobrazuje pouze prostý text místo požadovaného efektu? To je ve skutečnosti výchozí mechanismus WordPressu. Níže systematicky analyzuji důvody a poskytnu kompletní řešení.
Proč sekce komentářů nepodporuje shortcodes?
Výchozí omezení
Z bezpečnostních důvodů se WordPress v sekci komentářů nespustí automaticky.do_shortcode()To zabraňuje uživatelům v libovolném vkládání formulářů, skriptů nebo jiného obsahu, který by mohl ovlivnit zabezpečení webu.Omezený rozsah použití
Zkratka je určena hlavně pro použití v obsahu článku (the_contentTo zahrnuje gadgety nebo specifické pluginy, zatímco sekce komentářů není ve výchozím nastavení podporována.Automatické rušení formátování
Text komentáře budewpautopPřidat automaticky<p>和<br>Tagy, které mohou narušit syntaktickou strukturu krátkých kódů, a učinit je tak neanalyzovatelnými.

Jak mohu povolit podporu krátkých kódů pro komentáře?
Povolit krátké kódy pro komentáře
K tématufunctions.phpPřidejte do souboru nebo pluginu pro úryvky kódu následující kód:add_filter('comment_text', 'do_shortcode');To způsobí, že sekce komentářů bude používat krátké kódy.
Zkontrolujte, zda je plugin aktivován.
Mnoho shortcodes pochází z pluginů (například Contact Form 7 a WooCommerce). Pokud plugin není povolen, shortcodes nebudou fungovat.Vyhněte se syntaktickým chybám
Prosím, potvrďte, že je zkratka napsána správně, například:[shortcode attribute="value"]内容[/shortcode]Kontrola konfliktů šablon nebo pluginů
Přepněte na výchozí šablonu (například Twenty Twenty-Five) a postupně deaktivujte jednotlivé pluginy, abyste otestovali a potvrdili, zda nedošlo k nějakým konfliktům, které by způsobovaly nefunkčnost shortcode.vyčistit mezipaměť
Při použití pluginů pro ukládání do mezipaměti nebo CDN je nutné po opravě vymazat mezipaměť, abyste viděli efekt.
Kód pro bezpečné povolení krátkých kódů v sekci komentářů
Aby se předešlo bezpečnostním rizikům, je možné functions.php Přidejte následující kompletní příklad:
<?php
// 在评论区启用简码解析
add_filter('comment_text', 'do_shortcode');
// 限制允许的简码列表
function safe_comment_shortcodes($content) {
// 定义允许的简码(加入 su_posts)
$allowed_shortcodes = array('gallery', 'audio', 'video', 'contact-form-7', 'su_posts');
// 遍历评论内容中的简码
return preg_replace_callback('/\[(\w+)([^\]]*)\]/', function($matches) use ($allowed_shortcodes) {
$shortcode = $matches[1];
// 如果简码在允许列表中,正常解析
if (in_array($shortcode, $allowed_shortcodes)) {
return do_shortcode($matches[0]);
}
// 否则直接输出原始文本,避免执行
return esc_html($matches[0]);
}, $content);
}
add_filter('comment_text', 'safe_comment_shortcodes', 9);
popis kódu
- Povolit krátké kódyPrvní řádek
add_filter('comment_text', 'do_shortcode');V sekci komentářů povolte podporu krátkých kódů. - Omezené krátké kódy:přihrávka
$allowed_shortcodesDefinice polí umožňují zkratky, napříkladgallery,audio,video,contact-form-7,su_posts. - Bezpečné zacházeníPokud uživatel zadá krátký kód, který není v seznamu povolených kódů, bude kód automaticky převeden do prostého textu, aby se zabránilo spuštění potenciálně nebezpečných krátkých kódů.
Nejlepší postupy
- Povolit pouze nezbytné krátké kódyNapříklad v mediálních prezentacích nebo formulářích se vyhněte používání příliš mnoha krátkých kódů.
- Pravidelně kontrolujte aktualizace pluginůUjistěte se, že plugin pro zdrojový kód shortcode je bezpečný a spolehlivý.
- Kombinace pluginů pro ukládání do mezipaměti a ochranuAby se zabránilo tlaku na výkon způsobenému vykreslováním shortcode.
Dynamicky vylepšená verze: Rozhraní nastavení backendu (vyhledávání + seskupování + tipy pro frontend)
Pokud chcete větší flexibilitu, můžete použít následující vylepšený kód:
- Automaticky zobrazit seznam všech registrovaných shortcodů(Včetně těch, které poskytují pluginy).
- Podporuje zadávání vlastních krátkých kódů(Jako
)。 - vyhledávací pole:rychlePolohováníZkratka.
- Seskupené zobrazeníSeskupování podle zdroje pluginu je intuitivnější.
- Oprávnění rolíAnalyzovány budou pouze krátké kódy v komentářích administrátorů; krátké kódy v komentářích běžných uživatelů zobrazí zprávu „Tento krátký kód je k dispozici pouze administrátorům“.
<?php
// 添加后台菜单
function cwl_shortcode_settings_menu() {
add_options_page(
'评论简码设置',
'评论简码设置',
'manage_options',
'cwl-shortcode-settings',
'cwl_shortcode_settings_page'
);
}
add_action('admin_menu', 'cwl_shortcode_settings_menu');
// 注册设置
function cwl_register_shortcode_settings() {
register_setting('cwl_shortcode_settings_group', 'cwl_allowed_shortcodes');
register_setting('cwl_shortcode_settings_group', 'cwl_custom_shortcodes');
}
add_action('admin_init', 'cwl_register_shortcode_settings');
// 设置页面内容
function cwl_shortcode_settings_page() {
global $shortcode_tags;
$allowed = get_option('cwl_allowed_shortcodes', array());
$custom = get_option('cwl_custom_shortcodes', array());
?>
<div class="wrap">
<h1>评论区简码设置</h1>
<form method="post" action="options.php">
<?php settings_fields('cwl_shortcode_settings_group'); ?>
<h2>搜索简码</h2>
<input type="text" id="cwl_shortcode_search" placeholder="输入简码关键字..." style="width:300px;">
<h2>已注册简码(按插件来源分组)</h2>
<p>勾选允许在评论区执行的简码:</p>
<div id="cwl_shortcode_list">
<?php
// 按插件来源分组
$groups = array();
foreach ($shortcode_tags as $tag => $callback) {
$source = is_array($callback) ? get_class($callback[0]) : (is_object($callback) ? get_class($callback) : '主题/未知来源');
$groups[$source][] = $tag;
}
foreach ($groups as $source => $tags) {
echo "<h3>" . esc_html($source) . "</h3>";
foreach ($tags as $tag) {
?>
<label class="cwl_shortcode_item">
<input type="checkbox" name="cwl_allowed_shortcodes[]" value="<?php echo esc_attr($tag); ?>" <?php checked(in_array($tag, $allowed)); ?>>
<?php echo esc_html($tag); ?>
</label><br>
<?php
}
}
?>
</div>
<h2>自定义简码</h2>
<p>输入额外允许的简码(用逗号分隔):</p>
<textarea name="cwl_custom_shortcodes" rows="3" cols="50"><?php echo esc_textarea(implode(',', (array)$custom)); ?></textarea>
<?php submit_button(); ?>
</form>
</div>
<script>
// 简码搜索功能
document.getElementById('cwl_shortcode_search').addEventListener('keyup', function() {
var keyword = this.value.toLowerCase();
document.querySelectorAll('.cwl_shortcode_item').forEach(function(item) {
var text = item.textContent.toLowerCase();
item.style.display = text.indexOf(keyword) > -1 ? '' : 'none';
});
});
</script>
<?php
}
// 评论区简码过滤(结合角色权限 + 前端提示)
function cwl_safe_comment_shortcodes($content) {
$allowed_shortcodes = get_option('cwl_allowed_shortcodes', array());
$custom_shortcodes = get_option('cwl_custom_shortcodes', array());
$allowed_shortcodes = array_merge($allowed_shortcodes, (array)$custom_shortcodes);
return preg_replace_callback('/\[(\w+)([^\]]*)\]/', function($matches) use ($allowed_shortcodes) {
$shortcode = $matches[1];
// 管理员可解析简码
if (current_user_can('manage_options')) {
if (in_array($shortcode, $allowed_shortcodes)) {
return do_shortcode($matches[0]);
}
return esc_html($matches[0]);
} else {
// 普通用户提示信息
if (in_array($shortcode, $allowed_shortcodes)) {
return '<span style="color:red;">此简码仅管理员可用</span>';
}
return esc_html($matches[0]);
}
}, $content);
}
add_filter('comment_text', 'cwl_safe_comment_shortcodes', 9);
总结
Sekce komentářů ve WordPressu ve výchozím nastavení neanalyzují zkrácené formáty z důvodů zabezpečení a výkonu. Místo toho můžete použít [nástroj pro analýzu]. functions.php Přidejte filtr pro povolení krátkých kódů a zkombinujte ho se zabezpečením.
Blog Hope Chen Weiliang ( https://www.chenweiliang.com/ Článek „Důvody a řešení problémů s parsováním krátkých kódů v sekci komentářů ve WordPressu“, který zde sdílíme, by vám mohl být užitečný.
Vítejte u sdílení odkazu na tento článek:https://www.chenweiliang.com/cwl-34132.html
