WordPressで非同期処理する方法

WordPressで非同期処理する方法

WordPressでJavascript等を使用し、非同期処理をする方法を紹介します。

通常であれば通信するphpファイルを指定すれば問題ないのですが、WordPressでは直接ファイルを指定する形ではうまく動作してくれません。

そこでWordPressが容易してくれているものを利用し、非同期処理を作成します。

XMLHttpRequestを使用する例で説明していきます。fetchを使用している場合は該当箇所を置き換えて使用してください。

XMLHttpRequestでPOST通信するための通常の記述

function ajax_post() {
      let url = '';
			let send = '';
			
			url = 'ajax.php';
			send = 'PHPに渡す値';
			let request = new XMLHttpRequest();

			request.onreadystatechange = () => {
				if( request.readyState == 4 ) {
					if( request.status == 200 ) {
						console.log( JSON.parse(  request.response ) );
					}
				}
			};

			request.open( 'POST', url, true);
			request.setRequestHeader( 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8' );
			request.send(send);
}

特に処理をしない基本的な形です。

指定したURLに指定した値をPOSTで送信し、レスポンスが返ってきたらコンソールに出力するプログラムです。

WordPressでXMLHttpRequestでPOST通信するための記述

WordPressでは非同期通信、ajax処理をするためのファイルがあらかじめ割り当てられています。

「admin-ajax.php」というファイルです。

なのでこのファイルのパスをJavascriptで使用できる形にしておきます。

方法は「<script>を使用し、ヘッダーまたはフッターに出力する」「wp_locarize_scriptを使用し出力する」の二つがあります。

以下は前者の方法です。

function my_ajaxurl() {
?>
    <script>
        var ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>';
    </script>
<?php
}
add_action( 'wp_head', 'my_ajaxurl', 1 );

ヘッダーに「admin-ajax.php」へのファイルパスを出力しています。

次に実際にjavascriptから値を受け取って処理をする部分です。

javascriptから送られてくる「action=○○」に応じて処理を振り分けることができます。

振り分けるためには行いたい処理(関数)を「wp_ajax_○○」にアクションフックしておく必要があります。

下記例ではjavascrpitから送られてきたterm_iidに対してターム名を返却する例です。

function get_term_name(){

    header("Content-Type: application/json; charset=utf-8");
    
    //$typeはjavascript側でタクソノミー名を送っています。
    $type = filter_input( INPUT_POST , 'search_type' );
    //$conditionsはjavascript側でタームIDの配列を送っています。
    $conditions = filter_input( INPUT_POST , 'search_word', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY );

    $result = [];

    foreach ( $conditions as $condition ) {
    	$term = get_term( $condition, $type );
    	if( $term ) {
    		$result[] = $term->name;
    	}
    }

    echo json_encode( $result );

    wp_die();
}
add_action( 'wp_ajax_get_term_name', 'get_term_name' );
add_action( 'wp_ajax_get_term_name', 'get_term_name' );

ここまでの段階でpostで送られた値に対して処理をし、値を返してあげる仕組みが整いました。

最後にjavascriptの手直しです。

actionの指定とurlを指定します。

function ajax_post() {
			const url = ajaxurl; //phpから指定しておいた変数名を指定
			const send = 'action=get_term_name&search_type=category&search_word[]=12&search_word[]=14';
			let request = new XMLHttpRequest();

			request.onreadystatechange = () => {
				if( request.readyState == 4 ) {
					if( request.status == 200 ) {
						console.log( JSON.parse(  request.response ) );
					}
				}
			};

			request.open( 'POST', url, true);
			request.setRequestHeader( 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8' );
			request.send(send);
}

これで非同期処理がうまく動作します。