基本の解説
STEP1. リクエスト送信先のパス
WordPress で Ajax を使う場合 /wp-admin/admin-ajax.php にリクエストを送ることに決まっている。
JavaScript ファイル内で動的にパスを指定することはできないので、wp_head にフックしてリクエスト送信先のURLをグローバル変数として出力しておく。
> functions.php
1 2 3 4 5 6 7 8 | 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
1 2 3 4 5 6 | 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
1 | < button id = "submit" >View Sitename</ button > |
jQuery の $.ajaxメソッドを使うパターンで解説。
> JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 | $( '#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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $( '#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
1 2 3 4 5 6 7 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ( 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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/ […]