Как использовать Ajax в административной части плагина?

3 сент. 2013 г., 16:01:28
Просмотры: 24.3K
Голосов: 2

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

jQuery.ajax({
        type: "POST",
        url: "<?php echo plugins_url();?>/tester/inc/test.php",
        data: { param: 'st1' }
      }).done(function( msg ) {
             alert( "Data Saved: " + msg );
     });

Ошибка в alert

Data Saved: <br />
<font size='1'><table class='xdebug-error xe-fatal-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Фатальная ошибка: Вызов неопределенной функции add_action() в E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php на строке <i>7</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Стек вызовов</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Время</th><th align='left' bgcolor='#eeeeec'>Память</th><th align='left' bgcolor='#eeeeec'>Функция</th><th align='left' bgcolor='#eeeeec'>Расположение</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0007</td><td bgcolor='#eeeeec' align='right'>254944</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php' bgcolor='#eeeeec'>..\test.php<b>:</b>0</td></tr>
</table></font>

test.php

<?php
function aj()
{
 echo "привет";
echo plugins_url();
}
add_action('wp_ajax_my_action','aj'); 
add_action('wp_ajax_nopriv_myFunction','aj'); 

 ?>

Я думаю, ошибка указывает на то, что я не нахожусь внутри WordPress. Есть идеи?

0
Все ответы на вопрос 3
6
10

Пожалуйста, избегайте использования require('../../../wp-load.php'); и подобных конструкций, как предлагается в других ответах. Вы всегда должны использовать стандартный AJAX-метод WordPress. Это действительно просто, и у вас будет доступ ко всему движку WordPress в вашем PHP-скрипте.

Три важных замечания:

  1. Вы должны отправлять AJAX-запрос на ...wp-admin/admin-ajax.php. ajaxurl — это JavaScript-переменная, которая всегда определена в админ-панели и содержит корректный URL к файлу admin-ajax.php в текущей установке WordPress. Вы можете использовать ajaxurl напрямую в вашем JavaScript-коде в админ-панели. Я заметил, что вы отправляете AJAX-запрос на другой URL.
  2. В отправляемых данных должна быть переменная action. Переменная action содержит имя PHP-функции, ранее зарегистрированной вашим плагином/темой. Эта функция будет обрабатывать AJAX-запрос. Я прочитал ваш код и увидел, что вы определили AJAX-функцию в PHP, но не указали action в JavaScript.
  3. Пример ниже предназначен для админ-панели, как вы и просили. На фронтенде всё немного иначе, но всё так же просто. Если вам нужен пример для фронтенда, просто скажите — я его опубликую.

Пример:

В вашем PHP (плагин/тема):

add_action('wp_ajax_my_action', 'my_ajax_action_function');

function my_ajax_action_function(){
  
    $response = array();
    if ( ! empty($_POST['param'] ) ) {
         $response['response'] = "Я получил параметр, и его значение — " . $_POST['param'] . ', а URL плагина — ' . plugins_url();
    } else {
         $response['response'] = "Вы не отправили параметр";
    }

    header( "Content-Type: application/json" );
    echo json_encode($response);
 
    // Не забывайте всегда завершать AJAX-функцию exit().
    exit();

}

Ваш JavaScript в админ-панели должен выглядеть примерно так (помните, что ajaxurl всегда определён WordPress в админ-панели):

jQuery.ajax({
    type: "POST",
    url: ajaxurl,
    data: { action: 'my_action' , param: 'st1' }
  }).done(function( msg ) {
         alert( "Данные сохранены: " + msg.response );
 });
3 сент. 2013 г. 17:12:35
Комментарии

Думаю, вы неправильно поняли ответ @s_ha_dum. Ваш ответ практически идентичен ответу, на который он сослался. Честно говоря, и без обид, ваш ответ менее полный.

gmazzap gmazzap
3 сент. 2013 г. 17:31:57

Вы правы. Я прочитал ответ Mike Lewek и после этого не потратил достаточно времени на прочтение ответа s_ha_dum.

cybmeta cybmeta
3 сент. 2013 г. 17:39:24

@cybnet спасибо. В my_ajax_action_function() я удалил весь код, но все равно получаю alert с plugin_url. Как это происходит, мне просто хочется понять.

sun sun
3 сент. 2013 г. 17:50:12

plugin_url() не существует в WordPress, правильно использовать plugins_url(). Смотрите отредактированный ответ, я добавил функцию plugins_url(), и она работает идеально.

cybmeta cybmeta
4 сент. 2013 г. 00:57:27

как инициализировать "ajaxurl" для бэкенда. вы не упомянули это здесь

Waqas Shakeel Waqas Shakeel
17 мар. 2020 г. 14:26:30

вместо json_encode и header, я думаю, что лучшей практикой будет использовать wp_send_success или wp_send_error.

simon simon
27 дек. 2022 г. 18:51:22
Показать остальные 1 комментариев
1

Вы не находитесь в контексте WordPress. Вы загрузили файл плагина напрямую. Этот файл загрузится, но остальная часть WordPress — нет.

Используйте AJAX API. Это то, для чего он был создан. Не используйте устаревшие хаки, которые больше не нужны, такие как require/include для загрузки файлов ядра WordPress (wp-load.php, wp-blog-header.php, wp-settings.php, в зависимости от того, какой "урок" вы читали).

Если примеры в Codex недостаточны для начала работы, на этом сайте есть множество примеров, включая более 30, написанных мной — в частности, этот, который, вероятно, можно отнести к одному из нескольких "повторяющихся вопросов".

3 сент. 2013 г. 16:36:33
Комментарии

Я не смог разобраться в Codex или других кодах в пределах своих знаний, поэтому разместил вопрос здесь. Чтобы другие могли помочь мне понять, в чём моя ошибка. В любом случае, спасибо.

sun sun
4 сент. 2013 г. 11:58:18
6

Вы правы, из-за того, как вы делаете AJAX-запрос, WordPress не загружается. Правильный способ — использовать ajaxurl в качестве URL и установить ваше действие как my_action, передав его в качестве значения параметра action в данных запроса:

jQuery.ajax({
    type: "POST",
    url: ajaxurl,
    data: { action: 'my_action', param: 'st1' }
  }).done(function( msg ) {
         alert( "Данные сохранены: " + msg );
 });

Подробнее см. AJAX в плагинах.

3 сент. 2013 г. 16:27:06
Комментарии

Почему я получаю Data Saved: http://localhost/wp_twentythirteen/wp-content/plugins0, даже если я удаляю plugins_url() в test.php?

sun sun
3 сент. 2013 г. 16:49:30

Вам нужно вызвать exit() в конце вашей функции. Попробуйте это и посмотрите, будет ли проблема сохраняться.

J.D. J.D.
3 сент. 2013 г. 17:18:33

Если я использую exit(), я получаю localhost/wp_twentythirteen/wp-content/plugins

sun sun
3 сент. 2013 г. 17:51:36

Если вы получаете это сообщение, значит, вы вызываете plugins_url() где-то в вашем коде перед вызовом exit().

J.D. J.D.
3 сент. 2013 г. 21:41:28

Это должен быть комментарий или правка к ответу @cybnet — так как это уже копия/вставка кода из его ответа.

kaiser kaiser
30 сент. 2013 г. 19:22:04

Да, но если посмотреть на время, я опубликовал это за час до того, как он разместил свой ответ.

J.D. J.D.
30 сент. 2013 г. 23:08:12
Показать остальные 1 комментариев