Вопрос или проблема
Я пытаюсь использовать REST API v2, чтобы заполнить модальное окно при клике на элемент пользовательского типа записи проекта.
У проектов есть собственная таксономия, Навыки. Я использую ?_embed в JSON URL, и он возвращает элементы пользовательской таксономии, но ограничивается 10 терминами для каждого возвращенного элемента проекта. Я не могу сделать ничего, чтобы вернуть ВСЕ отмеченные Навыки для данного элемента проекта.
Я обновил общие настройки пагинации в настройках WordPress до 20, думая, что это изменит количество связанных терминов таксономии, возвращаемых: никаких изменений.
Я добавил следующий метод, чтобы сделать таксономию доступной через REST:
add_action( 'init', 'my_custom_taxonomy_rest_support', 25 );
function my_custom_taxonomy_rest_support() {
global $wp_taxonomies;
$taxonomy_name="skill";
if ( isset( $wp_taxonomies[ $taxonomy_name ] ) ) {
$wp_taxonomies[ $taxonomy_name ]->show_in_rest = true;
$wp_taxonomies[ $taxonomy_name ]->posts_per_page = -1;
}
}
И я пробовал все варианты per_page, posts_per_page и использовал -1, 0, 99 безрезультатно. Я не могу найти ничего о том, что это является проблемой для кого-то еще, поэтому немного сбит с толку, что делать в этой ситуации. Если проект отмечен 14 навыками, максимум, что я могу получить из REST API, это 10 терминов таксономии Навыков для каждого проекта.
Кто-нибудь знает, как изменить лимит на неограниченный?
Вы можете попробовать это
/*
* Увеличить лимит записей на страницу в json
*/
add_filter( 'rest_your_collection_params', function ( $params, WP_Post_Type $post_type ) {
if ( 'your_cpt' === $post_type->name && isset( $params['per_page'] ) ) {
$params['per_page']['maximum'] = 99;
}
return $params;
}, 10, 2 );
Ссылаясь на это: “При встраивании ответа коллекции (…) встроенная коллекция будет иметь примененные предельные значения пагинации по умолчанию.”
Если вы не задали эти параметры для маршрута REST таксономии, то это, вероятно, по умолчанию будет равно 10.
Кроме того, вы можете отфильтровать параметр per_page для всех встраиваний:
/** измените предельное значение встраиваний в запросах rest
* @link https://github.com/WordPress/WordPress/blob/5.6-branch/wp-includes/rest-api/class-wp-rest-server.php#L1123
* @link https://developer.wordpress.org/reference/classes/wp_rest_request/get_param/
* @link https://developer.wordpress.org/reference/classes/wp_rest_request/set_param/
*/
function na_rest_embeds_set_per_page_param($response, $handler, $request) {
if($request->get_param('context') === 'embed') {
$request->set_param('per_page',100);
}
}
add_filter( 'rest_request_before_callbacks', 'na_rest_embeds_set_per_page_param', 10, 3 );
Привязывайтесь здесь, проверьте, является ли context embed, а затем установите параметр per_page на, например, 100.
Ответ или решение
Чтобы вернуть все термины собственного таксономии для поста в REST API V2 WordPress, вам необходимо выполнить несколько шагов, так как по умолчанию API ограничивает количество возвращаемых термов до 10. Это может стать проблемой при работе с пользовательскими типами постов и таксономиями, особенно если проект может иметь более 10 прикрепленных навыков (Skills).
Шаг 1: Настройка таксономии для включения в REST API
Убедитесь, что вы правильно настроили отображение вашей пользовательской таксономии в REST API. В вашем случае вы уже добавили код, который включает таксономию в REST API. Однако убедитесь, что вы правильно используете show_in_rest
и устанавливаете параметры:
add_action('init', 'my_custom_taxonomy_rest_support', 25);
function my_custom_taxonomy_rest_support() {
global $wp_taxonomies;
$taxonomy_name = "skill"; // Название вашей таксономии
if (isset($wp_taxonomies[$taxonomy_name])) {
$wp_taxonomies[$taxonomy_name]->show_in_rest = true; // Включение в REST API
}
}
Шаг 2: Изменение параметров запроса в REST API
Для увеличения лимита терминов, возвращаемых в ответе, вы можете использовать фильтр rest_request_before_callbacks
, чтобы установить параметр per_page
для встраиваемых запросов:
function na_rest_embeds_set_per_page_param($response, $handler, $request) {
if ($request->get_param('context') === 'embed') {
$request->set_param('per_page', 100); // Увеличиваем лимит до 100 (или любое другое число)
}
}
add_filter('rest_request_before_callbacks', 'na_rest_embeds_set_per_page_param', 10, 3);
Шаг 3: Увеличение максимального лимита на уровне таксономии
Для повышения лимита возвращаемых терминов на уровне таксономии вы также можете использовать фильтр rest_your_collection_params
. Замените your_cpt
на ваш пользовательский тип поста:
add_filter('rest_skill_collection_params', function ($params, WP_Post_Type $post_type) {
if ('your_cpt' === $post_type->name && isset($params['per_page'])) {
$params['per_page']['maximum'] = 100; // Устанавливаем максимальное количество
}
return $params;
}, 10, 2);
Шаг 4: Проверка и тестирование
После внесения всех изменений проверьте, работает ли обновленный лимит. Выполните запрос к REST API, используя вашу конечную точку с параметром ?_embed
, чтобы убедиться, что теперь возвращаются все термины вашей таксономии.
Заключительные мысли
Эти шаги помогут вам вернуть все термины пользовательской таксономии, связанные с вашим проектом, без ограничения до 10. Убедитесь, что вы проверяете изменения, чтобы гарантировать правильную работу вашего модуля. Настройка REST API может быть сложной, но с помощью правильных фильтров и параметров вы сможете достичь желаемого результата и улучшить опыт пользователей вашего приложения.