¿Cómo personalizar the_archive_title()?
En el archivo archive.php
de mi tema hijo, tengo el siguiente código para mostrar el título de mis páginas de archivo:
<?php
the_archive_title( '<h1 class="page-title">', '</h1>' );
?>
Pero eso muestra mis títulos como "Categoría: Título de la Categoría" en lugar de simplemente el título sin el "Categoría: " antepuesto.
Mi primer instinto fue sobrescribir get_the_archive_title()
desde wp-includes/general-template
. Pero por lo que he leído, aparentemente no se debe alterar nunca el núcleo de WordPress, incluso con sobrescrituras desde un tema hijo.
Entonces, ¿cuál es la mejor práctica para controlar la salida de the_archive_title()
?
Si observas el código fuente de get_the_archive_title()
, verás que hay un filtro disponible, llamado get_the_archive_title
, a través del cual puedes filtrar la salida de la función.
Puedes usar lo siguiente para cambiar la salida en una página de categoría
add_filter( 'get_the_archive_title', function ( $title ) {
if( is_category() ) {
$title = single_cat_title( '', false );
}
return $title;
});

Esto no funciona en una página de archivo con un título como Archivo: Libros
(donde Libros
es un tipo de contenido personalizado). La función single_cat_title()
solo devuelve un título de página si el tipo es una categoría o una etiqueta. ¿Podrías modificar tu respuesta para incluir una solución que funcione con todos los tipos de contenido?

@QuinnComendant Mira el código fuente, líneas 1239 y 1240 :-). Si tienes un problema, simplemente haz una nueva pregunta específica sobre tu duda

La respuesta aceptada funciona para eliminar el prefijo Categoría:
de los títulos de archivo de categorías, pero no de otras taxonomías o tipos de publicación. Para excluir otros prefijos, hay dos opciones:
Reconstruir el título para todas las variantes utilizadas en la función original
get_the_archive_title()
:// Devuelve un título alternativo, sin prefijo, para cada tipo usado en get_the_archive_title(). add_filter('get_the_archive_title', function ($title) { if ( is_category() ) { $title = single_cat_title( '', false ); } elseif ( is_tag() ) { $title = single_tag_title( '', false ); } elseif ( is_author() ) { $title = '<span class="vcard">' . get_the_author() . '</span>'; } elseif ( is_year() ) { $title = get_the_date( _x( 'Y', 'formato de fecha de archivos anuales' ) ); } elseif ( is_month() ) { $title = get_the_date( _x( 'F Y', 'formato de fecha de archivos mensuales' ) ); } elseif ( is_day() ) { $title = get_the_date( _x( 'F j, Y', 'formato de fecha de archivos diarios' ) ); } elseif ( is_tax( 'post_format' ) ) { if ( is_tax( 'post_format', 'post-format-aside' ) ) { $title = _x( 'Notas', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) { $title = _x( 'Galerías', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-image' ) ) { $title = _x( 'Imágenes', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-video' ) ) { $title = _x( 'Videos', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) { $title = _x( 'Citas', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-link' ) ) { $title = _x( 'Enlaces', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-status' ) ) { $title = _x( 'Estados', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) { $title = _x( 'Audio', 'título de archivo de formato de publicación' ); } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) { $title = _x( 'Chats', 'título de archivo de formato de publicación' ); } } elseif ( is_post_type_archive() ) { $title = post_type_archive_title( '', false ); } elseif ( is_tax() ) { $title = single_term_title( '', false ); } else { $title = __( 'Archivos' ); } return $title; });
O simplemente eliminar cualquier cosa que parezca un prefijo de título (lo que podría alterar títulos reales que contengan una palabra seguida de dos puntos):
// Simplemente elimina cualquier cosa que parezca un prefijo de título de archivo ("Archivo:", "Foo:", "Bar:"). add_filter('get_the_archive_title', function ($title) { return preg_replace('/^\w+: /', '', $title); });

Otra opción es:
<?php echo str_replace('Marca: ','',get_the_archive_title()); ?>
Reemplaza "Marca: " con el texto que quieras eliminar.
Vale la pena revisar la diferencia entre get_the_archive_title() y the_archive_title(): the_archive_title() devuelve un array get_the_archive_title() devuelve un string

Esto no funciona en una página de archivo con un título como "Archivo: Libros" (donde Libros es un tipo de contenido personalizado).

@ThatBrazilianGuy single_cat_title
utiliza internamente single_term_title
, que también funciona con taxonomías. Asegúrate de que tu tema no tenga definida alguna de las siguientes plantillas: taxonomy-book.php
o taxonomy.php
, porque tienen prioridad sobre archive.php
. También considera probar cualquiera de los métodos en las otras respuestas. Esta respuesta es bastante antigua, funcionaba bien cuando la publiqué, pero ya no desarrollo para WordPress.

Ben Gillbanks tiene una solución interesante que maneja todos los tipos de posts y taxonomías:
function hap_hide_the_archive_title( $title ) {
// Saltar si el sitio no es LTR, esto es visual, no funcional.
// Deberíamos intentar encontrar una solución elegante que funcione para ambas direcciones.
if ( is_rtl() ) {
return $title;
}
// Dividir el título en partes para poder envolverlas con spans.
$title_parts = explode( ': ', $title, 2 );
// Unirlo nuevamente.
if ( ! empty( $title_parts[1] ) ) {
$title = wp_kses(
$title_parts[1],
array(
'span' => array(
'class' => array(),
),
)
);
$title = '<span class="screen-reader-text">' . esc_html( $title_parts[0] ) . ': </span>' . $title;
}
return $title;
}
add_filter( 'get_the_archive_title', 'hap_hide_the_archive_title' );

Usa esto en lugar de the_archive_title()
. Funciona con CPTs y taxonomías personalizadas.
<?php
$term = $wp_query->get_queried_object();
$term_title = $term->label //funciona con CPTs (Libros)
?? $term->name //funciona con términos de taxonomía personalizada (obtiene Pequeño en tamaño/pequeño)
?? "sin título";
?>
<h1><?php echo $term_title; ?></h1>
