.htaccessでPHPのファイルアップロードサイズの上限値を変更
2022.02.5
PHPを使用して画像(動画・PDF等)をアップロードするフォームを作成した際に、ファイル…

ホームページでは「いいね」や「お気に入り登録」など、ボタンを押した瞬間に画面が更新される機能を見かけることがあります。
これらは多くの場合、ページ全体を再読み込みするのではなく、JavaScriptからサーバーへ通信を行う「非同期通信(AJAX)」によって実現されています。
当サイトでも過去にAJAXについて紹介したことはありますが、今回はWordPress標準の「admin-ajax.php」を利用し、投稿に「いいね」を付ける機能を例に実装方法をご紹介します。
今回の処理を簡単に説明すると、次のような流れになります。
WordPressでは、この一連の流れを比較的簡単に実装できます。
一般的な非同期通信は下記を参照ください
まずはショートコードでボタンを表示します。
ショートコードに[like_button]を記載するだけでボタンが設置できます
function sample_like_button(){
global $post;
$count = get_post_meta($post->ID, 'like_count', true);
if(empty($count)){
$count = 0;
}
$html = '<input type="hidden" id="post_id" value="'.esc_attr($post->ID).'">';
$html .= '<button id="like-btn">いいね</button>';
$html .= '<span id="like-count">'.esc_html($count).'</span>';
return $html;
}
add_shortcode('like_button', 'sample_like_button'); //ショートコードの名称とそれを実行する関数の定義
jQuery(function($){
$('#like-btn').on('click', function(){
const $btn = $(this);
if ($btn.prop('disabled')) return; // 通信中ならスキップ
$btn.prop('disabled', true); // ボタンを無効化
$.ajax({
type: 'POST',
url: sample_ajax.ajaxurl,
data: {
action : 'sample_like',
_ajax_nonce : sample_ajax.nonce,
post_id : $('#post_id').val()
}
}).done(function(response){
$('#like-count').text(response.count);
}).fail( function( error ) {
console.warn('失敗:', error.status, error.statusText);
}).always(function(){
$btn.prop('disabled', false); // 成功・失敗に関わらずボタンを元に戻す
});
});
});
WordPressでは、admin-ajax.php のURLをJavaScriptへ直接記述するのではなく、PHPから渡すのが一般的です。wp_add_inline_script() を利用することで、PHPで取得したURLやnonceをJavaScript側へ安全に渡すことができます。
function sample_enqueue(){
wp_enqueue_script(
'sample-js',
plugin_dir_url(__FILE__).'sample-like.js', //jsのファイルパス
array('jquery'),
null,
true
);
wp_add_inline_script(
'sample-js',
'const sample_ajax = '.json_encode(array(
'ajaxurl'=>admin_url('admin-ajax.php'),
'nonce'=>wp_create_nonce('sample_nonce')
)),
'before'
);
}
add_action('wp_enqueue_scripts','sample_enqueue');
JavaScriptから送信されたデータは、WordPress側で受け取ります。
function sample_like_ajax() {
check_ajax_referer('sample_nonce');
if (isset($_POST['post_id'])) {
$post_id = intval($_POST['post_id']);
} else {
$post_id = 0;
}
$count = get_post_meta($post_id,'like_count',true);
if(empty($count)){
$count = 0;
}
$count++;
update_post_meta($post_id,'like_count',$count);
wp_send_json(array('count' => $count));
}
// 上記で定義した AJAX ハンドラを AJAX アクションに登録
add_action('wp_ajax_sample_like', 'sample_like_ajax'); //ワードプレスのログインユーザーが対象となる場合
add_action('wp_ajax_nopriv_sample_like', 'sample_like_ajax'); //ワードプレスの非ログインユーザーが対象となる場合
コード内には sample_like や sample_nonce など、自由に名前を付けられる文字列がいくつか登場します。
これらは好きな名前に変更できますが、関連する箇所では必ず同じ文字列を使用する必要があります。
| 任意の文字列 | 記載箇所 | 説明 |
| sample_ajax | const sample_ajax= {…} | JavaScriptへ渡す変数名です。スクリプト内で参照する名前と一致させます。 |
| sample_ajax | sample_ajax.ajaxurl | JavaScript内 上記で定義した変数名と同じものを使用します。 |
| sample_ajax | sample_ajax.nonce | JavaScript内 nonceを取得する変数名です。PHP側で渡したキー名と一致させます。 |
| sample_like | action: ‘sample_like’ | JavaScript内 AJAXで呼び出すアクション名を指定します。 |
| sample_like | add_action(‘wp_ajax_sample_like’, ‘sample_like_ajax’); | ログインユーザー用のフックです。JavaScriptのactionと同じ文字列にします。 |
| sample_like | add_action(‘wp_ajax_nopriv_sample_like’, ‘sample_like_ajax’); | 非ログインユーザー用のフックです。こちらも同じ文字列にします。 |
| sample-js | wp_enqueue_script(‘sample-js’, …) | JavaScriptファイルをWordPressへ登録する際のハンドル名(識別子)です。 |
| sample-js | wp_add_inline_script(‘sample-js’, …) | インラインスクリプトをどのJavaScriptファイルに関連付けるかを指定します。wp_enqueue_script()と同じ文字列を指定します。 |
| sample_nonce | wp_create_nonce(‘sample_nonce’) | nonceを生成する際の識別名です。 |
| sample_nonce | check_ajax_referer(‘sample_nonce’) | nonceを検証する際の識別名です。生成時と同じ文字列にします。 |
今回は理解しやすさを優先し、テーマの functions.php に実装しています。
実際の案件では、再利用性や保守性を考慮してプラグインとして実装するケースもプラグインとして実装するケースも少なくありません。
また、今回の内容は「いいね」機能を例にしていますが、考え方はお気に入り登録や閲覧数の更新、問い合わせフォームの確認処理など、さまざまな非同期処理に応用できます。
一度AJAXの基本的な仕組みを理解しておけば、WordPressで実装できる機能の幅が大きく広がるでしょう。

2022.02.5
PHPを使用して画像(動画・PDF等)をアップロードするフォームを作成した際に、ファイル…

2024.03.30
外部ファイル(CSVファイル等)を読み込んでサイト内に表示する際に、保存時の文字コードが…

2020.10.3
テキストエリア等で入力した文字の中にURLを含んでいた場合に、自動で認識してリンクタグを…

2020.12.5
メールフォームからメールを送信する際に、画像(ファイル)を添付できるようにしてほしいとの…

2020.08.1
動画ファイルをCMS化して保存するときに、多くの場合はファイルパスをデータベース(MyS…

2023.12.2
ワードプレスの投稿のカテゴリー機能を、目的ごとに使い分けたいというご要望があった際に、カ…

2022.09.24
パソコンやスマートフォンの戻るボタンを使って画面を戻す(ブラウザバックする)時があります…

2022.02.19
画像データ等をサーバーにアップロードする際、一点づつアップロードしても良いけれど、ファイ…

2019.12.29
メールフォーム等での入力値チェック(バリデーション)。PHPの「preg_match」(…

2020.08.15
フォームの入力値やURLのパラメータ等、文字列や数値を受け取る際に正規表現を利用してバリ…