WordPressでAJAX

wordpressでajax!!

個人的にはajax遷移の動きが非常に気に入っている。
Wordpressで使得時の、実装方法をまとめてみた。

僕がよくやる、ajax&PHPで仕組みを作る場合、

・jsでトリガー
・PHP関数に値を投げる
・json形式で結果を受け取る
・jsでエレメントを描画

とゆう流れなんだが、これをWordpressでやってみる。

まず、必要なのはjs, php

今回は練習として、アーカイブページでカテゴリー検索!というのを作ってみる。

■ Create JS
onload_post_archive.jsの名前でファイルを作成。
themedir/js/に置く。

■ Hook the action.
ここで、ajax_archive_posts.phpというファイル作成。
themedir/に置くとする。

この中に、以下を記載。

// Add js
add_action( 'wp_head', 'add_script_for_ajax_post_archive' );
if(!function_exists("add_script_for_ajax_post_archive")):
function add_script_for_ajax_post_archive(){
wp_enqueue_script('onload_post_archive', get_template_directory_uri(). "/js/onload_post_archive.js");
wp_localize_script('onload_post_archive', 'OLPR', array(
'endpoint' => admin_url('admin-ajax.php'),
'action' => 'get_ajax_pdf_request'
));
}
endif;

// Define function
add_action('wp_ajax_get_ajax_post_archive, '_get_ajax_post_archive);
add_action('wp_ajax_nopriv_get_ajax_post_archive', '_get_ajax_post_archive);

function _get_ajax_post_archive(){
// この中に処理を書いていく

}

ポイントとなるのは、
・wp_localize_script
・add_action の wp_ajax_
・add_action の wp_ajax_noriv_

で、wp_localize_scriptだが、3つのパラメータがある。
wp_localize_script( $handle, $object_name, $l10n );
$handle はファイル名。
$object_name はajaxで渡すオブジェクト名。詳しくは後述。
$110n が完全に理解できてないんだけど、配列でendpoint、ajaxで渡されるphp関数名を格納する。

詳しい説明は、以下。

http://codex.wordpress.org/Function_Reference/wp_localize_script

次に、wp_ajaxについてだけど、
これのフォーマットはこう。
wp_ajax_$youraction
($youraction = ajaxで渡す関数名)
このフックで、下のget_ajax_post_archiveを呼び出す事ができる。
ちなみに、wp_ajax は管理画面用で、公開画面で使う場合に、wp_ajax_norivフックも使う必要があるらしい。

さて、枠組みが出来た所で組み込み開始。

表示される場所は、
archive.php の中に

ここにしよう。

それとサイドバーにこんなかんじに、

cat_1
カテゴリーリストを置く。
class=”1″は、カテゴリIDとしよう。

そしたら、カテゴリ名をクリックした時の挙動をjsにコーディング。

(function($){

$(document).ready(function(){
var getCategoryArchive = {
cid:'',
fire: function(){
getCategoryArchive.onloading = true;
$.post(OLPR.endpoint, {
action: OLPR.action,
cid: getCategoryArchive.cid,
}, postSelectedVal.result);
},

result: function(response){

},

clearResults: function(e){
}
};

$("#sidebar").find("ul").find("li").find("a").clink(function(){
var cid = $(this).attr("class");
getCategoryArchive.cid = cid;
postSelectedVal.fire();
});
});

})(jQuery);

かなりシンプルですが、クリックアクションでajaxを発火される例。

そして次、cidを受け取る _get_ajax_post_archive() を書いていきます。

こっちも練習用という事でシンプルに、

function _get_ajax_post_archive(){
// この中に処理を書いていく
$cid = $_POST["cid"];
$results = array();

$post_array = new WP_Query( array(
'post_type' => "post",
'cat' => $cid,
'order' => 'desc',
'orderby ' => 'modified',
) );
$count = 0;
while ( $post_array->have_posts() ) : $post_array->the_post();
$results[$count]["title"] = $post->post_title;
$results[$count]["guid"] = $post->url;
$count++;
endwhile;
wp_reset_postdata();

header('Content-Type: application/json; charset=utf-8');
echo json_encode($results);
die();

}

同一カテゴリ内のタイトル・リンクのみを入力します。

後は、jsで展開していくだけと。