Как настроить the_archive_title ()?

41

В моей дочерней теме у archive.phpменя есть следующий код для отображения заголовка страниц моего архива:

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

Но это отображает мои заголовки как «Категория: Заголовок категории », а не просто заголовок без префикса «Категория:».

Мой первый инстинкт должен был отменить get_the_archive_title()из wp-includes/general-template. Но из того, что я прочитал, по-видимому, я не должен когда-либо изменять основной материал WordPress, даже с переопределениями из детской темы.

Так каков наилучший способ управления выходом the_archive_title()?

fildred13
источник
Опубликуйте свое решение как отдельный ответ. Вы также можете отказаться от моего и принять свой, если хотите :-)
Питер Гусен
Ой, я думал, что удалил это редактирование. Ваш метод оказался лучше, поэтому я хотел удалить мой. Я сделаю это сейчас.
fildred13

Ответы:

40

Если вы посмотрите на исходный кодget_the_archive_title() , вы увидите, что есть фильтр, который называется get_the_archive_title, с помощью которого вы можете отфильтровать вывод из функции.

Вы можете использовать следующее, чтобы изменить вывод на странице категории

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

    if( is_category() ) {

        $title = single_cat_title( '', false );

    }

    return $title;

});
Питер Гусен
источник
6
Это не работает на странице архива с заголовком Archive: Books(где Booksпользовательский тип записи). single_cat_title()Функция возвращает только заголовок страницы , если типа является категорией или тег . Можете ли вы изменить свой ответ, включив в него решение, которое работает со всеми типами контента?
Куинн Комендант
@QuinnComendant Посмотрите на исходный код, строки 1239 и 1240 :-). Если у вас есть проблема, просто задайте новый вопрос, специфичный для вашего вопроса
Pieter Goosen
1
Правильно, нужно возвращать альтернативный заголовок для каждой таксономии или типа сообщения, для которого они хотят разные заголовки. Я опубликовал ответ, который исключает префиксы из всех типов.
Куинн Комендант
28

Принятый ответ работает для удаления Category:префикса из заголовков архива категории, но не для других таксономий или типов записей. Чтобы исключить другие префиксы, есть два варианта:

  1. Восстановите заголовок для всех вариантов, используемых в исходной get_the_archive_title()функции:

    // 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. Или просто удалите все, что похоже на префикс заголовка (который может изменить фактические заголовки, содержащие слово, за которым следует символ двоеточия):

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

Вы могли бы использовать

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';
Андрей Георгиу
источник
Это не работает на странице архива с заголовком Archive: Books (где Books - это пользовательский тип записи).
Этот бразильский парень
@ThatBrazilianGuy single_cat_titleиспользует single_term_titleвнутренне, что также работает с таксономиями. Убедитесь, что в вашей теме не определен один из следующих шаблонов: taxonomy-book.phpили taxonomy.php, потому что они имеют приоритет над archive.php. Кроме того, рассмотрите возможность тестирования любого из методов в других ответах. Этот ответ довольно старый, он работал нормально на момент публикации, но я больше не занимаюсь разработкой для WordPress.
Андрей Георгиу
6

Другой вариант:

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

Замените бренд: любым текстом, от которого вы хотите избавиться.

Стоит посмотреть на разницу между get_the_archive_title () и the_archive_title () the_archive_title () возвращает массив get_the_archive_title () возвращает строку

rhysclay
источник
the_archive_title () повторяет заголовок, а get_the_archive_title () - нет, поэтому они в основном одинаковы. Если вам нужно изменить содержимое, вы должны использовать get.
Роберт отправился
1

У Ben Gillbanks есть хорошее решение, которое обрабатывает все типы записей и таксономии:

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

Вы можете использовать, post_type_archive_title()чтобы получить название архива без текста «Архивы:».

Марк Уильямс
источник