はじめに
クーポンコードや割引コードを提供する際、ユーザーが簡単にコードをコピーできる機能を提供することは非常に重要です。
そこで、Cocoonで提供されているコピー機能を利用し、「ボタン」ブロックの次に配置されたブロックのテキストをコピーできるようにします。
この記事では、この方法について説明します。
完成イメージ

実装手順
以下の手順で実装します。
以下では、「ボタン」ブロックの次に配置された「段落」ブロックのテキストがコピーされます。
「段落」ブロックを「コード」ブロックに変更すれば、コードもコピー可能になります。
- ラベルGutenbergエディターでの設定

Gutenbergエディター 以下の手順で設定します。
- 「ボタン」ブロックを配置します。
- 高度な設定→追加CSSクラスに
my-copy copy-buttonと入力します。
- ラベルPHPを追加
以下のコードをfunctions.phpに追加します。
add_action('wp_enqueue_scripts', function () { global $_MOBILE_COPY_BUTTON; $_MOBILE_COPY_BUTTON = true; ob_start(); ?> jQuery(function ($) { $(".my-copy").each(function () { var txt = $(this).next().text(); $(this).attr("data-clipboard-text", txt); }); $(".body:has(.my-copy) .copy-info").text("クリップボードにコピーしました"); }); <?php wp_add_inline_script('jquery', ob_get_clean()); });
解説
Cocoonでは、ライブラリ「clipboard.js」を使用してHTMLを適切に定義することで、任意のテキストをクリップボードにコピーできる仕組みが実装されています。
以下のように、copy-buttonのdata-clipboard-text属性にコピーしたいテキストを設定することで、ボタンクリックした際にそのテキストがクリップボードにコピーされます。
<button class="copy-button" data-clipboard-text="コピーするテキスト">ボタン</button>
参考:clipboard.js用いない方法
clipboard.jsを使用せず、JavaScriptのクリップボードAPIを利用してコピーすることもできます。
SSL環境ではクリップボードAPIを使用し、非SSL環境では代替処理でテキストをコピーします。
実装手順
以下のコードをjavascript.jsに追加します。
jQuery(function ($) {
// ポップアップを設定
var $toast = $('<div id="copy-toast">クリップボードにコピーしました</div>').css({
position: 'fixed',
bottom: '20px',
left: '50%',
transform: 'translateX(-50%)',
backgroundColor: 'rgba(0, 0, 0, 0.8)',
color: '#fff',
padding: '10px 20px',
borderRadius: '5px',
fontSize: '14px',
zIndex: 9999,
display: 'none'
}).appendTo('body');
/**
* ポップアップ通知設定
*
* @returns {void}
*/
function showToast() {
$toast.stop(true, true).fadeIn(200).delay(1500).fadeOut(400);
}
/**
* SSL環境のクリップボードコピー処理
*
* @param {string} text - 対象文字列
* @returns {void}
*/
function copySecureClipboard(text) {
// クリップボードAPIでコピー
navigator.clipboard.writeText(text).then(function () {
showToast();
});
}
/**
* 非SSL環境のクリップボードコピー処理
*
* @param {string} text - 対象文字列
* @returns {void}
*/
function copyFallbackClipboard(text) {
// コピー用の一時要素を設定
var $textarea = $('<textarea>')
.val(text)
.css({ position: 'fixed', opacity: '0' })
.appendTo('body');
// 対象テキストを取得
$textarea[0].select();
try {
document.execCommand('copy');
showToast();
} catch (err) {
console.error('Copy failed', err);
}
// 一時要素を終了
$textarea.remove();
}
/**
* コピーボタンイベント登録
*/
$(document).on('click', '.my-copy', function (e) {
e.preventDefault();
// ボタン直後のテキストを取得
var txt = $(this).next().text();
// SSL環境と非SSL環境を設定
if (navigator.clipboard && window.isSecureContext) {
copySecureClipboard(txt);
} else {
copyFallbackClipboard(txt);
}
});
});
注意事項
clipboard.jsは、クリップボードへのコピー処理に内部でexecCommand()を利用しています。
今回の方法では、SSL環境ではClipboard API、非SSL環境ではexecCommand()を利用して、環境に応じてコピー処理を切り替えています。
| 環境 | writeText()メソッド | execCommand()メソッド |
|---|---|---|
| HTTPS | 利用可能 | 非推奨 |
| HTTP | 利用不可 | 非推奨 |
さいごに
今回紹介した方法を使えば、ユーザーがクーポンコードや割引コードを簡単にコピーできるようになります。
Cocoonのコピー機能を活用し、より便利でユーザーに優しいサイトを作成しましょう。

