Comment personnaliser the_archive_title ()?

41

Dans mon thème enfant archive.php, j'ai le code suivant pour afficher le titre de mes pages d'archive:

    <?php
        the_archive_title( '<h1 class="page-title">', '</h1>' );
    ?>

Mais cela affiche mes titres comme "Catégorie: Titre de la catégorie " au lieu de simplement le titre sans le préfixe "Catégorie:".

Mon premier instinct était de passer outre à get_the_archive_title()partir wp-includes/general-template. Mais d'après ce que j'ai lu, apparemment, je ne suis pas censé modifier les éléments centraux de wordpress, même avec des substitutions d'un thème enfant.

Alors, quel est le meilleur moyen de contrôler le résultat the_archive_title()?

fildred13
la source
Postez votre solution séparément. Vous pouvez également refuser le mien et accepter le vôtre si vous le souhaitez :-)
Pieter Goosen du
Oups, je pensais avoir supprimé cette modification. Votre méthode a fini par être meilleure, alors je voulais supprimer la mienne. Je vais le faire maintenant.
fildred13

Réponses:

40

Si vous regardez le code source deget_the_archive_title() , vous verrez qu'il existe un filtre fourni, appelé get_the_archive_title, à travers lequel vous pouvez filtrer la sortie de la fonction.

Vous pouvez utiliser ce qui suit pour changer la sortie sur une page de catégorie

add_filter( 'get_the_archive_title', function ( $title ) {

    if( is_category() ) {

        $title = single_cat_title( '', false );

    }

    return $title;

});
Pieter Goosen
la source
6
Cela ne fonctionne pas sur une page d'archive avec un titre de Archive: Books(où Booksest un type de publication personnalisé). La single_cat_title()fonction ne renvoie un titre de page que si le type est une catégorie ou une balise . Pouvez-vous modifier votre réponse pour inclure une solution compatible avec tous les types de contenu?
Quinn Comendant
@QuinnComendant Regardez le code source, lignes 1239 et 1240 :-). Si vous avez un problème, posez simplement une nouvelle question spécifique à votre question
Pieter Goosen
1
Bien, il faut renvoyer un autre titre pour chaque taxonomie ou type de message pour lequel ils veulent des titres différents. J'ai posté une réponse qui exclut les préfixes de tous les types.
Quinn Comendant
28

La réponse acceptée fonctionne pour supprimer le Category:préfixe des titres d'archives de catégorie, mais pas d'autres types de taxonomie ou d'articles. Pour exclure d'autres préfixes, il existe deux options:

  1. Reconstruisez le titre pour toutes les variantes utilisées dans la get_the_archive_title()fonction d' origine :

    // Return an alternate title, without prefix, for every type used in the 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', 'yearly archives date format' ) );
        } elseif ( is_month() ) {
            $title = get_the_date( _x( 'F Y', 'monthly archives date format' ) );
        } elseif ( is_day() ) {
            $title = get_the_date( _x( 'F j, Y', 'daily archives date format' ) );
        } elseif ( is_tax( 'post_format' ) ) {
            if ( is_tax( 'post_format', 'post-format-aside' ) ) {
                $title = _x( 'Asides', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) {
                $title = _x( 'Galleries', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-image' ) ) {
                $title = _x( 'Images', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-video' ) ) {
                $title = _x( 'Videos', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) {
                $title = _x( 'Quotes', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-link' ) ) {
                $title = _x( 'Links', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-status' ) ) {
                $title = _x( 'Statuses', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) {
                $title = _x( 'Audio', 'post format archive title' );
            } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) {
                $title = _x( 'Chats', 'post format archive title' );
            }
        } elseif ( is_post_type_archive() ) {
            $title = post_type_archive_title( '', false );
        } elseif ( is_tax() ) {
            $title = single_term_title( '', false );
        } else {
            $title = __( 'Archives' );
        }
        return $title;
    });
  2. Ou alors, supprimez tout ce qui ressemble à un préfixe de titre (qui peut modifier les titres contenant un mot suivi du caractère deux-points):

    // Simply remove anything that looks like an archive title prefix ("Archive:", "Foo:", "Bar:").
    add_filter('get_the_archive_title', function ($title) {
        return preg_replace('/^\w+: /', '', $title);
    });
Quinn Comendant
la source
6

Vous pourriez utiliser

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';
Andrei Gheorghiu
la source
Cela ne fonctionne pas sur une page d'archive portant le titre Archive: Books (où Books est un type d'article personnalisé).
Ce Brésilien Guy
@ThatBrazilianGuy single_cat_titleutilise en single_term_titleinterne, ce qui fonctionne également sur les taxonomies. Assurez-vous que votre thème n'a pas défini l'un des modèles suivants: taxonomy-book.phpou taxonomy.php, car ils ont la priorité sur archive.php. En outre, envisagez de tester l'une des méthodes des autres réponses. Cette réponse est assez ancienne, elle fonctionnait bien au moment où je l'ai postée, mais je ne développe plus pour WordPress.
Andrei Gheorghiu
6

Une autre option est:

<?php echo str_replace('Brand: ','',get_the_archive_title()); ?>

Remplacer la marque: avec le texte dont vous souhaitez vous débarrasser.

Il vaut la peine d'examiner la différence entre get_the_archive_title () et the_archive_title () the_archive_title () renvoie un tableau get_the_archive_title () renvoie une chaîne

rhysclay
la source
the_archive_title () fait écho au titre et pas à get_the_archive_title (), ils sont donc fondamentalement les mêmes. Si vous devez modifier le contenu, utilisez get.
Robert est allé
1

Ben Gillbanks a une solution intéressante qui gère tous les types de postes et toutes les taxonomies:

function hap_hide_the_archive_title( $title ) {
// Skip if the site isn't LTR, this is visual, not functional.
// Should try to work out an elegant solution that works for both directions.
if ( is_rtl() ) {
    return $title;
}
// Split the title into parts so we can wrap them with spans.
$title_parts = explode( ': ', $title, 2 );
// Glue it back together again.
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' );
Dan Knauss
la source
0

Vous pouvez utiliser post_type_archive_title()pour obtenir le titre d'une archive sans le texte "Archives:".

Mark Williams
la source