Jak dostosować the_archive_title ()?


40

W motywie mojego dziecka archive.phpmam następujący kod do wyświetlania tytułu moich stron archiwum:

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

Ale to wyświetla moje tytuły jako „Kategoria: Tytuł kategorii ” zamiast po prostu tytuł bez wcześniejszego „Kategoria:”.

Moim pierwszym odruchem było zastąpić get_the_archive_title()od wp-includes/general-template. Ale z tego, co przeczytałem, najwyraźniej nie powinienem nigdy zmieniać podstawowych elementów Wordpress, nawet z przesłonięciem motywu potomnego.

Jaki jest najlepszy sposób kontrolowania wydajności the_archive_title()?


Opublikuj swoje rozwiązanie jako osobną odpowiedź. Możesz również odrzucić moje i zaakceptować własne, jeśli chcesz :-)
Pieter Goosen

Ups, myślałem, że usunąłem tę zmianę. Twoja metoda okazała się lepsza, więc chciałem usunąć moją. Zrobię to teraz.
fildred13

Odpowiedzi:


40

Jeśli spojrzysz na kod źródłowyget_the_archive_title() , zobaczysz, że dostarczony jest filtr, wywoływany get_the_archive_title, przez który możesz filtrować dane wyjściowe z funkcji.

Aby zmienić dane wyjściowe na stronie kategorii, możesz użyć następujących elementów

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

    if( is_category() ) {

        $title = single_cat_title( '', false );

    }

    return $title;

});

6
To nie działa na stronie archiwum z tytułem Archive: Books(gdzie Booksjest niestandardowy typ postu). single_cat_title()Zwraca tytuł strony tylko wtedy, gdy typ jest kategoria lub tag . Czy możesz zmienić swoją odpowiedź, aby uwzględnić rozwiązanie, które działa ze wszystkimi typami treści?
Quinn Comendant

@QuinnComendant Spójrz na kod źródłowy, wiersze 1239 i 1240 :-). Jeśli masz problem, po prostu zadaj nowe pytanie dotyczące tego pytania
Pieter Goosen,

1
Racja, należy zwrócić alternatywny tytuł dla każdej taksonomii lub typu postu, dla którego mają mieć różne tytuły. Opublikowałem odpowiedź, która wyklucza prefiksy ze wszystkich typów.
Quinn Comendant

28

Akceptowana odpowiedź działa w celu usunięcia Category:prefiksu z tytułów archiwów kategorii, ale nie innych taksonomii ani typów postów. Aby wykluczyć inne prefiksy, istnieją dwie opcje:

  1. Odbuduj tytuł dla wszystkich wariantów używanych w oryginalnej get_the_archive_title()funkcji:

    // 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. Lub po prostu usuń wszystko, co wygląda jak przedrostek tytułu (co może zmienić rzeczywiste tytuły zawierające słowo, po którym następuje znak dwukropka):

    // 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);
    });
    

6

Możesz użyć

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';

Nie działa to na stronie archiwum o tytule Archiwum: Książki (gdzie Książki to niestandardowy typ postu).
Ten Brazylijczyk

@ThatBrazilianGuy single_cat_titlekorzysta single_term_titlewewnętrznie, co działa również na taksonomie. Upewnij się, że Twój motyw nie ma zdefiniowanego jednego z następujących szablonów: taxonomy-book.phplub taxonomy.php, ponieważ mają one pierwszeństwo archive.php. Rozważ także przetestowanie jednej z metod opisanych w innych odpowiedziach. Ta odpowiedź jest dość stara, działała dobrze w momencie jej opublikowania, ale nie rozwijam się już dla WordPress.
Andrei Gheorghiu

6

Inną opcją jest:

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

Zamień markę na dowolny tekst, którego chcesz się pozbyć.

Warto przyjrzeć się różnicy między get_the_archive_title () i the_archive_title () the_archive_title () zwraca tablicę get_the_archive_title () zwraca ciąg


the_archive_title () powtarza tytuł, a get_the_archive_title () nie, więc są w zasadzie takie same. Jeśli musisz zmienić treść, skorzystaj z get.
Robert Went

1

Ben Gillbanks ma fajne rozwiązanie, które obsługuje wszystkie typy postów i taksonomie:

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' );

0

Możesz użyć, post_type_archive_title()aby uzyskać tytuł archiwum bez tekstu „Archiwa:”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.