WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Ajax в WordPress

Цель этой статьи показать, как использовать AJAX при создании тем и плагинов.

С этой статьей вам может понадобится информация о том, как написать плагин для WordPress.
Также читайте как загрузить файлы на сервер через AJAX.

AJAX Simply - мой плагин для удобного создания AJAX запросов. Использовать AJAX станет проще в несколько раз!

Видео уроки об AJAX в WordPress:

AJAX в админ-панели WordPress

С тех пор, как AJAX был встроен в админ-панель WP, использовать функционал AJAX в плагинах стало очень удобно. Небольшой пример. Все делается в одном файле (файле плагина или файле темы functions.php).

#1. Добавляем javascript

Сначала добавляем на страницу админки javascript код, который будет посылать AJAX запрос.

<?php
//add_action('admin_print_scripts', 'my_action_javascript'); // такое подключение будет работать не всегда
add_action('admin_print_footer_scripts', 'my_action_javascript', 99);
function my_action_javascript() {
	?>
	<script>
	jQuery(document).ready(function($) {
		var data = {
			action: 'my_action',
			whatever: 1234
		};

		// с версии 2.8 'ajaxurl' всегда определен в админке
		jQuery.post( ajaxurl, data, function(response) {
			alert('Получено с сервера: ' + response);
		});
	});
	</script>
	<?php
}
?>

С версии 2.8 javascript переменная ajaxurl определена глобально на всех страницах админки. Используйте её в js коде, как ссылку на файл обработчик AJAX запроса. Обычно это файл /wp-admin/admin-ajax.php. В теме (шаблоне) эта переменная не определена. Чтобы использовать её во фронт-энде, её нужно определить самостоятельно. Как это сделать смотрите ниже.

#2. Создаем PHP функцию

Теперь, создадим PHP функцию, которая будет обрабатывать переданный AJAX запрос. Для этого добавляем следующий код в functions.php (можно в плагин):

add_action( 'wp_ajax_my_action', 'my_action_callback' );
function my_action_callback() {
	$whatever = intval( $_POST['whatever'] );

	$whatever += 10;
	echo $whatever;

	wp_die(); // выход нужен для того, чтобы в ответе не было ничего лишнего, только то что возвращает функция
}

Тут мы цепляемся на хук wp_ajax_my_action - это динамический хук и выглядит он так: wp_ajax_(action), где вместо (action) вставляется значение переменной передаваемой в первом коде: action = my_action.

Вот и все.

Примера выше достаточно, чтобы начать использовать AJAX в админ-панели WordPress.

По возможности всегда используйте wp_die() вместо die() или exit(), в функции обработки AJAX запроса. Так вы добьетесь лучшей интеграции с WordPress и в случае ошибок в коде, получите данные о них.

меню

AJAX во внешней части WordPress

Первое в чем нужно убедиться - установлена ли на сайте библиотека jQuery.

Во фронт-энде (внешней части сайта) нужно использовать еще один хук для обработки AJAX запросов: wp_ajax_nopriv_(action). Этот хук в отличии от wp_ajax_(action), срабатывает для неавторизованных пользователей.

Т.е. чтобы создать обработчик запроса для всех пользователей: авторизованных и нет, PHP функцию нужно прикреплять сразу к двум хукам:

add_action('wp_ajax_(action)', 'my_action_callback');
add_action('wp_ajax_nopriv_(action)', 'my_action_callback');

'wp_ajax_nopriv_(action)' можно не указывать, если не нужно, чтобы AJAX запрос обрабатывался для неавторизованных пользователей.

Переменная ajaxurl

Напомню, что переменная ajaxurl есть только в админке и её нет в лицевой части сайта (фронт-энде), поэтому её нужно определить (создать). Но мы назовем её по-другому - myajax.url, для фронта так удобнее, потому что так в объект myajax можно будет добавить еще данные связанные с AJAX запросом.

Правильный способ создать такую переменную - это использовать функцию wp_localize_script().

// Подключаем локализацию в самом конце подключаемых к выводу скриптов, чтобы скрипт
// 'twentyfifteen-script', к которому мы подключаемся, точно был добавлен в очередь на вывод.
// Заметка: код можно вставить в любое место functions.php темы
add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){

	// Первый параметр 'twentyfifteen-script' означает, что код будет прикреплен к скрипту с ID 'twentyfifteen-script'
	// 'twentyfifteen-script' должен быть добавлен в очередь на вывод, иначе WP не поймет куда вставлять код локализации
	// Заметка: обычно этот код нужно добавлять в functions.php в том месте где подключаются скрипты, после указанного скрипта
	wp_localize_script( 'twentyfifteen-script', 'myajax', 
		array(
			'url' => admin_url('admin-ajax.php')
		)
	);  

}

В результате, получим в head части сайта прямо перед скриптом 'twentyfifteen-script':

<script type='text/javascript'>
/* <![CDATA[ */
var myajax = {"url":"http://wptest.ru/wp-admin/admin-ajax.php"};
/* ]]> */
</script>
<script type='text/javascript' src='http://wptest.ru/wp-content/themes/twentyfifteen/js/functions.js?ver=20150330'></script>

На этом теория AJAX закончена, теперь все как для админ части, только вместо ajaxurl указываем myajax.url и нужно прикрепить функцию обработчик на еще один хук wp_ajax_nopriv_(action).

Пример AJAX кода для фронт энда

<?php

add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){

	wp_localize_script('twentyfifteen-script', 'myajax', 
		array(
			'url' => admin_url('admin-ajax.php')
		)
	);  

}

add_action('wp_footer', 'my_action_javascript', 99); // для фронта
function my_action_javascript() {
	?>
	<script type="text/javascript" >
	jQuery(document).ready(function($) {
		var data = {
			action: 'my_action',
			whatever: 1234
		};

		// 'ajaxurl' не определена во фронте, поэтому мы добавили её аналог с помощью wp_localize_script()
		jQuery.post( myajax.url, data, function(response) {
			alert('Получено с сервера: ' + response);
		});
	});
	</script>
	<?php
}

add_action('wp_ajax_my_action', 'my_action_callback');
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
function my_action_callback() {
	$whatever = intval( $_POST['whatever'] );

	echo $whatever + 10;

	// выход нужен для того, чтобы в ответе не было ничего лишнего, только то что возвращает функция
	wp_die();
}

Код рассчитан на тему twentyfifteen. Вставлять код можно в functions.php темы.

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

меню

Логичное подключение AJAX хуков

Я не стал усложнять чтение и не говорил, как правильно подключать AJAX через хуки в коде. Впрочем все что написано ниже не обязательно, потому что работать будет и так, но это рекомендуется.

Функции обработчики установленные хукам:

  • wp_ajax_(action)
  • wp_ajax_nopriv_(action) 

Оба хука всегда удовлетворяют условию wp_doing_ajax():

if( wp_doing_ajax() ){}

// до версии WP 4.7 
if( defined('DOING_AJAX') ){}

А значит сами хуки нужно подключать, только если срабатывает это условие.

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

Пример того, как рекомендуется подключать все AJAX хуки.

// подключаем AJAX обработчики, только когда в этом есть смысл
if( wp_doing_ajax() ){
	add_action('wp_ajax_myaction', 'ajax_handler');
	add_action('wp_ajax_nopriv_myaction', 'ajax_handler');
}

// или так до WP 4.7
if( defined('DOING_AJAX') ){
	add_action('wp_ajax_myaction', 'ajax_handler');
	add_action('wp_ajax_nopriv_myaction', 'ajax_handler');
}

В этом случае хуки будут подключены только во время AJAX запроса и не будут подключены при простом посещении фронта, админки, REST или CRON запросе.

Напомню также, что данные отправляемые с фронтэнда на файл wp-admin/admin-ajax.php обработаются указанной в хуке произвольной функцией ajax_handler(), независимо авторизован пользователь или нет.

меню

Защита: используем nonce и проверяем права

Нет острой необходимости проверять AJAX запрос, если он потенциально не опасный. Например, когда он просто получает какие-то данные. Но когда запрос удаляет или обновляет данные, то его просто необходимо дополнительно защитить с помощью nonce кода и проверкой прав доступа.

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

Существует два вида защиты, которые нужно использовать в AJAX запросах в большинстве случаев.

1. Код nonce (случайный код)

Nonce - это уникальная строка, которая создается и используется один раз - одноразовое число. Nonce проверка используется, когда нужно убедится, что запрос был послан с указанного «места».

В WordPress есть функции wp_create_nonce() и check_ajax_referer() - это базовые функции для создания и последующей проверки nonce кода. С их помощью мы и будем создавать защиту nonce для AJAX запросов.

Для начала создадим nonce код:

add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){

	wp_localize_script('twentyfifteen-script', 'myajax', 
		array(
			'url' => admin_url('admin-ajax.php'),
			'nonce' => wp_create_nonce('myajax-nonce')
		)
	);  

}

twentyfifteen-script это название основного скрипта темы (см. выше), который подключается на сайте с помощью wp_enqueue_script().

Затем, в AJAX запросе добавим переменную с кодом nonce:

var ajaxdata = {
	action     : 'myajax-submit',
	nonce_code : myajax.nonce
};
jQuery.post( myajax.url, ajaxdata, function( response ) {
	alert( response );
});

Теперь, в обработке заброса необходимо проверить nonce код:

add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );
function myajax_submit(){
	// проверяем nonce код, если проверка не пройдена прерываем обработку
	check_ajax_referer( 'myajax-nonce', 'nonce_code' );
	// или так
	if( ! wp_verify_nonce( $_POST['nonce_code'], 'myajax-nonce' ) ) die( 'Stop!');

	// обрабатываем данные и возвращаем
	echo 'Возвращаемые данные';

	// не забываем завершать PHP
	wp_die();
}

check_ajax_referer() работает на основе функции wp_verify_nonce() и по сути является её оберткой для AJAX запросов.

Обратите внимание, что в данном случае Nonce код создается в HTML коде. А это значит, что если у вас установлен плагин страничного кэширования, то этот код может и наверняка будет устаревать к моменту очередного AJAX запроса, потому что HTML код кэшируется...

2. Проверка прав доступа

Тут AJAX запросы будут срабатывать только для пользователей с правом указанным правом, например author. Для всех остальных, включая неавторизованных пользователей, AJAX запрос вернет ошибку.

Особенность тут в том, что не авторизованные пользователи тоже должны видеть сообщение об ошибке при AJAX запросе. Поэтому для них тоже нужно обрабатывать запрос и вернуть сообщение об ошибке:

add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );
function myajax_submit(){
	// проверяем nonce код, если проверка не пройдена прерываем обработку
	check_ajax_referer( 'myajax-nonce', 'nonce_code' );

	// текущий пользователь не имеет права автора или выше
	if( ! current_user_can('publish_posts') )
		die('Этот запрос доступен пользователям с правом автора или выше.')

	// ОК. У юзера есть нужные права!

	// Делаем что нужно и выводим данные на экран, чтобы вернуть их скрипту

	// Не забываем выходить
	wp_die();
}
меню

Включаем кэширование для AJAX запросов

По умолчанию все AJAX запросы НЕ кэшируются браузером для этого PHP устанавливает специальные заголовки функцией nocache_headers().

Чаще всего AJAX запросы кэшировать и не надо, потому что они должны возвращать свежие данные, но бывают случаи когда такое кэширование может сэкономить ресурсы и увеличить скорость работы скрипта. Например, если у нас есть сложный фильтр товаров который юзеры используют постоянно. Тут было бы разумно кэшировать все результаты фильтра например на пару часов, все равно товары не добавляются с такой скоростью...

Как включить кэширование для указанных AJAX запросов смотрите во втором примере функции nocache_headers().

меню

Отлавливаем баги, PHP ошибки

Проблемы могут возникнуть при AJAX запросе и появлении ошибок PHP. Заметки или сообщения могут изменить возвращаемый результат или вызвать ошибку javascript.

Дебаг (вывод ошибок на экран)

Вариант:

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

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

Вариант: включаем показ ошибок в AJAX запросах

WordPress по умолчанию не показывает ошибки для AJAX запросов даже если константа WP_DEBUG включена! Видно это в коде функции wp_debug_mode().

Несмотря на это такой показ можно включить, ведь на рабочих проектах у нас все равно WP_DEBUG отключена и боятся нам нечего, а вот баги выловить это помогает на ура!

Чтобы включить показ ошибок при AJAX запроса, нужно вставить такой код в файл темы functions.php или в плагин. Но лучшее его вставить как можно раньше, чтобы видеть ранние ошибки, лучше всего в MU плагины...

if( WP_DEBUG && WP_DEBUG_DISPLAY && (defined('DOING_AJAX') && DOING_AJAX) ){
	@ ini_set( 'display_errors', 1 );
}

Вариант: вывод данных в лог файл

Если по ходу написания кода нужно заглянуть в переменную $myvar, то еще можно использовать такой код в обработчике ajax запроса:

error_log( print_r($myvar, true) );

В результате, в файл логов сервера (error.log) будет записано содержимое переменной $myvar. Так можно выполнить ajax, и заглянуть в лог.

Вариант: вывод PHP ошибок в лог файл

Чтобы выводить PHP заметки и ошибки в лог файл, нужно включить константу WP_DEBUG_LOG. Такой лог файл появится в папке wp-content.

Вариант:

Если не получается увидеть сообщение об ошибке и нужно работать в режиме разработчика, можно очистить буфер сразу перед возвратом данных:

ob_clean();
echo $whatever;
die();

После этого нужно посмотреть что возвращает запрос через дебаг браузера или как-то еще...

Вариант:

Также, для дебага можно воспользоваться инструментом FirePHP, который записывает ошибки в консоль браузера.

Ошибка при возвращении данных

Если AJAX запрос на в файл wp-admin/admin-ajax.php провалился, то будет возвращен ответ -1 или 0.

  • -1 - ошибка при проверке запроса. См. функцию check_ajax_referer()
  • 0 - обработка запроса вернула пустой результат
  • 0 - также возвращается по умолчанию во всех остальных случаях.

Полезная стать по теме (англ): 5 TIPS FOR USING AJAX IN WORDPRESS

меню

Плагины

Плагин AJAX Simply - добавляет класс, с помощью которого можно удобно и быстро писать AJAX запросы на стороне клиента и ответы на стороне сервера.

Качественный и надежный сервис по продвижению в Телеграмме предлагает совершить недорогую покупку подписчиков в группу. На сайте Вы найдете массу выгодных предложений с индивидуальными условиями для каждого сообщества. Например, Вы можете выбрать оптимальную скорость поступления ресурса, которая доходит до 1000 единиц в сутки. Успейте сделать заказ, пока на сайте действуют оптовые скидки.

92 коммента
Полезные 10 Вопросы 3 Все
  • Подгружаю посты аяксом на страницу по нажатии на кнопку "Загрузить еще". Соответственно учитываю уже выведенное количество постов для отступа.
    query_posts("cat=8&orderby=date&order=ASC&offset=$offset&posts_per_page=$portion");
    Подскажите, как можно проверить, последние ли я посты забираю, т.е учитывая отступ, остались ли после него еще посты? Нужно для скрытия этой самой кнопки при последнем нажатии.
    Если не понятно изложил мысль могу подробнее с примером кода...

    Ответить2.5 года назад #
    • campusboy3137 cайт: www.youtube.com/c/wpplus

      Смотря как у вас реализация построена. Если JSON возвращается, то в последней порции нужную переменную присоединять. Если она существует - скрывать кнопку.

      Если обычно, обычным куском html возвращается, то я бы лично при загрузке страницы сразу количество записей по нужному критерию считал и помещал в переменную, с которой потом сравнивал. Получаем количество записей по определенному условию:

      <script>
      var cnt_all_posts = <?php echo count( get_posts( ПАРАМЕТРЫ ) ); ?>;
      </script>
      2
      Ответить2.5 года назад #
      • Спасибо, думал правда без лишнего запроса, но пока видимо пойдет и так.

        Ответить2.5 года назад #
  • Андрей

    Добрый день!

    Спасибо Вам за труд. Сайт прекрасный и полезный. (очень)

    Вопрос по теме. Читал. Показалось, что это какое-то извращение. Ajax в php, да еще и в искареженном вордпрессом)), да еще и с этим многотомником jQuery)), который вообще непонятно зачем нужен для Аякса.

    Так вот вопрос. Я пишу ajax-запросы на чистом js, подключаю файл .js через functions.php и все прекрасно работает. Поскольку я начинющий разработчик, у меня невольно возникают сомнения. Может, я чего-то не понимаю, и надо ухо чесать именно через колено...? )) То есть делать простые вещи сложными...
    Заранее спасибо за ответ.+!

    1
    Ответить2.1 года назад #
    • Kama7201

      Ну тут все как всегда - погоня за стабильностью и возможностью не ошибаться ошибаясь...

      Начну с того, что в JS я плохо разбираюсь, поэтому ответ будет соответствующий...

      jQuery установлен почти на всех сайтах с WordPress. Для jQuery написано очень много плагинов, которые удобно и быстро использовать. Именно удобно, а не производительно! А аякс через него, потому что стабильнее через него да и понятнее код получается... Простой пример, мы отправили запрос, пусть, $.get() и можем получить при одинаковых переменных, любой ответ: текст, json, xml. jQuery налету определить тип ответа и раскодирует его - это стабильно и удобно! И таких мелочей в jQuery хватает...

      То есть делать простые вещи сложными...

      Вот это я не понял, в чем сложность?

      Тут все упирается во время разработки. В разы быстрее влепить фреймворк, нужные плагины и все это соединить в одно целое, чем писать каждый компонент самому и вылавливать баги... Это пожалуй суть ответа на твой вопрос... Если удобно, не пользуйся jQuery. Но я уверен, что рано или поздно ты сам поймешь, что удобнее и стабильнее пользоваться тем что уже продумано. Есть много других вещей над которыми выгоднее подумать, чем изобретать велосипед. Как-то так...

      Если все всем этом разобраться, то можно при нескольких строках кода сделать то, что потребует гораздо больше года... Ну конечно придется подключать «лишние» файлы. Я в этом отношении тоже всегда ищу компромисс, между библиотеками, плагинами и разумностью их подключать. Но jQuery в данном случае, как бы маст-хэв для WordPress. Поэтому все так...

      Спасибо за коммент.

      Ответить2.1 года назад #
      • Андрей

        Добрый день.

        Сасибо за ответ. В общем понятно. Против jQuery ничего не имею, и пользуюсь им, вот только сложные запросы мне проще писать на чистом js. А уж простые тем более - влепил заговотку, и порядок! Но это дело вкуса)

        Удачи, хороших проектов и всех благ! И до новых "встреч" в разделе комментариев.

        1
        Ответить2.1 года назад #
  • Андрей

    У меня почему сфлеши таки страные при создание свой переменой ajax

    <script type='text/javascript'>
    /* <![CDATA[ */
    var myajax = {"url":"http:\/\/wp.loc\/wp-admin\/admin-ajax.php","nonce":"4e0eedac9b"};
    /* ]]> */
    </script>
    //Функция обработчика для AJAX
    add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
    function myajax_data(){
    
    	wp_localize_script('calck', 'myajax', 
    		array(
    			'url' => admin_url('admin-ajax.php')
    		)
    	);  
    
    }
    Ответить1.9 года назад #
  • @ Илья

    Сделал как увас, а WordPress возращает ноль, уже второй день не могу понять вчем может быть проблема вот код

    //Функция обработчика для AJAX
    add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
    function myajax_data(){
    
    wp_localize_script('mail', 'myajax', 
    		array(
    			'url' => admin_url('admin-ajax.php')
    		)
    	);
    }  
    //Обработка AJAX запроса калькулятора
    add_action('wp_ajax_nopriv_mail_action', 'mail_action');
    add_action('wp_ajax_mail_action', 'mail_action');
    function mail_action()
    {
    
       //wp_mail('dzerglib@yandex.ru', 'Тема',  'Сообщение');
      if(isset($_POST['data'])) { 
    
    	echo $_POST['data'];
    
    	}
    
    wp_die();
    }

    А вот JS

    $('.calckform').submit(function() {
    
    		   $.ajax({
    									type: "POST",
    									data: {
    
    										  action: "mail_action",
    										  data: 1,
    
    									},
    									url: myajax.url,
    									success:function(res){
    
    											 alert(res);
    
    										 // $('#zakazresult').text('заказ отправлен');
    
    									},
    									error:function(){
    										  $('#zakazresult').text('произошла ошибка');
    									}
    	});
    
    	return false;
      });
    

    Как я понял ошибка в action но я немогу понять, вроде бы все правельно

    Ответить1.9 года назад #
    • campusboy3137 cайт: www.youtube.com/c/wpplus

      Только что проверил твой код - работает. Единственное, что я изменил в твоем скрипте, так это переменную myajax.url, так как у меня она не определялась. В Хроме нажми F12 и отправь форму, поглядывая туда, может ошибки у тебя тоже есть. Дебаг - великая вещь smile

      Попробуй задать ссылку на обработчки на прямую, то есть:

      url: 'http://test-wp.ru/wp-admin/admin-ajax.php',
      1
      Ответить1.9 года назад #
      • @ Илья

        Да ноль почему то выводит не знаю почему ((

        Ответить1.9 года назад #
      • Kama7201

        А у тебя wp_localize_script('mail', правильно работает вообще? В HTML коде видишь что добавился скрипт со ссылкой на admin-ajax.php? Там вон локализация подключается к скрипту mail он вообще есть (подключается)?

        Ответить1.9 года назад #
  • campusboy3137 cайт: www.youtube.com/c/wpplus

    -1 - не указан параметр action

    Я вообще не могу воспроизвести ситуацию, когда бы вернулась -1. Если заглянуть в код admin-ajax.php, то там есть:

    // Require an action parameter
    if ( empty( $_REQUEST['action'] ) )
    	die( '0' );

    И как бы я не извращался, получить -1 не смог.

    1
    Ответить1.5 года назад #
    • campusboy3137 cайт: www.youtube.com/c/wpplus

      Хотя нашёл вот такую функцию check_ajax_referer(), там есть

      if ( $die && false === $result ) {
      	if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
      		wp_die( -1 );
      	} else {
      		die( '-1' );
      	}
      }

      И описание её:

      Проверяет Ajax запрос, на соответствие nonce коду. Обрывает работу скрипта через die, если проверка не пройдена.

      В общем, сам себе ответил на вопрос. Я экспериментировал без проверки nonce.

      1
      Ответить1.5 года назад #
      • Kama7201

        Спасибо за правки! thank_you Видимо раньше -1 был ответ, а теперь что-то изменилось...

        Ответить1.5 года назад #
  • shadow

    Добрый день! Спасибо вам за отличный материал. Помогите пожалуйста решить проблему с аякс формой.

    function wdmode_action_callback() {
    	global $wpdb;
    	global $mail;
    	$nonce = $_POST['nonce'];
    	$rtr = '';
    	if (!wp_verify_nonce( $nonce, 'wdmode_action-nonce')) wp_die('{"error":"Error. Spam"}');
    	$message = "";
    	$to = "info@gmail.com"; 
    	$headers = "Content-type: text/html; charset=utf-8 \r\n";
    	$headers .= "From: ".$_SERVER['SERVER_NAME']." \r\n";
    	$subject = "Сообщение с сайта ".$_SERVER['SERVER_NAME'];
    	do_action('plugins_loaded');
    	if (!empty($_POST['aboutme__email']) && !empty($_POST['aboutme__theme'])){
    		$message .= "<br/>E-mail: ".$_POST['aboutme__email'];
    		$message .= "<br/>Сообщение:<br/>".nl2br($_POST['aboutme__theme']);
    		if (wp_mail($to, $subject, $message, $headers)) {
    			$rtr='{"work":"Сообщение отправлено!","error":""}';
    		} else {
    			$rtr='{"error":"Ошибка сервера."}';
    		}
    	} else {
    		$rtr='{"error":"Все поля обязательны к заполнению!"}';
    	}
    	echo $rtr;
    	wp_die();
    }
    add_action('wp_ajax_nopriv_wdmode_send_action', 'wdmode_action_callback');
    add_action('wp_ajax_wdmode_send_action', 'wdmode_action_callback');
    
    function wdmode_cont_form() {
    	$rty='<form class="aboutme__form">';</div>';
    	$rty.='<label for="aboutme__email">твой e-mail</label>';
    	$rty.='<input id="aboutme__email" type="text" placeholder="ivan@mail.ru"/>';
    	$rty.='<label for="aboutme__theme">сообщение</label>';
    	$rty.='<textarea id="aboutme__theme" rows="3"></textarea>';
    	$rty.='<div class="line"><input class="btn btn__md-border-color" type="submit" onclick="wdmode_ajax_send(\'#aboutme__email\',\'#aboutme__theme\'); return false;" value="Отправить"/></div>';
    	$rty.='</form>';
    	return $rty;
    }
    add_shortcode( 'wdmode_cont_form', 'wdmode_cont_form' );
    
    function wdmode_ajax_send(aboutme__email,aboutme__theme) {
    	jQuery.ajax({
    		type: 'POST',
    		url: wdmode_Ajax.ajaxurl,
    		dataType:'json',
    		data:{
    		'aboutme__email':jQuery(aboutme__email).val(),
    		'aboutme__theme':jQuery(aboutme__theme).val(),
    		'nonce': wdmode_Ajax.nonce,
    		'action':'wdmode_send_action'
    	},
    	success: function (data) {
    		if (data.error=="") {
    			alert(data.work);
    		} else {
    		 alert(data.error);
    		}
    	},
    	error: function () {
    		alert("Ошибка соединения");
    	}
    	});
    }

    После отправки выдает: Status Code:500 Internal Server Error
    Спасибо за внимание! Жду вашего ответа..

    Ответить1.5 года назад #
  • campusboy3137 cайт: www.youtube.com/c/wpplus

    В примере "Логичное подключение AJAX хуков" ест код:

    // до версии WP 4.7 
    if( defined('DOING_AJAX') ){}

    Думаю, так не стоит делать, так как DOING_AJAX может иметь значение false. Не зря обертка wp_doing_ajax() является аналогом связки:

    defined( 'DOING_AJAX' ) && DOING_AJAX );
    1
    Ответить1.4 года назад #
    • Kama7201

      В теории да, на практике, нет. Прежде чем это убрать я просмотрел код движка - там только true или ничего... В ядре, кстати именно так кое где проверяется, даже при том что есть функция wp_doing_ajax(). В общем, это жжж не просто так agree

      Ответить1.4 года назад #
      • campusboy3137 cайт: www.youtube.com/c/wpplus

        Скорее всего такая связка из двух проверок предусмотрена, чтобы можно было отключать возможность работы с ajax через определение константы DOING_AJAX в wp-config.php. Не знаю, когда это может пригодится, но как ты сказал - это жужжание не спроста smile

        Ответить1.4 года назад #
  • Интересно, можно ли через ajax обновить данные из шорткода?

    Ответить1.3 года назад #
  • Алексей

    Обратите внимание, что в данном случае Nonce код создается в HTML коде. А это значит, если у вас установлен плагин страничного кэширования, то этот код может и наверняка будет устаревать к моменту очередного AJAX запроса.

    А как решить тогда эту проблему? Нужно и кэширование страницы и AJAX с проверкой nonce. Есть идеи?

    Ответить1.3 года назад #
    • Kama7201

      Думаю только кардинально:

      • Отказаться от nonce проверки
      • Увеличить срок жизни nonce кода, см. хук nonce_life
      Ответить11 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться