Проблема с add_action('wp_ajax_[имя действия]', myfunction)

1 дек. 2010 г., 13:58:26
Просмотры: 48.6K
Голосов: 7

Я пытаюсь интегрировать 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" игнорируется. Есть идеи, почему функция не вызывается?

2
Комментарии

@user1567: Вы добавляете функцию к хукам wp_ajax_myaction и wp_ajax_admin_myaction. Разве не должно быть wp_ajax_myaction (для авторизованных пользователей) и wp_ajax_nopriv_myaction (для анонимных пользователей)?

Jan Fabry Jan Fabry
1 дек. 2010 г. 15:52:11

да, я исправил, спасибо. Кстати, у меня есть вызов update_option внутри "ajax_function", который, кажется, не срабатывает, потому что вызывается после завершения всей последовательности загрузки WordPress? Есть ли другой способ обновить опцию?

user1567 user1567
1 дек. 2010 г. 18:26:43
Все ответы на вопрос 2
6

В своих проектах я делаю это так

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);
});
1 дек. 2010 г. 14:27:06
Комментарии

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

user1567 user1567
1 дек. 2010 г. 14:43:49

Кстати, где вы устанавливаете значение переменной ajaxurl?

user1567 user1567
1 дек. 2010 г. 14:46:23

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

Horttcore Horttcore
1 дек. 2010 г. 15:46:29

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

user1567 user1567
1 дек. 2010 г. 16:35:08

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

user1567 user1567
1 дек. 2010 г. 17:23:47

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

Horttcore Horttcore
2 дек. 2010 г. 10:29:55
Показать остальные 1 комментариев
0

Пожалуйста, следуйте коду:

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.

Надеюсь, это поможет. Спасибо.

3 июл. 2016 г. 19:09:30