WP REST API возвращает HTML вместо JSON - PullRequest
0 голосов
/ 06 октября 2018

Конечная точка https://example.com/wp-json/wp/v2/pages/123 возвращает комбинацию формата HTML и JSON, например:

<div class="my-class">HTML Content</div>
{ "id" : 123, ... }

В functions.php имеется фильтр отрывков, который устанавливает выводимый HTML, в этой строке:

function my_custom_filter(){
  echo '<div class="my-class">HTML Content</div>';
}
add_filter ('the_excerpt', 'my_custom_filter' );

Как предотвратить вмешательство такого фильтра в ответ JSON?

1 Ответ

0 голосов
/ 06 октября 2018

Если вы можете изменить фильтр, то вы можете обнаружить API REST внутри функции фильтра, например:

function my_custom_filter(){
    if (! defined("REST_REQUEST")) {
        echo '<div class="my-class">HTML Content</div>';
   }
}
add_filter ('the_excerpt', 'my_custom_filter' );

Константа REST_REQUEST определяется только внутри запроса, который был обработанREST API.Таким образом, с помощью приведенного выше кода, если запрос обрабатывается обычным циклом запроса WP, константа не будет определена, поэтому добавленный нами оператор if оценивается как true, а echo будет выполняться как обычный,Если константа определена , то if будет оцениваться как ложное, и фильтр не добавит никакого вывода в ответ.

См. https://wpseek.com/constant/rest_request/

ОБНОВЛЕНИЕ : хотя приведенный выше код будет работать, я думаю, что мы можем добиться большего успеха.

Проблема в том, что если у вас много фильтров, каждый из них должен дублировать оператор if иваш код засоряется чеками на REST_REQUEST, которые

Вместо этого мы можем ввести проверки REST_REQUEST ранее в циклезаботясь о коде, который добавляет фильтр .

Это будет выглядеть так:

function my_custom_filter(){
    echo '<div class="my-class">HTML Content</div>';
}

if (! defined("REST_REQUEST")) {
    add_filter ('the_excerpt', 'my_custom_filter' );
    //add other HTML filters here
} else {
    //attach REST API actions
} 

Это похоже на небольшое изменение (если вы его поймаетерано, когда количество фильтров невелико), но это потенциально приносит некоторые большие преимущества:

  • он сохраняет REST_REQUEST проверкиl в одном месте: ремонтопригодность

  • фильтрам не нужно знать или заботиться о том, является ли это REST_REQUEST или нет - если их вызывают, онихорошо идти.Сохраняя это простым.

  • вы можете потенциально делать другие вещи, такие как ведение журнала или проверки доступа на основе ролей в этом месте: расширяемость

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

...