Wie kann ich den_archive_title () anpassen?

40

In meinem Kinderthema habe archive.phpich den folgenden Code zum Anzeigen des Titels meiner Archivseiten:

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

Dabei werden meine Titel jedoch als "Kategorie: Kategorietitel " anstatt einfach als Titel ohne vorangestelltes "Kategorie:" angezeigt.

Mein erster Instinkt war außer Kraft setzen get_the_archive_title()aus wp-includes/general-template. Aber nach dem, was ich gelesen habe, soll ich anscheinend nie WordPress-Kernelemente ändern, auch nicht mit Überschreibungen von einem Kinderthema.

Was ist die beste Methode, um die Ausgabe von zu steuern the_archive_title()?

fildred13
quelle
Veröffentlichen Sie Ihre Lösung als separate Antwort. Sie können auch meins inakzeptieren und Ihr eigenes akzeptieren, wenn Sie möchten :-)
Pieter Goosen
Hoppla, ich dachte, ich hätte diese Änderung gelöscht. Ihre Methode hat sich als besser erwiesen, deshalb wollte ich meine löschen. Das mache ich jetzt.
Fildred13

Antworten:

40

Wenn Sie sich den Quellcode vonget_the_archive_title() ansehen, werden get_the_archive_titleSie feststellen, dass ein Filter bereitgestellt wird , über den Sie die Ausgabe der Funktion filtern können.

Sie können Folgendes verwenden, um die Ausgabe auf einer Kategorieseite zu ändern

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

    if( is_category() ) {

        $title = single_cat_title( '', false );

    }

    return $title;

});
Pieter Goosen
quelle
6
Dies funktioniert nicht auf einer Archivseite mit dem Titel Archive: Books(wobei Bookses sich um einen benutzerdefinierten Beitragstyp handelt). Die single_cat_title()Funktion gibt nur dann einen Seitentitel zurück, wenn der Typ eine Kategorie oder ein Tag ist . Können Sie Ihre Antwort dahingehend ändern, dass sie eine Lösung enthält, die mit allen Inhaltstypen funktioniert?
Quinn Comendant
@QuinnComendant Schau dir den Quellcode an, Zeilen 1239 und 1240 :-). Wenn Sie ein Problem haben, stellen Sie einfach eine neue Frage, die spezifisch für Ihre Frage ist
Pieter Goosen,
1
Richtig, man muss einen alternativen Titel für jede Taxonomie oder Beitragsart zurückgeben, für die man unterschiedliche Titel haben möchte. Ich habe eine Antwort gepostet, die Präfixe von allen Typen ausschließt.
Quinn Comendant
28

Die akzeptierte Antwort entfernt das Category:Präfix aus den Kategoriearchivtiteln, jedoch nicht aus anderen Taxonomie- oder Beitragstypen. Um andere Präfixe auszuschließen, gibt es zwei Möglichkeiten:

  1. Erstellen Sie den Titel für alle in der ursprünglichen get_the_archive_title()Funktion verwendeten Varianten neu :

    // 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. Oder entfernen Sie einfach alles, was wie ein Titelpräfix aussieht (was tatsächliche Titel verändern kann, die ein Wort gefolgt vom Doppelpunkt enthalten):

    // 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
quelle
6

Du könntest benutzen

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';
Andrei Gheorghiu
quelle
Dies funktioniert nicht auf einer Archivseite mit dem Titel Archiv: Bücher (wobei Bücher ein benutzerdefinierter Beitragstyp ist).
Der Brasilianer
@ThatBrazilianGuy single_cat_titleverwendet single_term_titleintern, was auch für Taxonomien gilt. Stellen Sie sicher, dass für Ihr Thema keine der folgenden Vorlagen definiert ist: taxonomy-book.phpoder taxonomy.php, da sie Vorrang vor haben archive.php. Erwägen Sie auch, eine der Methoden in den anderen Antworten zu testen. Diese Antwort ist ziemlich alt, sie hat zum Zeitpunkt der Veröffentlichung einwandfrei funktioniert, aber ich entwickle nicht mehr für WordPress.
Andrei Gheorghiu
6

Eine andere Option ist:

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

Marke ersetzen: mit dem Text, den Sie entfernen möchten.

Es lohnt sich, den Unterschied zwischen get_the_archive_title () und the_archive_title () zu untersuchen. The_archive_title () gibt ein Array zurück. Get_the_archive_title () gibt einen String zurück

Rhysclay
quelle
the_archive_title () gibt den Titel wieder und get_the_archive_title () nicht, daher sind sie im Grunde gleich. Wenn Sie den Inhalt ändern müssen, verwenden Sie get.
Robert ging
1

Ben Gillbanks hat eine nette Lösung , die alle Post-Typen und Taxonomien handhabt:

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
quelle
0

Mit können post_type_archive_title()Sie den Titel eines Archivs ohne den Text "Archiv:" abrufen.

Mark Williams
quelle