Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Taxonomías personalizadas: clasifica tu contenido como quieras con register_taxonomy

Una taxonomía es simplemente una forma de clasificar contenido. WordPress trae dos: las categorías (con jerarquía) y las etiquetas (sin jerarquía). Pero puedes crear todas las que necesites: «Nivel», «Sistema operativo», «Tipo de licencia», «Ciudad»…

En la entrada anterior creamos el tipo de contenido Recursos. Hoy le agregamos una taxonomía Nivel con los valores Principiante, Intermedio y Avanzado, para que cada visitante encuentre lo que le sirve.

¿Por qué no usar categorías?

  • Las categorías son de las entradas. Si las compartes con los recursos, el listado de «Guías & Trucos» mezclaría entradas y recursos.
  • Una taxonomía propia tiene su propio menú, su caja en el editor y sus direcciones: /nivel/principiante/.
  • Puedes combinar: un recurso puede ser «Avanzado» y además tener etiquetas.

Paso 1. Registra la taxonomía

En el plugin cwp-recursos.php de la entrada anterior, agrega:

add_action( 'init', 'cwp_recursos_taxonomia_nivel' );

function cwp_recursos_taxonomia_nivel() {
	register_taxonomy(
		'cwp_nivel',
		array( 'cwp_recurso' ),
		array(
			'labels'            => array(
				'name'          => 'Niveles',
				'singular_name' => 'Nivel',
				'search_items'  => 'Buscar niveles',
				'all_items'     => 'Todos los niveles',
				'edit_item'     => 'Editar nivel',
				'update_item'   => 'Actualizar nivel',
				'add_new_item'  => 'Añadir nuevo nivel',
				'new_item_name' => 'Nombre del nuevo nivel',
				'menu_name'     => 'Niveles',
			),
			'hierarchical'      => true,
			'public'            => true,
			'show_admin_column' => true,
			'show_in_rest'      => true,
			'rewrite'           => array( 'slug' => 'nivel', 'with_front' => false ),
		)
	);
}

Recarga el panel: dentro de Recursos aparece Niveles. Y en el editor de cada recurso, en el panel derecho, una caja para elegir el nivel.

Las opciones importantes

  • 'cwp_nivel': nombre interno, con prefijo. Máximo 32 caracteres. Igual que con los CPT, no lo cambies después.
  • array( 'cwp_recurso' ): a qué tipos de contenido se aplica. Puedes poner varios, por ejemplo array( 'cwp_recurso', 'post' ).
  • hierarchical:
    • true: se comporta como las categorías (casillas para marcar, puede tener niveles padre e hijo).
    • false: se comporta como las etiquetas (campo para escribir, sin jerarquía).
  • show_admin_column: agrega una columna «Niveles» en el listado de recursos del panel. Muy cómodo.
  • show_in_rest: necesario para que la caja aparezca en el editor de bloques.

Como cambian las direcciones del sitio, guarda una vez Ajustes → Enlaces permanentes (o desactiva y activa el plugin, si agregaste el flush_rewrite_rules de la entrada anterior).

Paso 2. Crea los términos iniciales automáticamente

Los valores de una taxonomía se llaman términos. Puedes crearlos a mano en Recursos → Niveles, o hacer que el plugin los cree al activarse. Modifica la función de activación así:

function cwp_recursos_activar() {
	cwp_recursos_registrar();
	cwp_recursos_taxonomia_nivel();

	foreach ( array( 'Principiante', 'Intermedio', 'Avanzado' ) as $nivel ) {
		if ( ! term_exists( $nivel, 'cwp_nivel' ) ) {
			wp_insert_term( $nivel, 'cwp_nivel' );
		}
	}

	flush_rewrite_rules();
}

Fíjate que hay que registrar la taxonomía dentro de la función de activación: al activar el plugin, el gancho init ya pasó, y sin registrarla, wp_insert_term() fallaría.

Paso 3. Filtra el listado del panel por nivel

Con muchos recursos, querrás ver solo los avanzados. Este código agrega un desplegable de filtro arriba del listado:

add_action( 'restrict_manage_posts', 'cwp_recursos_filtro_nivel' );

function cwp_recursos_filtro_nivel( $post_type ) {
	if ( 'cwp_recurso' !== $post_type ) {
		return;
	}
	wp_dropdown_categories(
		array(
			'taxonomy'        => 'cwp_nivel',
			'name'            => 'cwp_nivel',
			'value_field'     => 'slug',
			'show_option_all' => 'Todos los niveles',
			'selected'        => isset( $_GET['cwp_nivel'] ) ? sanitize_key( $_GET['cwp_nivel'] ) : '',
			'hide_empty'      => false,
		)
	);
}

No hace falta más código para que el filtro funcione: como el nombre del campo coincide con el de la taxonomía pública, WordPress entiende ?cwp_nivel=avanzado y filtra solo.

Paso 4. Muestra el nivel en el sitio

Para mostrar el nivel de un recurso con enlace a su listado, en la plantilla single-cwp_recurso.php de tu tema hijo o con un filtro:

add_filter( 'the_content', 'cwp_recursos_mostrar_nivel' );

function cwp_recursos_mostrar_nivel( $contenido ) {
	if ( ! is_singular( 'cwp_recurso' ) || ! in_the_loop() || ! is_main_query() ) {
		return $contenido;
	}
	$niveles = get_the_term_list( get_the_ID(), 'cwp_nivel', '<p class="cwp-nivel">Nivel: ', ', ', '</p>' );
	if ( ! $niveles || is_wp_error( $niveles ) ) {
		return $contenido;
	}
	return $niveles . $contenido;
}

get_the_term_list() devuelve los términos ya enlazados a sus páginas: /nivel/principiante/ mostrará todos los recursos para principiantes.

Paso 5. Consulta por taxonomía

Para listar, por ejemplo, solo los recursos para principiantes, usa tax_query en WP_Query:

$consulta = new WP_Query(
	array(
		'post_type'      => 'cwp_recurso',
		'posts_per_page' => 5,
		'tax_query'      => array(
			array(
				'taxonomy' => 'cwp_nivel',
				'field'    => 'slug',
				'terms'    => 'principiante',
			),
		),
	)
);

Puedes adaptar el shortcode ultimos_recursos de la entrada anterior para que acepte un atributo nivel y use esta consulta. Buen ejercicio para practicar.

¿Dudas entre categoría, etiqueta o taxonomía propia? Plantea tu caso en el foro: es una de las decisiones de estructura más importantes de un sitio y vale la pena conversarla.