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-F​​iveなど)に切り替え、プラグインを1つずつ無効にして、ショートコードが正しく動作しない原因となる競合がないかどうかをテストして確認してください。

  • キャッシュの消去
    キャッシュプラグインや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 配列定義では省略形が使用できます。例: galleryaudiovideocontact-form-7su_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 チャンネルにぜひご参加ください。

気に入ったらシェアして「いいね!」してください!あなたのシェアと「いいね!」が私たちの継続的なモチベーションです。

 

发表评论

バグのあるボックスの内容は公開されません。 必須アイテム * 标注

上へスクロール