基本の解説
STEP1. リクエスト送信先のパス
WordPress で Ajax を使う場合 /wp-admin/admin-ajax.php にリクエストを送ることに決まっている。
JavaScript ファイル内で動的にパスを指定することはできないので、wp_head にフックしてリクエスト送信先のURLをグローバル変数として出力しておく。
> functions.php
function add_my_ajaxurl() { ?> <script> var ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>'; </script> <?php } add_action( 'wp_head', 'add_my_ajaxurl', 1 );
wp_head アクションにフックすることで head 要素内に JavaScript のグローバル変数としてパスが出力される。
これで、以後実行される JavaScript 内でこの変数が使える。
※ JavaScript ファイルを body要素最下部に配置するのは基本なので、wp_footer にフックしてもいい。
wp_enqueue_script を使う場合は、第5引数を true にすること。
STEP2. 呼び出すPHP関数の作成
JavaScript から呼び出す PHP 関数を定義する。
まずは簡単に get_bloginfo( ‘name’ ) で取得される”サイト名”を返すだけの関数とする。
> functions.php
function view_sitename(){ echo get_bloginfo( 'name' ); die(); } add_action( 'wp_ajax_view_sitename', 'view_sitename' ); add_action( 'wp_ajax_nopriv_view_sitename', 'view_sitename' );
wp_ajax_{action} で独自のアクションフックを登録することができる。
wp_ajax_{action} はログインユーザ、wp_ajax_nopriv_{action} は未ログインユーザ用なので、フロントでAjaxを使いたい場合は両方にアクションフックを登録しておくこと。
STEP3. JavaScripの作成
> template
<button id="submit">View Sitename</button>
jQuery の $.ajaxメソッドを使うパターンで解説。
> JavaScript
$( '#submit' ).on( 'click', function(){ $.ajax({ type: 'POST', url: ajaxurl, data: { 'action' : 'view_sitename', }, success: function( response ){ alert( response ); } }); return false; });
url に指定するリクエスト送信先のパスは、STEP1 でグローバル変数 ajaxurl を指定する。
action に指定するのは STEP2 で登録したアクションフック。
これで STEP2 の view_sitename PHP関数が実行され、echo された値が response に戻ってくるので、それをまた JavaScript 側で処理すればオケ。
応用
変数を渡す
> JavaScript
$( '#submit' ).on( 'click', function(){ var mes = 'Hello World!!'; $.ajax({ type: 'POST', url: ajaxurl, data: { 'action' : 'view_mes', 'mes' : mes, }, success: function( response ){ alert( response ); } }); return false; });
> functions.php
function view_mes(){ $mes = $_POST['mes']; echo $mes; die(); } add_action( 'wp_ajax_view_mes', 'view_mes' ); add_action( 'wp_ajax_nopriv_view_mes', 'view_mes' );
結果は「Hello World!!」
配列データをJSON形式でやりとりする
post type = post のコンテンツの、記事タイトルとパーマリンクURLを取得するサンプル。
> JavaScript
(function($){ $( '#submit' ).on( 'click', function(){ $.ajax({ type: 'POST', url: ajaxurl, data: { 'action' : 'my_ajax_get_posts', }, success: function( response ){ jsonData = JSON.parse( response ); $.each( jsonData, function( i, val ){ alert( val['post_title'] ); alert( val['permalink'] ); }); } }); return false; }); })(jQuery)
> functions.php
function my_ajax_get_posts(){ $returnObj = array(); $args = array( 'post_type' => 'post', 'numberposts' => 5, ); $posts = get_posts( $args ); foreach( $posts as $key => $post ) { $returnObj[$key] = array( 'post_title' => $post->post_title, 'permalink' => get_permalink( $post->ID ), ); } echo json_encode( $returnObj ); die(); } add_action( 'wp_ajax_my_ajax_get_posts', 'my_ajax_get_posts' ); add_action( 'wp_ajax_nopriv_my_ajax_get_posts', 'my_ajax_get_posts' );
参考:
Plugin API/Action Reference/wp ajax (action)
Wp Ajax – WordPress Hook to Handle Ajax Request
Comments
ナイス記事
とてもわかりやすかったです。素晴らしい!!
[…] うしたらいいのか悩んでいたのですが、少し調べると用意されているようで感心しました。 以下の方法で、まずはAjaxを利用する下準備をします。 参考URL:http://hijiriworld.com/web/wordpress-ajax/ […]