基本の解説
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/ […]