WordPressのTheme画面から(Loginせずに)Ajaxで通信
Wordpressのpluginを作っていて、Ajax通信をするときにハマったMemo。
環境: WordPress 3.1.4
まずは参考Siteから
- AJAX in Plugins - WordPress Codex 日本語版
- AJAX - WordPress Codex(公式サイト)
- AJAX in Plugins | WordPress Codex
< 2013/01/02 Modified >
WordPress 3.5にUpgradeしたらwp-load.phpをtargetにするとhookしてくれなくなった。公式Siteにあるように
admin_url('admin-ajax.php');
へRequestする必要がある。
hookするには
add_action('wp_ajax_my_action', 'my_action_callback');
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
"_nopriv"はLoginしていない場合。
ajax通信の場合は"DOING_AJAX"が定義されるので、これを内部で使って分岐することも出来る。詳しくはamin-ajax.phpを参照。
loginしている(管理画面)前提ならadmin-ajax.phpに向けてaction parameterを付けてPOSTすれば、wp_ajax_(action名)にhookできるので簡単。
loginしていない状態からはhome_url('/wp-load.php')をtarget先にしてajax通信をする。あとはplugin側でinitとかにhookすれば出来る。
function hoge_custom_function() {
if (!empty($_POST['action']) ){
if ($_POST['action'] == 'ajax_hoge') {
...something...
exit();
}
}
}
add_action('init', 'hoge_custom_function');
投稿したり、fileを添付する場合はguest userをwordpressに作っておいて、wp_set_current_userを使って仮ログイン状態したほうがやりやすいと思う。
このときにDashboardには入られたくないので
function hook_login_check() {
if (!is_super_admin()) {
wp_redirect(home_url());
exit();
}
}
add_action('admin_init', 'hook_login_check', 10, 1);
こんな感じで制限をかけた方がよいかもしれない。
あと記事を投稿したりfileを添付する場合はwp_create_nonceとwp_verify_nonceを使って、codingしておいた方が安心。
作ってて思うのが公式Documentsも最新ではないので、source codeをgrepして読んだ方が便利な関数を発見できる。
最後にwp-configのWP_DEBUGをtrueにしておいて、notice errorが出ないようにplugin開発しておくと公開しても恥ずかしくない。