Как использовать Ajax в административной части плагина?
Я пытаюсь использовать 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. Есть идеи?

Пожалуйста, избегайте использования require('../../../wp-load.php'); и подобных конструкций, как предлагается в других ответах. Вы всегда должны использовать стандартный AJAX-метод WordPress. Это действительно просто, и у вас будет доступ ко всему движку WordPress в вашем PHP-скрипте.
Три важных замечания:
- Вы должны отправлять AJAX-запрос на ...wp-admin/admin-ajax.php.
ajaxurl
— это JavaScript-переменная, которая всегда определена в админ-панели и содержит корректный URL к файлу admin-ajax.php в текущей установке WordPress. Вы можете использоватьajaxurl
напрямую в вашем JavaScript-коде в админ-панели. Я заметил, что вы отправляете AJAX-запрос на другой URL. - В отправляемых данных должна быть переменная action. Переменная
action
содержит имя PHP-функции, ранее зарегистрированной вашим плагином/темой. Эта функция будет обрабатывать AJAX-запрос. Я прочитал ваш код и увидел, что вы определили AJAX-функцию в PHP, но не указалиaction
в JavaScript. - Пример ниже предназначен для админ-панели, как вы и просили. На фронтенде всё немного иначе, но всё так же просто. Если вам нужен пример для фронтенда, просто скажите — я его опубликую.
Пример:
В вашем 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 );
});

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

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

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

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

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

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

Вы правы, из-за того, как вы делаете 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 в плагинах.

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

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

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

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

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