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

24 янв. 2015 г., 21:57:00
Просмотры: 123K
Голосов: 51

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

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

Но он отображает мои заголовки как "Рубрика: Название рубрики" вместо просто названия без добавленного "Рубрика: ".

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

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

2
Комментарии

Опубликуйте ваше решение как отдельный ответ. Вы также можете отменить принятие моего ответа и принять свой, если хотите :-)

Pieter Goosen Pieter Goosen
27 янв. 2015 г. 21:19:59

Упс, я думал, что удалил эту правку. Ваш метод оказался лучше, поэтому я хотел удалить свой. Сейчас так и сделаю.

fildred13 fildred13
27 янв. 2015 г. 23:27:46
Все ответы на вопрос 7
3
55

Если посмотреть исходный код функции 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;

});
25 янв. 2015 г. 05:36:02
Комментарии

Это не работает на странице архива с заголовком Архив: Книги (где Книги — это пользовательский тип записи). Функция single_cat_title() возвращает заголовок страницы только если тип является категорией или меткой. Можете ли вы дополнить ваш ответ, включив решение, которое работает со всеми типами контента?

Quinn Comendant Quinn Comendant
25 сент. 2015 г. 22:58:26

@QuinnComendant Посмотрите исходный код, строки 1239 и 1240 :-). Если у вас есть проблема, просто задайте новый вопрос, относящийся конкретно к вашему вопросу

Pieter Goosen Pieter Goosen
25 сент. 2015 г. 23:03:38

Верно, нужно возвращать альтернативный заголовок для каждой таксономии или типа записи, для которых нужны разные заголовки. Я опубликовал ответ, который исключает префиксы для всех типов.

Quinn Comendant Quinn Comendant
27 сент. 2015 г. 21:52:44
1
36

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

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

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

    // Просто удаляет всё, что похоже на префикс заголовка архива ("Archive:", "Foo:", "Bar:").
    add_filter('get_the_archive_title', function ($title) {
        return preg_replace('/^\w+: /', '', $title);
    });
    
27 сент. 2015 г. 21:49:41
Комментарии

Для заголовков, содержащих пробелы, таких как link type: tv, регулярное выражение должно быть /^(\w|\s)+: /

aitor aitor
19 апр. 2020 г. 11:18:58
1

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

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

Замените "Brand: " на любой текст, который вы хотите удалить.

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

25 июн. 2015 г. 07:18:44
Комментарии

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

Robert Went Robert Went
20 авг. 2018 г. 01:32:59
2

Вы можете использовать

echo '<h1 class="page-title">' . single_cat_title( '', false ) . '</h1>';
25 янв. 2015 г. 04:23:25
Комментарии

Это не работает на странице архива с заголовком "Архив: Книги" (где Книги — это пользовательский тип записи).

That Brazilian Guy That Brazilian Guy
26 апр. 2017 г. 18:36:03

@ThatBrazilianGuy single_cat_title использует внутри single_term_title, который также работает с таксономиями. Убедитесь, что в вашей теме не определен один из следующих шаблонов: taxonomy-book.php или taxonomy.php, потому что они имеют приоритет над archive.php. Также попробуйте протестировать любой из методов в других ответах. Этот ответ довольно старый, он работал корректно на момент публикации, но я больше не занимаюсь разработкой для WordPress.

tao tao
26 апр. 2017 г. 23:55:19
0

Бен Гиллбанкс предложил отличное решение, которое работает со всеми типами записей и таксономиями:

function hap_hide_the_archive_title( $title ) {
// Пропускаем, если сайт не LTR, это визуально, а не функционально.
// Нужно попробовать найти элегантное решение, работающее для обоих направлений.
if ( is_rtl() ) {
    return $title;
}
// Разбиваем заголовок на части, чтобы обернуть их в span.
$title_parts = explode( ': ', $title, 2 );
// Собираем обратно.
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 янв. 2018 г. 07:52:53
1

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

17 апр. 2018 г. 18:23:39
Комментарии

Как отобразить заголовок архива типа записи, если функция 'get_post_type_archive_title()' не существует?

Krys Krys
24 авг. 2021 г. 12:42:48
0

Используйте это вместо the_archive_title(). Работает с пользовательскими типами записей и таксономиями.

<?php
$term = $wp_query->get_queried_object();
$term_title = $term->label // работает с CPT (например Books)
?? $term->name // работает с терминами таксономий (получает Small для size/small)
?? "без названия";
?>
<h1><?php echo $term_title; ?></h1>
25 авг. 2022 г. 23:09:09