¿Cómo personalizar the_archive_title()?

24 ene 2015, 21:57:00
Vistas: 123K
Votos: 51

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()?

2
Comentarios

Publica tu solución como una respuesta aparte. También puedes desmarcar la mía como aceptada y marcar la tuya si lo prefieres :-)

Pieter Goosen Pieter Goosen
27 ene 2015 21:19:59

Ups, pensé que había eliminado esta edición. Tu método resultó ser mejor, así que mi intención era borrar el mío. Lo haré ahora.

fildred13 fildred13
27 ene 2015 23:27:46
Todas las respuestas a la pregunta 7
3
55

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;

});
25 ene 2015 05:36:02
Comentarios

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?

Quinn Comendant Quinn Comendant
25 sept 2015 22:58:26

@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

Pieter Goosen Pieter Goosen
25 sept 2015 23:03:38

Correcto, hay que devolver un título alternativo para cada taxonomía o tipo de contenido que requiera títulos diferentes. He publicado una respuesta que excluye prefijos de todos los tipos.

Quinn Comendant Quinn Comendant
27 sept 2015 21:52:44
1
36

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:

  1. 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;
    });
    
  2. 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);
    });
    
27 sept 2015 21:49:41
Comentarios

Para títulos que contienen espacios como link type: tv la expresión regular debe ser /^(\w|\s)+: /

aitor aitor
19 abr 2020 11:18:58
1

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

25 jun 2015 07:18:44
Comentarios

the_archive_title() muestra el título mientras que get_the_archive_title() no lo hace, por lo que básicamente son lo mismo. Si necesitas modificar el contenido entonces usarías get.

Robert Went Robert Went
20 ago 2018 01:32:59
2

Podrías usar

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';
25 ene 2015 04:23:25
Comentarios

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

That Brazilian Guy That Brazilian Guy
26 abr 2017 18:36:03

@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.

tao tao
26 abr 2017 23:55:19
0

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' );
27 ene 2018 07:52:53
1

Puedes usar post_type_archive_title() para obtener el título de un archivo sin el texto "Archivos:".

17 abr 2018 18:23:39
Comentarios

¿Cómo se muestra el título del archivo del tipo de publicación si 'get_post_type_archive_title()' no existe?

Krys Krys
24 ago 2021 12:42:48
0

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>
25 ago 2022 23:09:09