WordPress şərh bölməsi qısa kodlarının təhlil edilməməsinin səbəbləri və həlləri

WordPress Məqalənin şərh bölməsinə daxil olun [shortcode]Lakin nəticə istənilən effekt əvəzinə yalnız düz mətni göstərir? Əslində bu, WordPress-in standart mexanizmidir. Aşağıda səbəbləri sistematik şəkildə təhlil edib tam bir həll yolu təqdim edəcəyəm.

Niyə şərh bölməsi qısa kodları dəstəkləmir?

  • Standart məhdudiyyətlər
    Təhlükəsizlik səbəblərinə görə, WordPress şərhlər bölməsində avtomatik olaraq işləmir. do_shortcode()Bu, istifadəçilərin sayt təhlükəsizliyinə təsir göstərə biləcək formalar, skriptlər və ya digər məzmunu özbaşına daxil etməsinin qarşısını alır.

  • Məhdud tətbiq dairəsi
    Qısaltma əsasən məqalə məzmununda istifadə üçün nəzərdə tutulub (the_contentBuraya qadcetlər və ya xüsusi plaginlər daxildir, şərh bölməsi isə standart olaraq dəstəklənmir.

  • Avtomatik formatlama müdaxiləsi
    Şərh mətni olacaq wpautop Avtomatik əlavə edin <p><br> Etiketlər, qısa kodların sintaksis strukturunu poza bilər və onları təhlil edilə bilməyən hala gətirə bilər.

WordPress şərh bölməsi qısa kodlarının təhlil edilməməsinin səbəbləri və həlləri

İşlənir...

Şərhlər üçün qısa kod dəstəyini necə aktivləşdirə bilərəm?

  • Şərh qısa kodlarını aktivləşdirin
    Mövzu ilə bağlı functions.php Aşağıdakı kodu faylınıza və ya kod parçası plagininə əlavə edin:

    add_filter('comment_text', 'do_shortcode');
    

    Bu, şərhlər bölməsinin qısa kodlardan istifadə etməsinə səbəb olacaq.

  • Pluginin aktiv olub olmadığını yoxlayın.
    Bir çox qısa kod plaginlərdən (məsələn, Əlaqə Forması 7 və WooCommerce) gəlir. Plagin aktiv deyilsə, qısa kodlar işləməyəcəkdir.

  • Sintaksis səhvlərindən qaçın
    Zəhmət olmasa, ixtisarın düzgün yazıldığını təsdiqləyin, məsələn:

    [shortcode attribute="value"]内容[/shortcode]
    
  • Mövzu və ya plagin ziddiyyətlərini yoxlayın
    Standart mövzuya (məsələn, İyirmi İyirmi Beş) keçin, qısa kodun nasazlığına səbəb olan hər hansı bir münaqişənin olub olmadığını yoxlamaq və təsdiqləmək üçün hər bir plagini bir-bir deaktiv edin.

  • keşi təmizləmək
    Keşləmə plaginlərindən və ya CDN-lərindən istifadə edərkən, təsirini görmək üçün düzəlişdən sonra keşi təmizləməlisiniz.

Şərh bölməsinin qısa kodlarını təhlükəsiz şəkildə aktivləşdirmək üçün kod

Təhlükəsizlik risklərinin qarşısını almaq üçün mümkündür functions.php Aşağıdakı tam nümunəni əlavə edin:

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

kodun təsviri

  • Qısa kodları aktivləşdirinBirinci sətir add_filter('comment_text', 'do_shortcode'); Şərhlər bölməsində qısa kod dəstəyini aktivləşdirin.
  • Məhdudlaşdırılmış qısa kodlar:keçir $allowed_shortcodes Məsələn, massiv tərifləri ixtisarlara icazə verir gallery,audio,video,contact-form-7,su_posts.
  • Təhlükəsizliklə idarəetməİstifadəçi icazə verilən siyahıda olmayan bir qısa kod daxil edərsə, potensial təhlükəli qısa kodların icrasının qarşısını almaq üçün kod avtomatik olaraq düz mətnə ​​​​keçiriləcək.

最佳实践

  • Yalnız zəruri qısa kodlara icazə verinMəsələn, media təqdimatlarında və ya formalarında çoxlu qısa kod istifadə etməkdən çəkinin.
  • Plugin yeniləmələrini mütəmadi olaraq yoxlayınQısa kod mənbə plagininin təhlükəsiz və etibarlı olduğundan əmin olun.
  • Keshləmə və qoruma plaginlərinin birləşdirilməsiQısa kod göstərilməsinin yaratdığı performans təzyiqinin qarşısını almaq üçün.

Dinamik olaraq Təkmilləşdirilmiş Versiya: Arxa Plan Parametrləri İnterfeysi (Axtarış + Qruplaşdırma + Ön Plan Göstərişləri)

Daha çox rahatlıq istəyirsinizsə, aşağıdakı təkmilləşdirilmiş koddan istifadə edə bilərsiniz:

  • Bütün qeydiyyatdan keçmiş qısa kodları avtomatik olaraq siyahıya alın(Pluginlər tərəfindən təmin edilənlər də daxil olmaqla).
  • Xüsusi qısa kodların daxil edilməsini dəstəkləyir(Kimi )。
  • axtarış qutusu:sürətliYerləşdirməQısaltma.
  • Qruplaşdırılmış displeyPlugin mənbəyinə görə qruplaşdırma onu daha intuitiv edir.
  • Rol İcazələriYalnız administrator şərhlərindəki qısa kodlar təhlil ediləcək; adi istifadəçi şərhlərindəki qısa kodlar "Bu qısa kod yalnız administratorlar üçün əlçatandır" mesajını göstərəcək.
<?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);

cəmləşdirmək

WordPress şərh bölmələri təhlükəsizlik və performans səbəblərinə görə standart olaraq qısaltmalar təhlil etmir. Bunun əvəzinə [təhlil alətindən] istifadə edə bilərsiniz. functions.php Qısa kodları aktivləşdirmək və təhlükəsizliklə birləşdirmək üçün bir filtr əlavə edin.

发表 评论

E-poçt ünvanınız dərc olunmayacaq. Zəruri sahələrdən istifadə olunur * Etiket

Top gedin