Establecer categoría predeterminada para Custom Post Type al guardar automáticamente
He estado buscando durante horas y consultado múltiples publicaciones, pero no logro que esto funcione.
Tengo este extraño error donde los usuarios no pueden ver sus borradores de un custom post type si no asignan una categoría. Si hacen clic en 'guardar borrador' y quieren volver más tarde, no será visible para ellos (yo tengo que entrar como admin y asignar una categoría para que sea visible). No sé por qué ocurre esto pero estoy dispuesto a encontrar una solución.
En Ajustes > Escritura puedes establecer la categoría predeterminada para un post normal, pero no hay tal opción para custom post types. Me conformo con establecer el tipo predeterminado como 'Sin categorizar', igual que con los posts normales. Eso es lo que estoy tratando de lograr.
Algunos fragmentos que he encontrado como este están dirigidos a 'categoría predeterminada al publicar', pero yo necesito que sea al guardar automáticamente (algunos usuarios solo tienen acceso a 'guardar borrador' y 'enviar para publicación'). Al menos 6 que encontré no tenían respuesta.
Implementé un código específico sin éxito (no puedo encontrar el fragmento, pero la categoría predeterminada que usaban era 'autores'). Esto me está volviendo loco, y agradecería mucho su ayuda. Gracias.
EDIT: Probé el siguiente código (que obtuve aquí) y logré que 'sin categorizar' se marque automáticamente al guardar para el post type 'community', pero el problema es que sobrescribe otras categorías que puedas asignar. Es decir, si desmarcas 'sin categorizar' y eliges categorías significativas, al 'publicar' o 'guardar', todas esas selecciones se borran y vuelve a 'community'. Necesito que solo tenga 'sin categorizar' hasta que el usuario reemplace esa categoría predeterminada (exactamente como funciona la categoría predeterminada con el tipo 'post' normal).
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');
Utiliza el gancho de acción save_post y en la función de callback usa la función wp_set_object_terms( $object_id, $terms, $taxonomy, $append ).
Para tu tipo de entrada personalizada, el código puede ser así:
function save_book_meta( $post_id, $post, $update ) {
$slug = 'book'; //Slug del CPT
// Si esto no es una entrada 'book', no la actualices.
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 - El contexto en el que relacionar el término con el objeto. Puede ser category, post_tag o el nombre de otra taxonomía.
$term_id - ID del término de la taxonomía
No conozco tu proyecto a fondo, así que puedes considerar este fragmento como una forma de hacer lo que querías hacer.
Para más referencia, visita estos dos enlaces dados a continuación:
https://codex.wordpress.org/Function_Reference/wp_set_object_terms
https://codex.wordpress.org/Plugin_API/Action_Reference/save_post
Espero que encuentres una solución.

gracias por tu respuesta. como mencioné en el post principal, quiero que la categoría sea 'sin categorizar' y el tipo de publicación se llama 'comunidad'. sin embargo, lo crítico es que cuando se presione 'publicar', 'actualizar', 'guardar borrador', 'enviar para revisión' o cualquier otra opción, las NUEVAS categorías que el usuario elija para reemplazar 'sin categorizar' no sean sobrescritas (como ocurre con el código que acabo de agregar en el post principal).

Probé varias iteraciones del código que sugeriste, pero no logré que nada funcionara. El que pensé que tenía más probabilidades de funcionar fue:
`function save_community_meta( $post_id, $post, $update ) {
$slug = 'community'; //Slug del CPT
// Si no es una publicación de 'comunidad', no la actualices.
if ( $community != $post->post_type ) {
return;
}
wp_set_object_terms( get_the_ID(), $category, $uncategorized);
}
add_action( 'save_community', 'save_community_meta', 10, 3 );`

(perdón por el desorden... no puedo formatear las categorías tan ordenadamente como los posts)

Estoy usando pods.io para construir mis CPTs (Custom Post Types) y taxonomías personalizadas. Tenía el mismo problema. Con el código de @mishu, pude lograr mi objetivo.
function event_preset_category( $post_id, $post, $update ) {
$slug = 'termine'; //Slug del CPT
// Si este no es el slug correcto, no actualizarlo
if ( $slug != $post->post_type ) {
return;
}
// Obtener el ID de la categoría predeterminada/respaldo
// $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 );

¿Hay alguna manera de hacer esto antes del guardado automático? ¿Para que una categoría predeterminada se seleccione al crear la publicación?

Si entiendo correctamente, todo lo que necesitas hacer es agregar el parámetro opcional $append como true (el valor predeterminado es false)
wp_set_object_terms( int $object_id, string|int|array $terms, string $taxonomy, bool $append = false )
Por ejemplo, en el código que publicaste: wp_set_object_terms( $post_ID, $uncategorized, 'category', true);
Eso funcionó para mí.

Es posible hacerlo de esta manera. Si otras respuestas no funcionaron, puedes intentar esto:
function auto_category( $post_id, $post, $update ) {
$slug = 'news'; //Slug del CPT (Custom Post Type)
// Si este no es el slug correcto, no lo actualices.
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 );
