Прычыны і рашэнні праблемы, калі шорткоды раздзела каментарыяў WordPress не аналізуюцца

WordPress Увядзіце ў раздзел каментарыяў да артыкула [shortcode]Аднак, у выніку адлюстроўваецца толькі звычайны тэкст замест жаданага эфекту? Гэта насамрэч механізм WordPress па змаўчанні. Ніжэй я сістэматычна прааналізую прычыны і прадстаўлю поўнае рашэнне.

Чаму раздзел каментарыяў не падтрымлівае шорткоды?

  • Абмежаванні па змаўчанні
    З меркаванняў бяспекі WordPress не запускаецца аўтаматычна ў раздзеле каментарыяў. do_shortcode()Гэта не дазваляе карыстальнікам адвольна ўстаўляць формы, скрыпты або іншы кантэнт, які можа паўплываць на бяспеку сайта.

  • Абмежаваная сфера прымянення
    Гэта скарачэнне ў асноўным прызначана для выкарыстання ў змесце артыкула (the_contentГэта ўключае гаджэты або пэўныя плагіны, у той час як раздзел каментарыяў па змаўчанні не падтрымліваецца.

  • Аўтаматычнае ўмяшанне ў фарматаванне
    Тэкст каментара будзе wpautop Дадаць аўтаматычна <p><br> Тэгі, якія могуць парушаць сінтаксічную структуру шорткодаў, робячы іх немагчымымі для аналізу.

Прычыны і рашэнні праблемы, калі шорткоды раздзела каментарыяў WordPress не аналізуюцца

Апрацоўка...

Як уключыць падтрымку шорткодаў для каментарыяў?

  • Уключыць кароткія коды каментарыяў
    Па тэме functions.php Дадайце наступны код у свой файл або фрагмент кода плагіна:

    add_filter('comment_text', 'do_shortcode');
    

    Гэта прывядзе да таго, што ў раздзеле каментарыяў будуць выкарыстоўвацца шорткоды.

  • Праверце, ці актываваны плагін.
    Шмат шорткодаў ствараюцца з плагінаў (напрыклад, Contact Form 7 і WooCommerce). Калі плагін не ўключаны, шорткоды не будуць працаваць.

  • Пазбягайце сінтаксічных памылак
    Калі ласка, пераканайцеся, што скарачэнне напісана правільна, напрыклад:

    [shortcode attribute="value"]内容[/shortcode]
    
  • Праверце на наяўнасць канфліктаў тэм або плагінаў
    Пераключыцеся на тэму па змаўчанні (напрыклад, Twenty Twenty-Five), адключайце кожны плагін па чарзе, каб праверыць і пацвердзіць, ці ёсць якія-небудзь канфлікты, якія прыводзяць да няспраўнасці шорткода.

  • ачысціць кэш
    Пры выкарыстанні плагінаў кэшавання або CDN вам трэба ачысціць кэш пасля выпраўлення, каб убачыць эфект.

Код для бяспечнага ўключэння шорткодаў раздзела каментарыяў

Каб пазбегнуць рызык бяспекі, можна functions.php Дадайце наступны поўны прыклад:

<?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);

апісанне кода

  • Уключыць кароткія кодыПершы радок add_filter('comment_text', 'do_shortcode'); Уключыце падтрымку шорткодаў у раздзеле каментарыяў.
  • Абмежаваныя кароткія коды:пас $allowed_shortcodes Вызначэнні масіваў дазваляюць выкарыстоўваць скарачэнні, напрыклад gallery,audio,video,contact-form-7,su_posts.
  • Бяспека працыКалі карыстальнік увядзе шорткод, якога няма ў спісе дазволеных, код будзе аўтаматычна экранаваны ў звычайны тэкст, каб пазбегнуць выканання патэнцыйна небяспечных шорткодаў.

Найлепшыя практыкі

  • Дазволіць толькі неабходныя кароткія кодыНапрыклад, у медыяпрэзентацыях або формах пазбягайце выкарыстання занадта вялікай колькасці кароткіх кодаў.
  • Рэгулярна правярайце наяўнасць абнаўленняў плагінаўПераканайцеся, што плагін зыходнага кода шорткода бяспечны і надзейны.
  • Спалучэнне плагінаў кэшавання і абароныКаб пазбегнуць нагрузкі на прадукцыйнасць, выкліканай рэндэрынгам шорткодаў.

Дынамічна палепшаная версія: інтэрфейс налад бэкенда (пошук + групоўка + падказкі франтэнда)

Калі вам патрэбна большая гнуткасць, вы можаце выкарыстоўваць наступны палепшаны код:

  • Аўтаматычна пералічваць усе зарэгістраваныя шорткоды(У тым ліку тыя, што прадастаўляюцца плагінамі).
  • Падтрымлівае ўвод карыстальніцкіх кароткіх кодаў(如 ).
  • радок пошуку:хуткіПазіцыянаваннеСкарачэнне.
  • Групаваны дысплейГрупаванне па крыніцы плагіна робіць яго больш інтуітыўна зразумелым.
  • Дазволы роліБудуць разабраны толькі кароткія коды ў каментарах адміністратара; кароткія коды ў каментарах звычайных карыстальнікаў будуць адлюстроўваць паведамленне «Гэты кароткі код даступны толькі адміністратарам».
<?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);

总结

Раздзелы каментарыяў WordPress па змаўчанні не аналізуюць скарочаныя запісы з меркаванняў бяспекі і прадукцыйнасці. Замест гэтага вы можаце выкарыстоўваць [інструмент парсінгу]. functions.php Дадайце фільтр, каб уключыць шорткоды і аб'яднаць яго з бяспекай.

Блог Hope Chen Weiliang ( https://www.chenweiliang.com/ Артыкул «Прычыны і рашэнні праблем з парсінгам кароткіх кодаў у раздзеле каментарыяў WordPress», размешчаны тут, можа быць вам карысным.

Запрашаем падзяліцца спасылкай на гэты артыкул:https://www.chenweiliang.com/cwl-34132.html

Каб адкрыць больш схаваных хітрасцяў🔑, далучайцеся да нашага канала ў Telegram!

Падзяліцеся і пастаўце лайкі, калі вам гэта падабаецца! Вашы акцыі і лайкі - наша пастаянная матывацыя!

 

发表 评论

Ваш электронны адрас не будзе апублікаваны. 必填 项 已 用 * Этыкетка

Пракрутка да пачатку