Вопрос или проблема
У меня есть 3 пользовательских типа записей: артисты, песни, видео. Песни и видео имеют метаданные, которые сортируют идентификатор артиста песен или видео. Фильтр в Rest API не мог вернуть отфильтрованные посты по метаданным идентификатора артиста.
Поэтому мне нужно вернуть это с помощью пользовательской функции и показать в Rest API.
Как создать функцию, которая сравнивает значение метаданных идентификатора артиста и возвращает пост, который имеет специфический идентификатор артиста?
Что-то вроде этого: /wp-json/wp/v2/songs?artist=4438, что возвращает песни, у которых значение метаданных артиста равно 4438.
Спасибо.
Я имею в виду, что вам нужно запрашивать по вашей пользовательской таксономии (например, songs_categories
или как бы вы ее ни назвали в вашей функции register_taxonomy()
), а затем по термину.
&filter[taxonomy]=songs_categories&filter[term]=artist
PS: В моем контексте я фильтрую через пользовательский фильтр, плагин, который улучшает API. Вы можете найти всю информацию в репозитории.
Ответ или решение
Для выполнения задачи фильтрации пользовательских записей в REST API WordPress по произвольному мета-полю, например, по ID артиста, необходимо создать пользовательскую функцию. Эта функция будет отвечать за обработку запроса и возврат соответствующих постов, которые соответствуют заданному ID артиста.
Шаг 1: Регистрация пользовательского маршрута REST API
Прежде всего, нужно зарегистрировать маршрут, чтобы API мог принимать запросы с фильтром по мета-полю. Это делается с помощью функции register_rest_route()
. Убедитесь, что эта функция добавлена в хуке rest_api_init
.
add_action('rest_api_init', function () {
register_rest_route('wp/v2', '/songs', array(
'methods' => 'GET',
'callback' => 'get_songs_by_artist_id',
));
});
Шаг 2: Создание функции для фильтрации по artist_id
Теперь создадим функцию get_songs_by_artist_id
, которая будет обрабатывать запросы и возвращать записи типа songs
с указанным ID артиста.
function get_songs_by_artist_id($request) {
$artist_id = $request->get_param('artist');
// Параметры для WP_Query
$args = array(
'post_type' => 'songs',
'meta_query' => array(
array(
'key' => 'artist_id', // Замените 'artist_id' на ваше мета-поле
'value' => $artist_id,
'compare' => '='
)
)
);
$query = new WP_Query($args);
// Проверка на наличие записей
if (!$query->have_posts()) {
return new WP_Error('no_songs', 'Записи не найдены', array('status' => 404));
}
$songs = array();
// Перебор записей и их добавление в массив
while ($query->have_posts()) {
$query->the_post();
$songs[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'artist_id' => get_post_meta(get_the_ID(), 'artist_id', true),
'content' => get_the_content(),
);
}
// Сбросить глобальные переменные post
wp_reset_postdata();
return new WP_REST_Response($songs, 200);
}
Шаг 3: Проверка функциональности
Теперь у вас есть возможность отправлять запросы к вашему API, используя URL в следующем формате:
/wp-json/wp/v2/songs?artist=4438
Этот запрос будет фильтровать записи типа songs
по мета-полю artist_id
, возвращая все записи, которые соответствуют указанному ID артиста.
Заключение
Реализуя вышеописанные шаги, вы создадите функционал, позволяющий фильтровать пользовательские записи в REST API WordPress по произвольному мета-полю. Это позволит улучшить работу с API и предоставит более удобные способы получения данных для фронтенда вашего приложения.
Благодаря такой настройке вы сможете легко расширять свое API, добавляя новые параметры фильтрации или изменяя логику обработки на основе ваших требований.