สาเหตุและวิธีแก้ปัญหาที่ shortcode ในส่วนแสดงความคิดเห็นของ WordPress ไม่ได้รับการประมวลผล

WordPress แสดงความคิดเห็นในช่องแสดงความคิดเห็นของบทความ [shortcode]อย่างไรก็ตาม ผลลัพธ์ที่ได้กลับแสดงเพียงข้อความธรรมดา แทนที่จะแสดงผลตามที่ต้องการ? อันที่จริงแล้วนี่คือกลไกเริ่มต้นของ WordPress ด้านล่างนี้ ผมจะวิเคราะห์สาเหตุอย่างเป็นระบบและนำเสนอวิธีแก้ไขที่สมบูรณ์

ทำไมช่องแสดงความคิดเห็นถึงไม่รองรับชอร์ตโค้ด?

  • ข้อจำกัดเริ่มต้น
    ด้วยเหตุผลด้านความปลอดภัย WordPress จึงไม่ทำงานโดยอัตโนมัติในส่วนแสดงความคิดเห็น do_shortcode()วิธีนี้จะป้องกันไม่ให้ผู้ใช้แทรกแบบฟอร์ม สคริปต์ หรือเนื้อหาอื่น ๆ ที่อาจส่งผลกระทบต่อความปลอดภัยของเว็บไซต์โดยพลการ

  • ขอบเขตการใช้งานจำกัด
    คำย่อนี้ออกแบบมาเพื่อใช้ในเนื้อหาบทความเป็นหลัก (the_contentซึ่งรวมถึงอุปกรณ์เสริมหรือปลั๊กอินเฉพาะบางอย่าง ในขณะที่ส่วนแสดงความคิดเห็นนั้นไม่ได้รับการสนับสนุนโดยค่าเริ่มต้น

  • การรบกวนการจัดรูปแบบอัตโนมัติ
    ข้อความแสดงความคิดเห็นจะเป็นดังนี้ wpautop เพิ่มโดยอัตโนมัติ <p> และ <br> แท็กอาจทำลายโครงสร้างไวยากรณ์ของชอร์ตโค้ด ทำให้ไม่สามารถแยกวิเคราะห์ได้

สาเหตุและวิธีแก้ปัญหาที่ shortcode ในส่วนแสดงความคิดเห็นของ WordPress ไม่ได้รับการประมวลผล

กำลังประมวลผล...

ฉันจะเปิดใช้งานการรองรับชอร์ตโค้ดสำหรับความคิดเห็นได้อย่างไร?

  • เปิดใช้งานชอร์ตโค้ดสำหรับแสดงความคิดเห็น
    ในหัวข้อนี้ functions.php เพิ่มโค้ดต่อไปนี้ลงในไฟล์หรือปลั๊กอินโค้ดของคุณ:

    add_filter('comment_text', 'do_shortcode');
    

    การทำเช่นนี้จะทำให้ส่วนแสดงความคิดเห็นใช้ชอร์ตโค้ด

  • ตรวจสอบว่าปลั๊กอินเปิดใช้งานอยู่หรือไม่
    ชอร์ตโค้ดจำนวนมากมาจากปลั๊กอิน (เช่น Contact Form 7 และ WooCommerce) หากไม่ได้เปิดใช้งานปลั๊กอิน ชอร์ตโค้ดเหล่านั้นจะไม่ทำงาน

  • หลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์
    โปรดตรวจสอบให้แน่ใจว่าได้เขียนตัวย่อถูกต้องแล้ว ตัวอย่างเช่น:

    [shortcode attribute="value"]内容[/shortcode]
    
  • ตรวจสอบความขัดแย้งของธีมหรือปลั๊กอิน
    เปลี่ยนไปใช้ธีมเริ่มต้น (เช่น Twenty Twenty-Five) แล้วปิดใช้งานปลั๊กอินทีละตัวเพื่อทดสอบและตรวจสอบว่ามีข้อขัดแย้งใดที่ทำให้ชอร์ตโค้ดทำงานผิดปกติหรือไม่

  • ล้างแคช
    เมื่อใช้ปลั๊กอินแคชหรือ CDN คุณต้องล้างแคชหลังจากแก้ไขเสร็จแล้วจึงจะเห็นผลลัพธ์

โค้ดสำหรับเปิดใช้งาน shortcode ในส่วนแสดงความคิดเห็นอย่างปลอดภัย

เพื่อหลีกเลี่ยงความเสี่ยงด้านความปลอดภัย สามารถทำได้ดังนี้ 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 เพิ่มตัวกรองเพื่อเปิดใช้งานชอร์ตโค้ดและผสานรวมเข้ากับระบบรักษาความปลอดภัย

หวัง Chen Weiliang บล็อก ( https://www.chenweiliang.com/ บทความ "สาเหตุและวิธีแก้ปัญหาการวิเคราะห์ชอร์ตโค้ดในส่วนแสดงความคิดเห็นของ WordPress" ที่แชร์ไว้ที่นี่ อาจเป็นประโยชน์สำหรับคุณ

ยินดีต้อนรับสู่การแบ่งปันลิงค์ของบทความนี้:https://www.chenweiliang.com/cwl-34132.html

หากต้องการปลดล็อคเคล็ดลับที่ซ่อนอยู่เพิ่มเติม ยินดีต้อนรับเข้าร่วมช่อง Telegram ของเรา!

แชร์และกดไลค์ถ้าคุณชอบ! การแชร์และการถูกใจของคุณคือแรงบันดาลใจอย่างต่อเนื่องของเรา!

 

发表评论

ที่อยู่อีเมลของคุณจะไม่ถูกเผยแพร่ 必填项已用 * 标注

เลื่อนไปที่ด้านบน