WordPressのAjaxインタフェースでは記事IDだけでなくカテゴリ名も取得できない
wp_enqueue_scriptする際に記事IDをローカライズしてAjaxリクエストの引数にする
WordPressのAjaxインタフェースで記事が属するカテゴリ毎に挙動を変えようとした。
しかし、admin-ajax.php内の処理では、カテゴリや記事IDを取得する関数、
- get_the_category()
- the_ID()
などでデータを取得しようとしてもnullが返されることに気付いた。
admin-ajax.phpで記事のIDを利用する場合には、フロント側からAjaxリクエストする際に引数として、記事IDやカテゴリの情報を渡すことで、記事の情報に基づいた条件分岐処理を行うことが可能。
コーディングの仕方
wp_enqueue_scriptsアクションフックのタイミングであれば、記事IDやカテゴリデータを取得する関数が利用可能なので、その際に引数としてローカライズする。
add_action('wp_enqueue_scripts', 'enqueue_script');
記事IDを引数として利用可能な状態にするために、
wp_localize_script
の3番目の引数に配列で複数のデータを設定することができる。
function enqueue_script() { wp_enqueue_script('ajax-script', get_stylesheet_directory_uri().'/js/script.js', array('jquery'), '2014-08-15', true ); wp_localize_script('ajax-script', 'object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'action' => 'some_action', 'post_id' => the_ID() // 記事のIDをローカライズ ) ); }
上のコードによりWordPress固有の情報を引数としてscript.jsで利用可能な状態になる。具体的には、
console.log(object); console.log(object.post_id);
としてデータにアクセスすることが可能。
カテゴリの取得
enqueue_scriptの際に記事IDではなく、カテゴリ名をローカライズするコードは以下のとおり。
if( is_single() ) { $cat = get_the_category(the_ID()); $category = $cat[0]->name; } elseif( is_category() ) { $cat = get_category(get_query_var('cat'), false); $category = $cat->name; } else { $category = null; }
上のコードにより、$categoryにカテゴリ名がセットされるので、wp_localize_scriptで引数として登録すればフロント側で利用可能な状態になる。