Возвращает ответ в виде JSON в асинхронном AJAX-запросе.
«Возвращает» – это не значит, что результат действия функции можно присвоить в переменную. Тут имеется ввиду именно ответ от запроса AJAX.
Функция также прерывает выполнение PHP-кода в запросе функцией wp_die() и добавляет в заголовок ответа Content-Type: application/json
.
На её основе работают очень похожие функции wp_send_json_success() и wp_send_json_error().
wp_send_json( $response, $status_code = null, $options = 0 )
Параметры
- $data
- Данные, которые нужно преобразовать в JSON.
- $status_code
- (целое) Код ответа сервера. Их список можно найти здесь.
С версии WordPress 4.7.0 - $options
- В этом параметре можно передать один или несколько флагов-констант, задающих правила преобразования в JSON, эти константы описаны в документации PHP.
Использовать можно следующие константы:JSON_FORCE_OBJECT
,JSON_HEX_QUOT
,JSON_UNESCAPED_UNICODE
,JSON_INVALID_UTF8_IGNORE
,JSON_HEX_TAG
,JSON_HEX_AMP
,JSON_HEX_APOS
,JSON_INVALID_UTF8_SUBSTITUTE
,JSON_UNESCAPED_LINE_TERMINATORS
,JSON_NUMERIC_CHECK
,JSON_PARTIAL_OUTPUT_ON_ERROR
,JSON_PRESERVE_ZERO_FRACTION
,JSON_PRETTY_PRINT
,JSON_UNESCAPED_SLASHES
,JSON_THROW_ON_ERROR
С версии WordPress 5.6.0
Пример
В каких же ситуациях нам нужно получать ответ из асинхронного запроса в виде JSON?
Хороший пример – использование в фильтрации товаров. Допустим, что мы получаем несколько отдельных кусков данных из запроса – во-первых, отфильтрованные товары, во-вторых, какой-нибудь счётчик количества, типо «Найдено 5 товаров». И суть в том, что в вёрстке товары и счётчик количества выводятся в обсолютно разных местах. Поэтому мы должны получить их отдельно, чтобы не изменять весь HTML.
Давайте взглянем, как оно происходит непосредственно в JavaScript:
$( '#ajaxfilter' ).submit( function( event ) { event.preventDefault(); const el = $(this); $.ajax({ type : 'POST', url : ajax_url, data : el.serialize(), beforeSend : function( xhr ) { // врубаем анимацию прелоадера например }, success : function( data ) { // отдельно – сами товары $( '.products-wrapper' ).html( data.content ); // отдельно – счётчик товаров $( '.woocommerce-result-count' ).text( data.result_text ); } }); } );
Дальше – PHP-код внутри запроса. Я даже ограничусь строчками с использованием wp_send_json()
функции, если вам интересен полный пример – он тут.
// $content – в этой переменную мы записали HTML отфильтрованных // $found_products – в этой переменной число найденных товаров wp_send_json( array( 'content' => $content, 'result_text' => 'Всего товаров: ' . $found_products ) );