Установка категории по умолчанию для пользовательского типа записи при автосохранении
Я искал решение несколько часов и просмотрел множество постов, но мне не удаётся заставить это работать.
У меня есть странная ошибка, когда пользователи не видят свои черновики пользовательского типа записи, если не назначают им категорию. То есть, если они просто нажимают "Сохранить как черновик" и хотят вернуться к нему позже, они не смогут его увидеть (мне приходится заходить как администратор и устанавливать категорию, чтобы они могли его увидеть). Я не понимаю, почему это происходит, но готов найти обходное решение.
В Настройках > Письмо можно установить категорию по умолчанию для обычной записи, но такой опции нет для пользовательского типа записи. Меня устраивает установка категории по умолчанию "Без рубрики", как это сделано для обычных записей. Я пытаюсь этого добиться.
Некоторые фрагменты кода, которые я находил, например этот, предназначены для "категории по умолчанию при публикации", но мне нужно при автосохранении (некоторые пользователи имеют доступ только к "сохранить черновик" и "отправить на публикацию"). Как минимум 6 подобных вопросов остались без ответа.
Я попытался реализовать один конкретный код без успеха (не могу найти этот фрагмент, но в примере использовалась категория по умолчанию "authors"). Это сводит меня с ума, и я был бы очень благодарен за вашу помощь. Спасибо.
РЕДАКТИРОВАТЬ: Я попробовал следующий код (который взял отсюда) и добился того, что "Без рубрики" автоматически выбирается при сохранении для типа записи "community", но проблема в том, что он полностью перезаписывает другие категории, которые вы можете выбрать. То есть, если вы снимете выбор с "Без рубрики" и выберете осмысленные категории, при "публикации" или "сохранении" все эти выборы стираются, и возвращается "community". Нужно, чтобы была только "Без рубрики" до тех пор, пока пользователь не заменит эту категорию по умолчанию (точно так же, как работает категория по умолчанию для обычного типа "post").
function add_comm_category_automatically($post_ID) {
global $wpdb;
if(!wp_is_post_revision($post_ID)) {
$uncategorized= array (1);
wp_set_object_terms( $post_ID, $uncategorized, 'category');
}
}
add_action('save_post', 'add_comm_category_automatically');
Используйте хук save_post и в callback-функции примените функцию wp_set_object_terms( $object_id, $terms, $taxonomy, $append ).
Для вашего пользовательского типа записи код может выглядеть так:
function save_book_meta( $post_id, $post, $update ) {
$slug = 'book'; // Слаг вашего CPT
// Если это не запись типа 'book', не обновляем её.
if ( $slug != $post->post_type ) {
return;
}
wp_set_object_terms( get_the_ID(), $term_id, $taxonomy );
}
add_action( 'save_post', 'save_book_meta', 10, 3 );
$taxonomy - Контекст, в котором термин связан с объектом. Это может быть category, post_tag или название другой таксономии.
$term_id - ID термина таксономии
Я не знаю деталей вашего проекта, поэтому вы можете рассматривать этот фрагмент как один из способов сделать то, что вы хотели.
Для дополнительной информации посетите эти две ссылки:
https://codex.wordpress.org/Function_Reference/wp_set_object_terms
https://codex.wordpress.org/Plugin_API/Action_Reference/save_post
Надеюсь, вы найдёте решение.

спасибо за ваш ответ. как я сказал в основном посте, я хочу, чтобы категория была 'uncategorized', а тип записи называется 'community'. однако, что важно, я хочу, чтобы при нажатии на 'опубликовать', 'обновить', 'сохранить черновик', 'отправить на рецензию' или что-то еще, НОВЫЕ категории, которые пользователь выбирает для замены 'uncategorized', не перезаписывались (как это происходит с кодом, который я только что добавил в основном посте).

Я попробовал несколько вариантов кода, который вы предложили, но ни один не сработал. Тот, который, как мне казалось, имел наибольшие шансы на успех, был:
`function save_community_meta( $post_id, $post, $update ) {
$slug = 'community'; //Slug of CPT
// Если это не запись типа 'community', не обновлять её.
if ( $community != $post->post_type ) {
return;
}
wp_set_object_terms( get_the_ID(), $category, $uncategorized);
}
add_action( 'save_community', 'save_community_meta', 10, 3 );`

(извините за беспорядок... у меня не получается форматировать категории так же аккуратно, как посты)

Я использую pods.io для создания своих пользовательских типов записей (CPT) и таксономий. У меня была такая же проблема. С помощью кода от @mishu мне удалось достичь своей цели.
function event_preset_category( $post_id, $post, $update ) {
$slug = 'termine'; //Ярлык (slug) CPT
// Если это не нужный ярлык, не обновляем
if ( $slug != $post->post_type ) {
return;
}
// Получаем ID категории по умолчанию/резервной
// $default_term = get_term_by('slug', 'your_term_slug', 'your_custom_taxonomy');
$default_term = get_term_by('slug', 'alle', 'termin_cat');
wp_set_object_terms( get_the_ID(), $default_term->term_id, 'termin_cat' );
}
add_action( 'save_post', 'event_preset_category', 10, 3 );

Есть ли способ сделать это до автосохранения? Чтобы категория по умолчанию выбиралась при создании записи?

Если я правильно понял, все, что вам нужно сделать, это добавить необязательный параметр $append как true (по умолчанию false)
wp_set_object_terms( int $object_id, string|int|array $terms, string $taxonomy, bool $append = false )
Например, в вашем коде: wp_set_object_terms( $post_ID, $uncategorized, 'category', true);
Это сработало у меня.

Это можно сделать таким способом. Если другие ответы не сработали, попробуйте следующий вариант:
function auto_category( $post_id, $post, $update ) {
$slug = 'news'; // Ярлык (slug) произвольного типа записи
// Если это не тот самый ярлык, не обновляем категорию
if ( $slug != $post->post_type ) {
return;
}
$category_term = get_term_by( 'name', 'news_category_slug', 'category' );
wp_set_object_terms( get_the_ID(), $category_term->term_id, 'category' );
}
add_action( 'save_post', 'auto_category', 10, 3 );
