Вопрос или проблема
У меня есть вопрос относительно обновления поста.
Мы используем API WordPress для управления статьями и всем вокруг, категориями, тегами… У нас есть сценарий, когда при создании поста, то есть POST /wp/v2/posts
, если категория не указана, для этого поста выбирается категория по умолчанию. Это то, что нам нужно, и это работает прекрасно.
Но затем, когда мы хотим обновить пост, то есть POST /wp/v2/posts/<id>
, мы хотели бы, чтобы, если категория не указана в теле, выбиралась категория по умолчанию. В данный момент это не происходит. В этом случае категории никак не изменяются. Если я явно указываю null для категорий, то у нас просто пост без категории.
Есть идеи, как установить категорию по умолчанию при обновлении поста?
Ответ или решение
Теория
Когда вы работаете с WordPress API для управления постами, важно понимать логику работы с категориями, особенно в контексте создания и обновления записей. WordPress по умолчанию использует категорию "Без категории" для новых публикаций, если не была указана другая категория. Однако, при обновлении существующего поста через API, родная функциональность WordPress не предусматривает автоматического выбора категории по умолчанию, если параметры категории вовсе не указаны. Это может привести к ситуации, когда пост остается без категории после обновления, что может негативно сказаться на его представлении и структурности в рамках сайта.
Пример
Рассмотрим типичную ситуацию: при создании нового поста через API, используемый эндпоинт POST /wp/v2/posts
позволяет указать категории, но если категория не указана, WordPress автоматически применяет категорию по умолчанию. Тем не менее, при использовании эндпоинта POST /wp/v2/posts/<id>
для обновления поста, API требуемой вами функциональности не предоставляет, и если ни одна категория не задается, текущие категории остаются неизменными. Если в теле запроса задать categories: null
, это может вызвать удаление всех существующих категорий из поста.
Применение
Для решения этой проблемы, вы можете рассмотреть реализацию собственных методов для программного выбора категории по умолчанию при обновлении поста. Одним из наиболее эффективных путей будет создание пользовательской функции, которая будет перехватывать запросы на обновление и выполнять проверку — если категории не заданы в теле запроса, система самостоятельно применяет категорию по умолчанию.
Вот один из возможных подходов:
-
Создание пользовательского плагина или внедрение кода в файл
functions.php
текущей темы:Вы можете прослушивать REST API-запросы, используя хук-обработчики WordPress. Пример кода:
function set_default_category_on_update($post, $request, $creating) { if (!$creating) { // Проверяем, что это обновление, а не создание $categories = $request->get_param('categories'); if (is_null($categories)) { // Если категории отсутствуют в запросе $default_category = get_option('default_category'); // Получаем ID категории по умолчанию // Проверяем задана ли категория по умолчанию и устанавливаем её if ($default_category) { wp_set_post_categories($post->ID, array($default_category)); } } } } add_action('rest_after_insert_post', 'set_default_category_on_update', 10, 3);
-
Обработка запроса на стороне клиента:
Если у вас есть возможность управлять логикой на стороне клиента до отправки запроса на обновление поста, следует включить проверку на наличие категории в данных отправки. Если категория не указана, добавьте туда категорию по умолчанию:
async function updatePost(postId, postData) { if (!postData.categories) { const defaultCategoryId = await getDefaultCategoryId(); // Запросите или задайте ID по умолчанию postData.categories = [defaultCategoryId]; } const response = await fetch(`/wp/v2/posts/${postId}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' }, body: JSON.stringify(postData) }); return response.json(); }
Заключение
Автоматическое применение категории по умолчанию при обновлении поста требует небольшой настройки в вашей средней рабочей среде с использованием WordPress. Это не решается встроенными инструментами WordPress и требует либо серверной (PHP) логики, либо клиентской (JavaScript) обработки. Настройка и тестирование этого решения обеспечит, что каждый обновляемый пост сохраняет необходимую категорию, улучшая общую организацию контента.