web-dev-qa-db-ja.com

wp_ajaxアクションが実行されていません

私はプラグインを書いています。私のワードプレスプラグインの設定ページで誰かがボタンを押したときにget_my_optionメソッドを実行したいのです。 ajax呼び出しは行われますが、メソッドは実行されません。

このページには、次のようなコードがあります。

<div class="wrap">
<input type="button" value="test" onclick="my_js_function();"/>
</div>
<?php
wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__),         array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url(  'admin-ajax.php' ) ) );


function get_my_option()
{
    //do something
    die();
}

add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
add_action("wp_ajax_get_my_option", "get_my_option");
?>

追加されたsynchandler.jsファイル:

function my_js_function() 
{
    jQuery.ajax({
    url: my_ajax_script.ajaxurl,
    type: 'POST',
    data: ({ action: 'get_my_option', affiliate: 'daisycon' }),
    success: function (response) {
        console.log("got this: " + response);
        }
    });
}

応答がありますが、それは0なので、JavaScriptはうまく追加されていますが、それはそれについてです。これを実行してもログにエラーは表示されません。 AjaxURLがページに追加されています(よくある間違いのようです)。

/* <![CDATA[ */
var my_ajax_script = {"ajaxurl":"http:\/\/mywebsite.net\/wp-admin\/admin-ajax.php"};
/* ]]> */

それを起動するボタンはすべて、HTMLのbutton-タグでonclick="my_js_function();を使用します。

それほど簡単ではありませんが、メソッドget_my_optionはajax呼び出しによって起動されません。私はここで何をしていますか?

2
JennisDev

Add_action()はどこで呼び出していますか?すでにHTMLを出力している場所にある場合は、遅すぎます。おそらくAJAX要求の間にも表示されない場所です。

あなたはあなたのテーマのfunctions.phpファイルに、またはできるだけ早くプラグインにそのコードを含めるべきです。

4
Dave Ross

あなたは関数としてあなたの機能コードをプラグインに入れる必要があるでしょう(これはあなたのプラグインを開発するあなたの方法に依存します。

私はadmin_initにadd_action呼び出しを追加することを好みます - これはadmin-ajax.phpでも呼び出されます。

wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__),         array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url(  'admin-ajax.php' ) ) );


function get_my_option()
{
    //do something
    die();
}
function add_ajax_actions() {
    add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
    add_action("wp_ajax_get_my_option", "get_my_option");
}
add_action( 'admin_init', 'add_ajax_actions' );

これがベストプラクティスかどうかはわかりません - ロードされたすべてのページにフックが追加されないようにするための純粋に個人的な設定です - 管理ページのみ。

1
Frederik Spang