WordPressのTheme画面から(Loginせずに)Ajaxで通信

Wordpressのpluginを作っていて、Ajax通信をするときにハマったMemo。

環境: WordPress 3.1.4

まずは参考Siteから

 

< 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_noncewp_verify_nonceを使って、codingしておいた方が安心。

作ってて思うのが公式Documentsも最新ではないので、source codeをgrepして読んだ方が便利な関数を発見できる。

最後にwp-configのWP_DEBUGをtrueにしておいて、notice errorが出ないようにplugin開発しておくと公開しても恥ずかしくない。