<pre><code></code></pre>内にコピーボタンを設置する方法

今回は、<pre><code> で囲まれたコードにコピー用ボタンを設置する方法を解説します。右上・左上・下など、ボタンの位置も CSS で自由に変更可能です。

1 実装のポイント

  • functions.php にコピー用の JavaScript を追加
  • CSS でボタン位置を指定
  • 記事内の <pre><code> が自動的に対象になる

2 functions.php にコードを追加


// ------------------------------
// コピー用ボタン(右上+左下)
// ------------------------------
function add_copy_code_script_with_footer_and_header() {
    ?>
    <script>
    document.addEventListener('DOMContentLoaded', function() {
        document.querySelectorAll('pre > code').forEach(function(codeBlock) {
            const pre = codeBlock.parentNode;

            // 既にラップ済みならスキップ
            if (pre.parentNode.classList.contains('code-box')) return;

            // ラッパー作成
            const wrapper = document.createElement('div');
            wrapper.className = 'code-box';

            // ヘッダー(右上ボタン)
            const header = document.createElement('div');
            header.className = 'code-header';
            const btnHeader = document.createElement('button');
            btnHeader.className = 'copy-code-button';
            btnHeader.type = 'button';
            btnHeader.innerText = 'コピーする';
            btnHeader.addEventListener('click', function() {
                navigator.clipboard.writeText(codeBlock.innerText).then(() => {
                    btnHeader.innerText = 'コピーしました';
                    setTimeout(() => btnHeader.innerText = 'コピーする', 2000);
                }).catch(() => btnHeader.innerText = 'コピー失敗');
            });
            header.appendChild(btnHeader);

            // フッター(左下ボタン)
            const footer = document.createElement('div');
            footer.className = 'code-footer';
            const btnFooter = document.createElement('button');
            btnFooter.className = 'copy-code-button';
            btnFooter.type = 'button';
            btnFooter.innerText = 'コピーする';
            btnFooter.addEventListener('click', function() {
                navigator.clipboard.writeText(codeBlock.innerText).then(() => {
                    btnFooter.innerText = 'コピーしました';
                    setTimeout(() => btnFooter.innerText = 'コピーする', 2000);
                }).catch(() => btnFooter.innerText = 'コピー失敗');
            });
            footer.appendChild(btnFooter);

            // pre をラップ
            const parent = pre.parentNode;
            parent.insertBefore(wrapper, pre);
            wrapper.appendChild(header);
            wrapper.appendChild(pre);
            wrapper.appendChild(footer);
        });
    });
    </script>
    <?php
}
add_action('wp_footer', 'add_copy_code_script_with_footer_and_header');

  
補足:
このコードを追加すると、記事内のすべての <pre><code> に自動でコピー用ボタンが追加されます。

3 汎用CSS


/* ------------------------- 
 * コピー用ボタン設置
 * ------------------------- */

/* コード全体を囲むボックス */
.code-box {
    border: 1px solid #ccc;          /* 薄いグレーの枠線 */
    border-radius: 5px;              /* 角を丸くする */
    margin: 1em 0;                   /* 上下に余白を設定 */
    background-color: #f9f9f9;       /* 薄いグレー背景 */
    overflow: hidden;                /* はみ出した部分を隠す */
}

/* コード上部のヘッダー部分(ボタンなど配置用) */
.code-header {
    background-color: #fff;          /* 白背景 */
    padding: 5px 10px;               /* 上下5px、左右10pxの余白 */
    display: flex;                    /* フレックスで配置 */
    justify-content: flex-end;        /* 右端に配置 */
    align-items: center;              /* 縦方向中央揃え */
    border-bottom: 1px solid #ddd;    /* 下境界線 */
}

/* コード下部のフッター部分(補足や左端に配置用) */
.code-footer {
    background-color: #fff;          /* 白背景 */
    padding: 5px 10px;               /* 上下5px、左右10pxの余白 */
    display: flex;                    /* フレックスで配置 */
    justify-content: flex-start;      /* 左端に配置 */
    border-top: 1px solid #ddd;       /* 上境界線 */
}

/* コピー用ボタン */
.copy-code-button {
    padding: 3px 6px;                /* 上下3px、左右6pxの余白 */
    font-size: 12px;                 /* 文字サイズ12px */
    cursor: pointer;                 /* ホバー時は手の形カーソル */
    background-color: #0073aa;       /* 青系背景色 */
    color: #fff;                     /* 文字色は白 */
    border: none;                    /* 枠線なし */
    border-radius: 3px;              /* 角丸 */
}

/* コピー用ボタン ホバー時 */
.copy-code-button:hover {
    background-color: #005177;       /* 濃い青に変更 */
}

/* コード部分(preタグ)のスタイル */
.code-box pre {
    margin: 0;                        /* 外側余白を消す */
    padding: 10px;                    /* 内側余白 */
    overflow-x: auto;                 /* 横スクロールはコード部分のみ */
    background: #f9f9f9;              /* 薄いグレー背景 */
}
  

4 代用プラグイン

もしプラグインで簡単に実装したい場合、Code SnippetsEnlighter などがあります。

5 まとめ

  • functions.php に追加するだけでコピー用ボタンが自動で表示されます。
  • CSS でボタンの位置やデザインを自由に変更可能です。
  • Lightning と Cocoon 両方で簡単に対応できます。