¿Cómo agregar etiquetas a un tipo de entrada personalizada?
Tengo un tipo de entrada personalizada (custom post type) llamado portfolio
y estoy tratando de agregarle la taxonomía de etiquetas, ¿cómo puedo hacer esto?

O simplemente agrega:
'taxonomies' => array('post_tag')
Un arreglo de taxonomías registradas como
category
opost_tag
que serán usadas con este tipo de contenido. Esto puede usarse en lugar de llamar directamente aregister_taxonomy_for_object_type()
. Las taxonomías personalizadas aún necesitan registrarse conregister_taxonomy()
.
al arreglo $args
en el archivo functions.php
donde creas el tipo de contenido personalizado con register_post_type()
. Esto agregará un tipo de contenido personalizado para usar las mismas categorías y/o etiquetas que las entradas normales.

Así: (Donde dice "portfolio" es donde se registra la taxonomía para un tipo de publicación)
add_action( 'init', 'create_tag_taxonomies', 0 );
//crear dos taxonomías, géneros y etiquetas para el tipo de publicación "tag"
function create_tag_taxonomies()
{
// Añadir nueva taxonomía, NO jerárquica (como etiquetas)
$labels = array(
'name' => _x( 'Etiquetas', 'taxonomy general name' ),
'singular_name' => _x( 'Etiqueta', 'taxonomy singular name' ),
'search_items' => __( 'Buscar Etiquetas' ),
'popular_items' => __( 'Etiquetas Populares' ),
'all_items' => __( 'Todas las Etiquetas' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Editar Etiqueta' ),
'update_item' => __( 'Actualizar Etiqueta' ),
'add_new_item' => __( 'Añadir Nueva Etiqueta' ),
'new_item_name' => __( 'Nombre de Nueva Etiqueta' ),
'separate_items_with_commas' => __( 'Separar etiquetas con comas' ),
'add_or_remove_items' => __( 'Añadir o eliminar etiquetas' ),
'choose_from_most_used' => __( 'Elegir de las etiquetas más usadas' ),
'menu_name' => __( 'Etiquetas' ),
);
register_taxonomy('tag','portfolio',array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'update_count_callback' => '_update_post_term_count',
'query_var' => true,
'rewrite' => array( 'slug' => 'tag' ),
));
}
?>

@JoeBobby probablemente valdría la pena revisar la página del Codex de WordPress sobre el registro de taxonomías para tener una mejor idea de todas las opciones disponibles: http://codex.wordpress.org/Function_Reference/register_taxonomy

Solo una nota: esto está creando una taxonomía completamente nueva llamada 'tag' en lugar de añadir la taxonomía existente 'post_tag' al tipo de contenido personalizado.

@chifliiiii cómo obtener estas etiquetas en la página individual de la entrada con enlaces a las etiquetas, cómo crear una plantilla para la página de etiquetas

Estoy de acuerdo con Jake, siento que esto no resuelve el problema. La respuesta de @Marcus debería ser la marcada como aceptada.

¿cómo acceder a la plantilla para esta taxonomía 'tag'? ¿Cuál es el nombre de la plantilla?

Usa esto:
add_action( 'init', 'gp_register_taxonomia_para_tipo_de_objeto' );
function gp_register_taxonomia_para_tipo_de_objeto() {
// Registrar la taxonomía 'post_tag' para el tipo de post 'portfolio'
register_taxonomy_for_object_type( 'post_tag', 'portfolio' );
};

Método 1 (de las respuestas anteriores: https://wordpress.stackexchange.com/a/106211/38771)
Diferentes tipos de publicaciones utilizarán los mismos datos de "Etiquetas" del tipo de publicación predeterminado "post".
Ventajas
Todo (debería) funcionar de inmediato con una sola línea
Todas tus etiquetas en un solo lugar en el CMS
Desventajas
- Olvídate de un CMS bien estructurado / fácil de usar: el listado de Etiquetas en la página de tipos de publicaciones personalizadas mostrará todas las etiquetas (no solo las etiquetas utilizadas en los artículos del tipo de publicación personalizada) con el conteo incorrecto...
- Los cambios en una Etiqueta afectarán tanto a los artículos del tipo "post" predeterminado como a los artículos de tipos de publicaciones personalizadas (Eliminar una Etiqueta la borra en ambos tipos de artículos)
- Más difícil (posiblemente imposible) configurar cualquier funcionalidad distinta de Etiquetas: diferentes descripciones, campos personalizados, imágenes, etc. (al menos no sin mucha codificación personalizada sobre el código central de Wordpress)...
Método 2 (de las respuestas anteriores: https://wordpress.stackexchange.com/a/62263/38771)
Diferentes tipos de publicaciones utilizan diferentes configuraciones / datos de "Etiquetas".
Ventajas
- Crear funcionalidades relacionadas con etiquetas diferentes/claramente distintas: plantillas de frontend, capacidades, filtros de consulta, acciones)
- Asignar diferentes datos relacionados con etiquetas: datos de campos o incluso campos personalizados
- Gestionar las Etiquetas mejor en el CMS
- Ejemplo: Editar/Eliminar una etiqueta de "post" no afectará a la etiqueta (con nombre/slug similar) de los otros tipos de publicaciones
Compensación
Un poco más de código para configurar
En realidad, son una forma extremadamente poderosa de agrupar varios elementos de todo tipo de maneras. https://codex.wordpress.org/Taxonomies#Custom_Taxonomies

Aquí hay un caso para el Método 1: Un gran sitio web deportivo que cubre numerosos temas/ligas/deportes con etiquetas como "NBA", "NHL", "Basketball", "Olympics", "Steroids", "College", etc. No tiene ningún sentido duplicar y gestionar lo que podrían ser más de 100 etiquetas y 4 tipos de publicaciones (tipo de publicación por defecto y 3 tipos de publicaciones personalizados). En cuanto a los inconvenientes, si los datos de recuento de etiquetas son tan especiales, entonces se puede crear una vista personalizada para eso. En cuanto a etiquetas personalizadas similares por tipo de publicación, no parece haber una necesidad obvia hasta ahora (intentando pensar en una... necesito ejemplos).

Sí, pero no habrá automáticamente diferentes enlaces permanentes de etiquetas para diferentes tipos de publicaciones. Una etiqueta "playoffs" tendrá "/tag/playoffs" para todos los tipos de publicaciones. Luego tienes que configurar reglas de reescritura o usar parámetros GET para crear diferentes enlaces permanentes... Con una taxonomía diferente para cada tipo de publicación, cada etiqueta "playoffs" para cada tipo de publicación tendrá su propio enlace permanente, que se puede personalizar usando la Jerarquía de Plantillas de Wordpress. Eso es bueno si las diferentes páginas de "playoffs" son distintas para NBA, NHL... Trabajé en un sitio con ese nivel de personalización para taxonomías (campos personalizados, imagen de taxonomía, descripción)

Entiendo lo que dices. Entonces, si optamos por diferentes taxonomías de etiquetas por CPT, ¿qué tal si lo hacemos de manera que cuando agregas/editas un término en una taxonomía, se cambie en otras taxonomías, es decir, términos únicos sincronizados entre taxonomías? Por ejemplo, definir "Basketball" una vez, digamos en la taxonomía de etiquetas de Publicación, luego una vez que guardas, "Basketball" también se crea de manera única en otras taxonomías para CPT's. Así que introduces/editas una etiqueta una vez, y el cambio se refleja en múltiples taxonomías de etiquetas. Al final obtienes la gestión de etiquetas en un solo destino, además de una situación de enlace permanente más deseable.

Simplemente usa este código, puede que te ayude
add_action( 'init', 'create_client_tax' );
function create_client_tax() {
register_taxonomy(
'client_tag', //tu taxonomía de etiquetas
'client', // Tu tipo de entrada
array(
'hierarchical' => false,
'label' => __( 'Etiquetas', CURRENT_THEME ),
'singular_name' => __( 'Etiqueta', CURRENT_THEME ),
'rewrite' => true,
'query_var' => true
)
);
}

Esto siempre funciona bien. ref: https://developer.wordpress.org/plugins/post-types/registering-custom-post-types/
/**
* Crear taxonomía de etiquetas para CPT portfolio
*/
if ( ! function_exists( 'ns_register_team_category' ) ) {
function ns_register_team_category() {
$labels = array(
'name' => __( 'Etiquetas', 'ns' ),
'singular_name' => __( 'Etiqueta', 'ns' ),
'search_items' => __( 'Buscar Etiquetas' ),
'popular_items' => __( 'Etiquetas Populares' ),
'all_items' => __( 'Todas las Etiquetas' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Editar Etiqueta' ),
'update_item' => __( 'Actualizar Etiqueta' ),
'add_new_item' => __( 'Añadir Nueva Etiqueta' ),
'new_item_name' => __( 'Nombre de Nueva Etiqueta' ),
'separate_items_with_commas' => __( 'Separar etiquetas con comas' ),
'add_or_remove_items' => __( 'Añadir o eliminar etiquetas' ),
'choose_from_most_used' => __( 'Elegir entre las etiquetas más usadas' ),
'menu_name' => __( 'Etiquetas' ),
);
$args = array(
'label' => __( 'Etiqueta', 'ns' ),
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'etiqueta', 'with_front' => false, ),
'show_admin_column' => false,
'show_in_rest' => true,
'rest_base' => 'etiqueta',
'rest_controller_class' => 'WP_REST_Terms_Controller',
'show_in_quick_edit' => true,
'update_count_callback' => '_update_post_term_count',
);
register_taxonomy( 'etiqueta', array( 'portfolio' ), $args );
}
add_action( 'init', 'ns_register_team_category', 0 );
}

Puedes simplemente añadir una taxonomía ya registrada a un tipo de objeto, mira el código a continuación.
/**
* Función para añadir selección de etiquetas al tipo de entrada personalizado
*/
function ns_reg_tag() {
register_taxonomy_for_object_type('post_tag', 'Custom_Post_Type');
}
add_action('init', 'ns_reg_tag');

Aunque la respuesta de Marcus resuelve la mayor parte del problema, ten en cuenta que no es una solución completa. La respuesta de chifliiiii es más completa pero, como se menciona en los comentarios, no reutiliza la taxonomía de etiquetas ya existente.
Según el OP, una solución debe usar "la taxonomía de etiquetas" y no "una taxonomía de etiquetas". Por eso considero que la respuesta de chifliiiii es incorrecta.
Por otro lado, creo que la respuesta de Marcus es parcialmente correcta, lo mismo ocurre con respuestas similares como la que publicó Giovanni Putignano. Explicaré a continuación por qué.
Una solución completa
Al registrar tu tipo de publicación personalizada en la taxonomía post_tag
, ya sea usando el método que sugiere Marcus o Giovanni, no se mostrarán las publicaciones etiquetadas de tu tipo de publicación personalizada en la página de archivo de la etiqueta. Solo se mostrarán publicaciones del tipo de publicación post
, porque la plantilla de etiquetas integrada se renderiza con una consulta que solo apunta al tipo de publicación post
. Para solucionar esto, debes modificar la consulta con el hook pre_get_posts
.
Esta es una forma genérica de resolverlo (no me preguntes por qué esto no está implementado en el núcleo):
add_action('pre_get_posts', function($query) {
// Esto apuntará a las consultas utilizadas para generar la plantilla de archivo de etiquetas.
// Puedes eliminar la condición `is_main_query()` si deseas obtener publicaciones
// por etiqueta fuera del bucle.
if (!is_admin() && is_tag() && $query->is_main_query()) {
// Establecerá algo como: Array( 'post', 'portfolio' )
$types = get_taxonomy('post_tag')->object_type;
// Modifica la consulta para usar solo los tipos registrados en la
// taxonomía `post_tag`.
$query->set('post_type', $types);
}
});

En mi caso, el siguiente código funcionó.
register_taxonomy( 'events_tag',array('events'), array(
'hierarchical' => false,
'label' => 'Etiqueta',
'show_admin_column' => true,
'singular_label' => 'Etiqueta de tu tipo de entrada',
'query_var' => true,
'rewrite' => array( 'slug' => 'events_tag' ),
'show_in_rest' => true,
'rest_base' => 'events_tag',
'rest_controller_class' => 'WP_REST_Terms_Controller',
)
);
