действие wp ajax не выполняется


Я пишу плагин. Я хочу запустить метод get_my_option, когда кто-то нажимает кнопку на странице настроек моего плагина WordPress. Вызов 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"};
/* ]]> */

Кнопка для запуска всего этого использует onclick="my_js_function(); в HTML button-теге.

Как бы просто это ни было, метод get_my_option не запускается вызовом ajax. Что я здесь делаю не так?

Author: kaiser, 2014-04-22

2 answers

Где вы вызываете add_action()? Если он находится в месте, где вы уже выводите HTML, уже слишком поздно, и, вероятно, это место, на которое даже не будут смотреть во время запроса AJAX.

Вы должны включить этот код в свою тему functions.php файл, или как можно раньше в плагине.

 4
Author: Dave Ross, 2014-04-22 14:07:48

Вам нужно будет поместить свой функциональный код в плагин как функцию (это зависит от вашего способа разработки вашего плагина.

Я предпочитаю добавлять вызовы add_action в admin_init - он вызывается с 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' );

Я не знаю, является ли это лучшей практикой - это чисто личное предпочтение, чтобы избежать добавления крючков на каждую загруженную страницу - только на страницы администратора.

 2
Author: Frederik Spang, 2014-04-22 16:30:19