- Не работают базовые функции WordPress при Ajax запросе. Как исправить?
- Ajax в WordPress
- AJAX в админ-панели WordPress
- #1. Добавляем javascript
- #2. Создаем PHP функцию
- AJAX на фронтэнде (в теме)
- Переменная ajaxurl
- Пример AJAX кода для фронт энда
- Логичное подключение AJAX хуков
- Защита: используем nonce и проверяем права
- 1. Код nonce (случайный код)
- 2. Проверка прав доступа
- Включаем кэширование для AJAX запросов
- Отлавливаем баги, PHP ошибки
- Дебаг (вывод ошибок на экран)
- Ошибка при возвращении данных
- Плагины
- JQuery AJAX вызов в плагине WordPress не работает
- Решение
- Другие решения
Не работают базовые функции WordPress при Ajax запросе. Как исправить?
При обращении к пользовательскому шаблону через ajax получаю такую ошибку:
Fatal error: Call to undefined function query_posts() in /home/virtwww/w_egoist1-ru_c12ff7c5/http/wp-content/themes/egoist2/sitemap-ajax.php on line 11
Т.е. в этом файле не работают базовые функции WP ! Как это исправить ?
Вам нужно подключить среду вордпресс так:
Сделать это нужно в файле обрботчике Ajax запроса: sitemap-ajax.php
В подключаемом через ajax php файле запускаю планировщик события. Почему-то не работает. Воспользовался предложенным вариантом. Та же история
В чем может быть причина?
Как именно запускаешь? Событие наступило-то? Ну и там еще несколько причин может быть, планировщик — дело тонкое.
Более правильный вариант, использовать для Ajax встроенное в движок api, а делать отдельный файл и подгружать туда вордпресс для работы с аяксом совершенно не кошерно.
А можно узнать, почему не кошерно? У меня на этом сайте например, свой файл обработчик и как мне кажется он удобнее: кроме прочих мелочей, я могу указать константу SHORTINIT, могу указать, чтобы вообще не подгружать WP, когда можно. А оригинальный файл этого не может. Он скорее предназначен для использования в админ-панели, для разработки плагинов, а для тем, как мне кажется, нормально создать свой файл обработчик. ИМХО
Источник
Ajax в WordPress
Цель этой статьи показать, как использовать AJAX при создании тем и плагинов.
Полезное по теме:
Видео уроки об AJAX в WordPress:
AJAX в админ-панели WordPress
С тех пор, как AJAX был встроен в админ-панель WP, использовать функционал AJAX в плагинах стало очень удобно. Небольшой пример. Все делается в одном файле (файле плагина или файле темы functions.php ).
#1. Добавляем javascript
Сначала добавляем на страницу админки javascript код, который будет посылать AJAX запрос.
С версии 2.8 javascript переменная ajaxurl определена глобально на всех страницах админки. Используйте её в js коде, как ссылку на файл обработчик AJAX запроса. Обычно это файл /wp-admin/admin-ajax.php . В теме (шаблоне) эта переменная не определена. Чтобы использовать её во фронт-энде, её нужно определить самостоятельно. Как это сделать смотрите ниже.
#2. Создаем PHP функцию
Теперь, создадим PHP функцию, которая будет обрабатывать переданный AJAX запрос. Для этого добавляем следующий код в functions.php (можно в плагин):
Тут мы цепляемся на хук wp_ajax_my_action — это динамический хук и выглядит он так: wp_ajax_(action) , где вместо (action) вставляется значение переменной передаваемой в первом коде: action = my_action .
Примера выше достаточно, чтобы начать использовать AJAX в админ-панели WordPress.
По возможности всегда используйте wp_die() вместо die() или exit(), в функции обработки AJAX запроса. Так вы добьетесь лучшей интеграции с WordPress и в случае ошибок в коде, получите данные о них.
AJAX на фронтэнде (в теме)
Первое в чем нужно убедиться — установлена ли на сайте библиотека jQuery.
Во фронт-энде (внешней части сайта) нужно использовать еще один хук для обработки AJAX запросов: wp_ajax_nopriv_(action) . Этот хук в отличии от wp_ajax_(action) , срабатывает для неавторизованных пользователей.
Т.е. чтобы создать обработчик запроса для всех пользователей: авторизованных и нет, PHP функцию нужно прикреплять сразу к двум хукам:
‘wp_ajax_nopriv_(action)’ можно не указывать, если не нужно, чтобы AJAX запрос обрабатывался для неавторизованных пользователей.
Переменная ajaxurl
Напомню, что переменная ajaxurl есть только в админке и её нет в лицевой части сайта (фронт-энде), поэтому её нужно определить (создать). Но мы назовем её по-другому — myajax.url , для фронта так удобнее, потому что так в объект myajax можно будет добавить еще данные связанные с AJAX запросом.
Правильный способ создать такую переменную — это использовать функцию wp_localize_script().
В результате, получим в head части сайта прямо перед скриптом ‘twentyfifteen-script’:
На этом теория AJAX закончена, теперь все как для админ части, только вместо ajaxurl указываем myajax.url и нужно прикрепить функцию обработчик на еще один хук wp_ajax_nopriv_(action) .
Пример AJAX кода для фронт энда
Код рассчитан на тему twentyfifteen . Вставлять код можно в functions.php темы.
Этот код будет работать для любой темы, единственное что для этого нужно — это поменять название основного скрипта темы twentyfifteen-script , который подключается после jquery.
Логичное подключение AJAX хуков
Я не стал усложнять чтение и не говорил, как правильно подключать AJAX через хуки в коде. Впрочем все что написано ниже не обязательно, потому что работать будет и так, но это рекомендуется.
Функции обработчики установленные хукам:
Оба хука всегда удовлетворяют условию wp_doing_ajax():
А значит сами хуки нужно подключать, только если срабатывает это условие.
Используя это правило, можно не подключать хуки там где в этом нет смысла. Например, при генерации страницы шаблона или страницы админки. Эта маленькая деталь добавит больше логики в код и в некоторых случаях может избавить от багов.
Пример того, как рекомендуется подключать все AJAX хуки.
В этом случае хуки будут подключены только во время 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 код:
twentyfifteen-script это название основного скрипта темы (см. выше), который подключается на сайте с помощью wp_enqueue_script().
Затем, в AJAX запросе добавим переменную с кодом nonce :
Теперь, в обработке заброса необходимо проверить nonce код:
check_ajax_referer() работает на основе функции wp_verify_nonce() и по сути является её оберткой для AJAX запросов.
Обратите внимание, что в данном случае Nonce код создается в HTML коде. А это значит, что если у вас установлен плагин страничного кэширования, то этот код может и наверняка будет устаревать к моменту очередного AJAX запроса, потому что HTML код кэшируется.
2. Проверка прав доступа
Тут AJAX запросы будут срабатывать только для пользователей с правом указанным правом, например author . Для всех остальных, включая неавторизованных пользователей, AJAX запрос вернет ошибку.
Особенность тут в том, что не авторизованные пользователи тоже должны видеть сообщение об ошибке при AJAX запросе. Поэтому для них тоже нужно обрабатывать запрос и вернуть сообщение об ошибке:
Включаем кэширование для 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 плагины.
Вариант: вывод данных в лог файл
Если по ходу написания кода нужно заглянуть в переменную $myvar , то еще можно использовать такой код в обработчике ajax запроса:
В результате, в файл логов сервера (error.log) будет записано содержимое переменной $myvar . Так можно выполнить ajax, и заглянуть в лог.
Вариант: вывод PHP ошибок в лог файл
Чтобы выводить PHP заметки и ошибки в лог файл, нужно включить константу WP_DEBUG_LOG. Такой лог файл появится в папке wp-content.
Вариант:
Если не получается увидеть сообщение об ошибке и нужно работать в режиме разработчика, можно очистить буфер сразу перед возвратом данных:
После этого нужно посмотреть что возвращает запрос через дебаг браузера или как-то еще.
Вариант:
Также, для дебага можно воспользоваться инструментом FirePHP, который записывает ошибки в консоль браузера.
Ошибка при возвращении данных
Если AJAX запрос на в файл wp-admin/admin-ajax.php провалился, то будет возвращен ответ -1 или 0 .
- -1 — ошибка при проверке запроса. См. функцию check_ajax_referer()
- 0 — обработка запроса вернула пустой результат
- 0 — также возвращается по умолчанию во всех остальных случаях.
меню
Плагины
Плагин AJAX Simply — добавляет класс, с помощью которого можно удобно и быстро писать AJAX запросы на стороне клиента и ответы на стороне сервера.
Качественный и надежный сервис по продвижению в Телеграмме предлагает совершить недорогую покупку подписчиков в группу. На сайте Вы найдете массу выгодных предложений с индивидуальными условиями для каждого сообщества. Например, Вы можете выбрать оптимальную скорость поступления ресурса, которая доходит до 1000 единиц в сутки. Успейте сделать заказ, пока на сайте действуют оптовые скидки.
Источник
JQuery AJAX вызов в плагине WordPress не работает
Это очень близко к моей проблеме …. У меня есть очень простой плагин для WordPress, который предоставляет очень специфическую форму членства, он передает платеж в PayPal для обработки и только отправляет данные по электронной почте. С помощью одного и того же нажатия кнопки PayPal также существует сценарий jQuery, позволяющий зафиксировать нажатие кнопки «Отправить» и передать те же данные для создания другого сообщения электронной почты.
Все это работало до того, как переместить его в WordPress, теперь под плагином WordPress все работает, кроме функции AJAX при нажатии кнопки отправки. Когда форма оплаты отправлена, есть сценарий jQuery, который принимает нажатие кнопки отправки, а затем отправляет данные формы оплаты через AJAX.
Вот файл js … Когда я проверяю источник страниц, я вижу правильную строку заголовка WordPress, включающую скрипт js и выбирая ссылку в источнике, я получаю правильный файл js. Кроме того, предупреждение («помощь») всплывает также, когда без комментариев.
Вот код в myplugin в WordPress …..
Опять же, у меня была вся рабочая часть AJAX, прежде чем переместить форму членства в плагин WordPress. До WordPress AJAX просто отправлял данные формы в отдельный файл process.php на веб-сервере, чтобы вытащить несколько полей и создать сообщение электронной почты. Читая пост, перечисленный выше и многие другие, я не могу заставить AJAX работать под WordPress.
Решение
Я вижу, у вас есть action: ‘memreg_process_request’ , тем не мение action не признается в качестве собственности и далее не переходит $_POST[‘action’] = ‘memreg_process_request’ , Далее, переменная $(this) ссылается на запрос ajax; поэтому вам нужно кэшировать ссылку на переменную формы перед созданием запроса ajax:
Тогда внутри нашего data Конструктор, нам нужно определить действие и форму.
На самом деле, это должно быть структурировано как:
Конечно, ваши данные формы теперь доступны в $_POST[‘form’]
Как вы уже зарегистрировали add_action и у вас есть функция, которая обрабатывает запрос / ответ, больше ничего нет.
Другие решения
Вот изменения, которые я сделал, чтобы все это работало.
Я должен был изменить данные: & url: строки, чтобы сделать эту работу. По какой-то причине я не смог получить wp_localize_script для определения ajax_object.ajaxurl, я продолжал получать объект неопределенным, поэтому я просто использовал полный путь. Я использовал Firebug, чтобы увидеть ошибки, генерируемые скриптом jQuery. Предложение выше вызвало ошибки в Firebug после их попытки. Я искал много других сообщений, чтобы найти решение.
Я использовал «parce_str ($ _ POST [form], $ my_POST)», чтобы извлечь переданные данные из функции memreg_process_request_wp_ajax_function ().
Источник