Вопрос или проблема
Я использую следующий код, чтобы получить последний пост из категории
www.mysite.com/wp-json/mynamespace/v1/latest-posts?category=it
но возникает ошибка
<?php
/**
*
* Получить последний пост из категории!
* @param array $params Параметры для функции.
* @return string|null Название поста для последнего поста или null, если нет
*
*/
function get_latest_post ( $params ){
$post = get_posts( array(
'category' => $category,
'posts_per_page' => 1,
'offset' => 0
) );
if( empty( $post ) ){
return null;
}
return $post[0]->post_title;
}
// Зарегистрируйте маршрут rest здесь.
add_action( 'rest_api_init', function () {
register_rest_route( 'mynamespace/v1', 'latest-post',array(
'methods' => 'GET',
'callback' => 'get_latest_post'
) );
} );
?>
Во-первых, вы зарегистрировали маршрут “latest-post”, но используемый URL – “latest-posts”.
Во-вторых: В вашей функции “get_latest_post” используется переменная $category, но она нигде не установлена.
Исправьте функцию следующим образом:
function get_latest_post ( $params ){
if(isset($params['category'])){
$post = get_posts( array(
'category' => $params['category'],
'posts_per_page' => 1,
'offset' => 0
) );
if( empty( $post ) ){
return new WP_Error( 'no_post_found', 'в этой категории нет постов', array( 'status' => 404 ) );
}
$returnage = new WP_REST_Response( array('post_title' => $post[0]->post_title) );
$returnage->set_status( 200 );
return $returnage;
} else {
return new WP_Error( 'no_category_given', 'добавьте параметр категории', array( 'status' => 404 ) );
}
}
(WP_Errors и WP_REST_Response гарантируют, что вы получаете действительный ответ JSON REST API из вашей функции)
Ответ или решение
Вам нужно получить последний пост из определенной категории на сайте, используя REST API WordPress. Рассмотрим ваш код и рассмотрим, какие изменения необходимы для достижения цели.
Проблемы в исходном коде
-
Несоответствие URL-адресов: Вы зарегистрировали маршрут "latest-post", но используете URL "latest-posts". Это приведет к тому, что сервер не сможет распознать ваш запрос.
-
Отсутствие переменной $category: В вашей функции
get_latest_post
используется переменная$category
, но она не определена. Это вызовет ошибку.
Исправленный код
Вот как можно изменить вашу функцию, чтобы она корректно исполнялась:
function get_latest_post( $params ) {
// Проверка наличия 'category' в параметрах
if ( isset( $params['category'] ) ) {
$category_id = $params['category']; // Получение идентификатора категории
$post = get_posts( array(
'category' => $category_id,
'posts_per_page' => 1,
'offset' => 0
) );
if ( empty( $post ) ) {
return new WP_Error( 'no_post_found', 'Нет постов в данной категории', array( 'status' => 404 ) );
}
// Создание ответа
$response = new WP_REST_Response( array( 'post_title' => $post[0]->post_title ) );
$response->set_status( 200 );
return $response;
} else {
return new WP_Error( 'no_category_given', 'Пожалуйста, укажите параметр категории', array( 'status' => 404 ) );
}
}
// Регистрация REST маршрута
add_action( 'rest_api_init', function () {
register_rest_route( 'mynamespace/v1', 'latest-posts', array(
'methods' => 'GET',
'callback' => 'get_latest_post'
) );
} );
Детали улучшений
-
Исправление маршрута: Измените зарегистрированный маршрут на ‘latest-posts’, чтобы соответствовать вызываемому URL.
-
Проверка параметра категории: Функция теперь проверяет, передан ли параметр
category
, и использует эти данные для получения постов. -
Возврат ошибок: Использование
WP_Error
позволяет возвращать понятные JSON ошибки, что улучшает обработку ошибок при работе через REST API. -
Ответ в формате JSON: Используя
WP_REST_Response
, вы получаете хорошо структурированный ответ, который удобно использовать в клиентских приложениях.
Теперь ваш код будет работать корректно и предоставлять последний пост из указанной категории в формате JSON, что особенно полезно для взаимодействия с современными веб-приложениями.