Как настроить the_archive_title()?
В файле archive.php
моей дочерней темы есть следующий код для отображения заголовка страниц архива:
<?php
the_archive_title( '<h1 class="page-title">', '</h1>' );
?>
Но он отображает мои заголовки как "Рубрика: Название рубрики" вместо просто названия без добавленного "Рубрика: ".
Моим первым инстинктом было переопределить get_the_archive_title()
из wp-includes/general-template
. Но из того, что я прочитал, видимо, я не должен изменять ядро WordPress, даже с помощью переопределений из дочерней темы.
Так какой же способ считается лучшей практикой для управления выводом the_archive_title()
?

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

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

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

Принятый ответ работает для удаления префикса Category:
из заголовков архивов категорий, но не применяется к другим таксономиям или типам записей. Чтобы исключить другие префиксы, есть два варианта:
Перестроить заголовок для всех вариантов, используемых в оригинальной функции
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; });
Или просто удалить всё, что похоже на префикс заголовка (это может изменить фактические заголовки, содержащие слово, за которым следует двоеточие):
// Просто удаляет всё, что похоже на префикс заголовка архива ("Archive:", "Foo:", "Bar:"). add_filter('get_the_archive_title', function ($title) { return preg_replace('/^\w+: /', '', $title); });

Другой вариант:
<?php echo str_replace('Brand: ','',get_the_archive_title()); ?>
Замените "Brand: " на любой текст, который вы хотите удалить.
Стоит разобраться в разнице между get_the_archive_title() и the_archive_title(): the_archive_title() возвращает массив, get_the_archive_title() возвращает строку

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

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

Бен Гиллбанкс предложил отличное решение, которое работает со всеми типами записей и таксономиями:
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' );

Используйте это вместо 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>
