Проблема с add_action('wp_ajax_[имя действия]', myfunction)
Я пытаюсь интегрировать AJAX в WordPress, используя рекомендации из документации WordPress. В PHP я добавил:
wp_enqueue_script ( 'my_ajax', ADMIN_URL . 'js/ajax.js','jquery','1.0.0' );
wp_localize_script( 'my_ajax', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
Код AJAX выглядит так:
jQuery.ajax({url: MyAjax.ajaxurl, type: "POST",data: {action: 'myaction',postID : MyAjax.postID}, success: function(response) {
alert('Получено с сервера: ' + response);
}});
а PHP функция, которая должна вызываться через AJAX:
function ajax_function() {
...что-то делаем...
}
add_action('wp_ajax_myaction', 'ajax_function');
add_action('wp_ajax_admin_myaction', 'ajax_function');
AJAX-вызов проходит успешно (alert срабатывает), однако PHP-функция "ajax_function" никогда не вызывается. После некоторой отладки я обнаружил, что хотя вызов action add_action('wp_ajax_ устанавливает новый элемент в глобальном массиве $wp_filter, когда соответствующий do_action запускается внутри admin-ajax.php, массив $wp_filter больше не содержит этот элемент.
Следовательно, функция "ajax_function" игнорируется. Есть идеи, почему функция не вызывается?
В своих проектах я делаю это так
PHP
function foo() {
echo 'bar';
}
add_action('wp_ajax_foo', 'foo' ); // выполняется при авторизованном пользователе
add_action('wp_ajax_nopriv_foo', 'foo' ); // выполняется при неавторизованном пользователе
Javascript
data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' };
jQuery.post(ajaxurl, data, function(response){
alert(response);
});

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

В моем примере я предполагал, что переменная уже определена. В админке WordPress эта переменная всегда установлена. Для фронтенда я просто определяю её в заголовке. <script type="text/javascript"> var ajaxurl = <?php bloginfo('url') ?>'/wp-admin/admin-ajax.php'; </script> Думаю, есть более правильный способ обработки этого.

Понятно. В любом случае, функция у меня все равно не работает. Имеет ли значение, что ajax используется для админки? Или должны использоваться те же самые функции?

Я наконец исправил это. Проблема была в порядке загрузки и расположении вызовов add_action. У меня есть еще один небольшой вопрос: вы написали data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' }; Что если я хочу включить массив в качестве значения одного из ключей?

Это связано с jQuery и тем, как вы хотите добавить данные для ajax-запроса. http://api.jquery.com/jQuery.post/ посмотрите примеры, там есть разные способы включения данных в запрос.

Пожалуйста, следуйте коду:
add_action( 'wp_ajax_add_myfunc', 'prefix_ajax_add_myfunc' );
add_action( 'wp_ajax_nopriv_add_myfunc', 'prefix_ajax_add_myfunc' );
function prefix_ajax_add_myfunc() {
// Обрабатываем запрос и формируем ответ с помощью WP_Ajax_Response
}
а в вашем AJAX-вызове делайте так:
jQuery.post(
ajaxurl,
{
'action': 'add_myfunc',
'data': 'foobarid'
},
function(response){
alert('Сервер ответил: ' + response);
}
);
В AJAX-вызове вы вызываете вашу функцию без prefix_ajax_
. Вызывайте только оставшуюся часть. В данном случае это add_myfunc
. В ответе сервер отправит done
, если все прошло успешно. В противном случае ответ будет 0
или -1
.
Надеюсь, это поможет. Спасибо.
