PHP и отправка в очередь

wordpress-enqueue

Есть две части в PHP скрипте на стороне сервера, которые необходимы для реализации AJAX связи. Во-первых, мы должны поставить в очередь jQuery скрипт на веб-страницу и локализовать любые значения PHP, которые нужны скрипту jQuery. Во-вторых, фактическая обработка AJAX запроса.

Отправка скрипта в очередь

В этом разделе рассматриваются две основные особенности AJAX в WordPress, где опытные, но новые в WordPress разработчики спотыкаются. Одной из них является необходимость ставить в очередь скрипты для того, чтобы мета ссылки правильно отображались в head страницы. Другая, это то, что все AJAX-запросы должны быть отправлены через wp-admin/admin-ajax.php. Никогда не отправляйте запросы напрямую на ваши страницы плагина.

Отправка в очередь

Используйте функцию wp_enqueue_script(), чтобы WordPress вставил мета ссылку на ваш скрипт в разделе страницы. Никогда жестко не прописывайте такие ссылки в шаблоне заголовка. Как разработчик плагина, вы не имеете доступ к шаблону заголовка, но это правило стоит упомянуть в любом случае.

Функция отправки в очередь принимает три параметра. Первый — произвольный тег или обработчик, который используется для обозначения вашего скрипта в других функциях. Второй — полный URL к вашему файлу скрипта. Для портативности, используйте plugins_url(), чтобы построить правильный URL. Если вы отправляете в очередь скрипт для чего-то, кроме плагина, используйте некоторые связанные функции, чтобы создать правильный URL — не привязывайте его жестко. Третий параметр — массив любых тегов, от которых зависит ваш скрипт. Так как мы используем jQuery для отправки запроса AJAX, вам по крайней мере нужно перечислить «jquery» в массиве. Всегда используйте массив, даже если это для одной зависимости. Вызов поставки в очередь для нашего примера выглядит следующим образом:

Вы не можете поставить в очередь скрипты непосредственно из вашей страницы кода плагина, когда она будет загружена. Скрипты должны быть в очереди в одном из нескольких экшен хуков — какого, зависит от того, с каким типом страницы должен быть связан ваш скрипт. Для страниц администратора, используйте admin_enqueue_scripts. Для frontend страниц используют wp_enqueue_scripts, за исключением страниц входа, в этом случае используют login_enqueue_scripts.

Хук admin_enqueue_scripts передает имя файла текущей страницы вашей функции обратного вызова. Используйте эту информацию только для отправки в очередь скриптов на страницах, где это необходимо. Фронтенд версия ничего не передает. В этом случае, используйте теги шаблона, такие как is_home(), is_single(), и т.д., чтобы убедиться, что вы поставили в очередь ваш скрипт только там, где это необходимо. Это полный код поставки в очередь для нашего примера:

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

Регистрация vs Отправка в очередь

Вы увидите примеры в других туториалах, которые скрупулезно используют wp_register_script(). Это нормально, но его использование не является обязательным. То, что не опционально, это wp_enqueue_script(). Эта функция должна быть вызвана для того, чтобы ваш скрипт должным образом был связан со страницей. Так зачем нужно регистрировать скрипты? Это создает полезный тег или обработчик с помощью которого можно легко ссылаться на скрипт в различных частях кода по мере необходимости. Если вам просто нужно, чтобы ваш скрипт был загружен и нет нужды ссылаться на него в других местах в коде, то и нет необходимости регистрировать его.

Одноразовое число (nonce)

Вы должны создать одноразовое число, так что jQuery AJAX-запрос может быть подтвержден как подлинный запрос вместо потенциально не подлинного запроса от злоумышленника. Только ваш PHP скрипт и jQuery скрипт будут знать это значение. Когда запрос получен, вы можете проверить это значение. Вот как создать одноразовое число для нашего примера:

Параметр title_example может быть любой произвольной строкой. Предполагается, что строка будет связана с тем, для чего одноразовое число используется, но здесь может быть все, что подходит именно Вам.

Локализация

Если вы помните из раздела jQuery, данные, созданные PHP для использования jQuery были переданы в глобальный объект с именем my_ajax_obj. В нашем примере, этими данными были одноразовое число и полный URL к admin-ajax.php. Процесс присвоения свойств объекта и создание глобального объекта jQuery называется локализация. Этот код локализации используется в нашем примере, который использует wp_localize_script().

Обратите внимание, как привязка нашего скрипта ajax-script используется так, что глобальный объект присваивается правильному скрипту. Объект является глобальным для нашего скрипта, не для всех скриптов. Локализация также может быть вызвана из того хука, который используется для отправки в очередь скриптов. То же самое для создания одноразового числа, хотя эта конкретная функция может быть вызвана практически в любом месте. Все это, объединенное в одном хуке обратного вызова выглядит следующим образом:

AJAX экшен

Другой основной частью PHP кода на стороне сервера является фактический обработчик AJAX, который получает отправленные данные, делает что-то с ними, а затем отправляет соответствующий ответ обратно в браузер. Это принимает вид WordPress экшен хука. Какой тег хука использовать, зависит от того, залогинен пользователь или нет и какое значение ваш jQuery скрипт передает в качестве action: значение.

Примечание: $_GET, $_POST и $_COOKIE vs $_REQUEST. Вы наверняка использовали одну или более из супер глобальных переменных PHP, таких как $_GET или $_POST для извлечения значений из формы или куки (с помощью $_COOKIE). Может быть, вы предпочитаете $_REQUEST, или по крайней мере видели ее раньше. Это неплохо — независимо от метода запроса, POST или GET, она будет иметь значения формы. Работает отлично для страниц, которые используют оба метода. Кроме того, она также содержит значение куки. В этом и загвоздка! В случае конфликта имен, значения куки перезаписывают любые значения формы. Таким образом, это до смешного легко для злоумышленника, создать поддельные куки в браузере, которые перепишут любые значения формы, которые можно ожидать из запроса. $_REQUEST это путь для хакеров, чтобы создать инъекции произвольных данных в значения вашей формы. Для большей безопасности, придерживайтесь специфических переменных и избегайте использования всего под одну гребенку.

Так как наш AJAX-обмен для страницы настроек плагина, пользователь должен быть залогинен. Если вы помните из раздела jQuery, то action:value будет «my_tag_count«. Это означает, что наш тег экшен хука будет wp_ajax_my_tag_count. Если бы наш AJAX-запрос был использован пользователями, которые в настоящее время не вошли в систему, тег экшен хука был бы wp_ajax_nopriv_my_tag_count. Основной код, который используется для подключения к экшену выглядит так:

Первое, что ваш AJAX обработчик должен сделать, это проверить одноразовое число, посланное jQuery с помощью check_ajax_referer(), которое должно быть таким же значением, которое было локализовано, когда скрипт был поставлен в очередь.

Предоставленный параметр должен быть идентичным параметру, предоставленному ранее в wp_create_nonce(). Функция просто умирает, если одноразовое число не пройдет проверку. Если бы это было истинное одноразовое число, то теперь, когда оно было использовано, значение больше не подходит. Затем нужно было бы генерировать новое и отправить его в скрипт обратного вызова, так, что оно может быть использовано для следующего запроса. Но так как одноразовые числа WordPress живут в течение двадцати четырех часов, вам не нужно ничего делать, кроме как проверить его.

Данные

С одноразовым числом, кстати, наш обработчик может справиться с данными, передаваемыми jQuery скриптом, содержащимися в $_POST['title']. Мы можем сохранить выбор пользователя в пользовательских мета с помощью update_user_meta().

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

Наконец, мы можем отправить ответ обратно в скрипт jQuery. Есть несколько способов передачи данных. Давайте посмотрим на некоторые из вариантов, прежде чем иметь дело со спецификой нашего примера.

XML

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

JSON

Этот формат легкий и простой в использовании и WordPress предоставляет wp_send_json функцию для JSON-кодирования своего ответа, выводит его и умирает — эффективная замена для WP_Ajax_Response. WordPress также предоставляет функции wp_send_json_success и wp_send_json_error, которые позволяют запустить соответствующие done() или fail() колбеки в JS.

Другие

Вы можете передавать данные как угодно, до тех пор, пока отправитель и получатель скоординированы. Текстовые форматы, такие как разделенные запятыми или табуляцией являются одними из многих возможностей. Для небольших объемов данных, отправка необработанного потока может быть допустимым. Это то, что мы будем делать с нашим примером — мы вышлем фактическую HTML замену, ничего больше.

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

Убить процесс

Когда обработчик закончил все свои задачи, он должен умереть. Если вы используете WP_Ajax_Response или wp_send_json* функции, это автоматически делается за вас. Если нет, просто используйте WordPress функцию wp_die().

AJAX обработчик  — итог

Полный AJAX обработчик для нашего примера выглядит следующим образом:

Навигация по разделам:

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *