admin-ajax.phpでは記事IDを取得できないので開発時は注意

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で引数として登録すればフロント側で利用可能な状態になる。

参考
wp_localize_script codex
WordPressのAjax

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

admin-ajax.phpでは記事IDを取得できないので開発時は注意の記事にコメントを投稿

開発