Come personalizzare the_archive_title()?
Nel file archive.php
del mio tema child, ho il seguente codice per visualizzare il titolo delle mie pagine di archivio:
<?php
the_archive_title( '<h1 class="page-title">', '</h1>' );
?>
Ma questo visualizza i miei titoli come "Categoria: Titolo Categoria" invece di mostrare semplicemente il titolo senza il prefisso "Categoria: ".
Il mio primo istinto è stato quello di sovrascrivere get_the_archive_title()
da wp-includes/general-template
. Ma da quello che ho letto, apparentemente non dovrei mai modificare il core di WordPress, nemmeno con override da un tema child.
Qual è quindi il modo migliore, seguendo le best practice, per controllare l'output di the_archive_title()
?

Se guardi il codice sorgente di get_the_archive_title()
, vedrai che è presente un filtro chiamato get_the_archive_title
, attraverso il quale puoi filtrare l'output della funzione.
Puoi utilizzare il seguente codice per modificare l'output su una pagina di categoria
add_filter( 'get_the_archive_title', function ( $title ) {
if( is_category() ) {
$title = single_cat_title( '', false );
}
return $title;
});

Questo non funziona su una pagina di archivio con un titolo del tipo Archivio: Libri
(dove Libri
è un custom post type). La funzione single_cat_title()
restituisce un titolo di pagina solo se il tipo è una categoria o un tag. Puoi modificare la tua risposta per includere una soluzione che funzioni con tutti i tipi di contenuto?

@QuinnComendant Guarda il codice sorgente, righe 1239 e 1240 :-). Se hai un problema, fai semplicemente una nuova domanda specifica per il tuo caso

La risposta accettata funziona per rimuovere il prefisso Categoria:
dai titoli degli archivi di categoria, ma non per altre tassonomie o tipi di post. Per escludere altri prefissi, ci sono due opzioni:
Ricostruire il titolo per tutte le varianti utilizzate nella funzione originale
get_the_archive_title()
:// Restituisce un titolo alternativo, senza prefisso, per ogni tipo utilizzato in 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', 'formato data archivi annuali' ) ); } elseif ( is_month() ) { $title = get_the_date( _x( 'F Y', 'formato data archivi mensili' ) ); } elseif ( is_day() ) { $title = get_the_date( _x( 'F j, Y', 'formato data archivi giornalieri' ) ); } elseif ( is_tax( 'post_format' ) ) { if ( is_tax( 'post_format', 'post-format-aside' ) ) { $title = _x( 'Appunti', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) { $title = _x( 'Gallerie', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-image' ) ) { $title = _x( 'Immagini', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-video' ) ) { $title = _x( 'Video', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) { $title = _x( 'Citazioni', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-link' ) ) { $title = _x( 'Link', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-status' ) ) { $title = _x( 'Stati', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) { $title = _x( 'Audio', 'titolo archivio formato post' ); } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) { $title = _x( 'Chat', 'titolo archivio formato post' ); } } elseif ( is_post_type_archive() ) { $title = post_type_archive_title( '', false ); } elseif ( is_tax() ) { $title = single_term_title( '', false ); } else { $title = __( 'Archivi' ); } return $title; });
Oppure, semplicemente rimuovere qualsiasi cosa sembri un prefisso del titolo (che potrebbe modificare titoli effettivi contenenti una parola seguita dal carattere due punti):
// Rimuove semplicemente qualsiasi cosa sembri un prefisso del titolo dell'archivio ("Archivio:", "Foo:", "Bar:"). add_filter('get_the_archive_title', function ($title) { return preg_replace('/^\w+: /', '', $title); });

Un'altra opzione è:
<?php echo str_replace('Brand: ','',get_the_archive_title()); ?>
Sostituisci 'Brand:' con il testo che vuoi rimuovere.
Vale la pena esaminare la differenza tra get_the_archive_title() e the_archive_title(). the_archive_title() restituisce un array, get_the_archive_title() restituisce una stringa.

Questo non funziona su una pagina archivio con un titolo come Archivio: Libri (dove Libri è un custom post type).

@ThatBrazilianGuy single_cat_title
utilizza internamente single_term_title
, che funziona anche con le tassonomie. Assicurati che il tuo tema non abbia uno dei seguenti template definiti: taxonomy-book.php
o taxonomy.php
, perché hanno la precedenza su archive.php
. Inoltre, considera di testare uno dei metodi nelle altre risposte. Questa risposta è piuttosto vecchia, funzionava bene quando l'ho pubblicata, ma non sviluppo più per WordPress.

Ben Gillbanks ha trovato una soluzione elegante che gestisce tutti i tipi di post e tassonomie:
function hap_hide_the_archive_title( $title ) {
// Salta se il sito non è LTR, questo è visivo, non funzionale.
// Dovremmo provare a trovare una soluzione elegante che funzioni per entrambe le direzioni.
if ( is_rtl() ) {
return $title;
}
// Divide il titolo in parti per poterle avvolgere con span.
$title_parts = explode( ': ', $title, 2 );
// Ricompone il titolo.
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' );

Usa questo invece di the_archive_title()
. Funziona con CPT e tassonomie personalizzate.
<?php
$term = $wp_query->get_queried_object();
$term_title = $term->label //funziona con CPT (es. Libri)
?? $term->name //funziona con termini di tassonomie personalizzate (restituisce Piccolo in taglia/piccolo)
?? "senza titolo";
?>
<h1><?php echo $term_title; ?></h1>
