Cum să personalizezi the_archive_title()?
În fișierul archive.php
al temei copil, am următorul cod pentru afișarea titlului paginilor de arhivă:
<?php
the_archive_title( '<h1 class="page-title">', '</h1>' );
?>
Dar acesta afișează titlurile mele ca "Categorie: Titlul Categoriei" în loc să afișeze simplu titlul fără prefixul "Categorie: ".
Primul meu instinct a fost să suprascriu get_the_archive_title()
din wp-includes/general-template
. Dar din ce am citit, aparent nu ar trebui să modific niciodată fișierele de bază WordPress, nici măcar cu suprascrieri din tema copil.
Așadar, care este cea mai bună practică pentru a controla output-ul funcției the_archive_title()
?

Dacă te uiți la codul sursă al funcției get_the_archive_title()
, vei observa că există un filtru disponibil, numit get_the_archive_title
, prin care poți filtra rezultatul returnat de funcție.
Poți utiliza următorul cod pentru a modifica afișarea pe o pagină de categorie
add_filter( 'get_the_archive_title', function ( $title ) {
if( is_category() ) {
$title = single_cat_title( '', false );
}
return $title;
});

Aceasta nu funcționează pe o pagină de arhivă cu un titlu precum Arhivă: Cărți
(unde Cărți
este un tip personalizat de postare). Funcția single_cat_title()
returnează un titlu de pagină doar dacă tipul este o categorie sau etichetă. Poți modifica răspunsul tău pentru a include o soluție care funcționează cu toate tipurile de conținut?

@QuinnComendant Uită-te la codul sursă, liniile 1239 și 1240 :-). Dacă ai o problemă, pur și simplu pune o nouă întrebare specifică problemei tale

Răspunsul acceptat funcționează pentru a elimina prefixul Categorie:
din titlurile arhivelor de categorii, dar nu și din alte taxonomii sau tipuri de postări. Pentru a exclude alte prefixe, există două opțiuni:
Reconstruiește titlul pentru toate variantele utilizate în funcția originală
get_the_archive_title()
:// Returnează un titlu alternativ, fără prefix, pentru fiecare tip utilizat în 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', 'formatul datei pentru arhive anuale' ) ); } elseif ( is_month() ) { $title = get_the_date( _x( 'F Y', 'formatul datei pentru arhive lunare' ) ); } elseif ( is_day() ) { $title = get_the_date( _x( 'F j, Y', 'formatul datei pentru arhive zilnice' ) ); } elseif ( is_tax( 'post_format' ) ) { if ( is_tax( 'post_format', 'post-format-aside' ) ) { $title = _x( 'Notițe', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) { $title = _x( 'Galerii', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-image' ) ) { $title = _x( 'Imagini', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-video' ) ) { $title = _x( 'Video-uri', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) { $title = _x( 'Citate', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-link' ) ) { $title = _x( 'Link-uri', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-status' ) ) { $title = _x( 'Stări', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) { $title = _x( 'Audio', 'titlul arhivei de format post' ); } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) { $title = _x( 'Conversații', 'titlul arhivei de format post' ); } } elseif ( is_post_type_archive() ) { $title = post_type_archive_title( '', false ); } elseif ( is_tax() ) { $title = single_term_title( '', false ); } else { $title = __( 'Arhive' ); } return $title; });
Sau, pur și simplu elimină orice arată ca un prefix de titlu (ceea ce poate modifica titlurile reale care conțin un cuvânt urmat de caracterul două puncte):
// Pur și simplu elimină orice arată ca un prefix de titlu ("Arhivă:", "Foo:", "Bar:"). add_filter('get_the_archive_title', function ($title) { return preg_replace('/^\w+: /', '', $title); });

O altă opțiune este:
<?php echo str_replace('Brand: ','',get_the_archive_title()); ?>
Înlocuiește 'Brand: ' cu orice text dorești să elimini.
Este util să înțelegi diferența dintre get_the_archive_title() și the_archive_title(): the_archive_title() returnează un array get_the_archive_title() returnează un string

Aceasta nu funcționează pe o pagină de arhivă cu titlul Arhivă: Cărți (unde Cărți este un tip personalizat de postare).

@ThatBrazilianGuy single_cat_title
utilizează intern single_term_title
, care funcționează și pe taxonomii. Asigură-te că tema ta nu are unul dintre următoarele șabloane definite: taxonomy-book.php
sau taxonomy.php
, deoarece acestea au prioritate față de archive.php
. De asemenea, ia în considerare testarea oricăreia dintre metodele din celelalte răspunsuri. Acest răspuns este destul de vechi, funcționa corect în momentul în care l-am postat, dar nu mai dezvolt pentru WordPress.

Ben Gillbanks are o soluție elegantă care gestionează toate tipurile de postări și taxonomiile:
function hap_hide_the_archive_title( $title ) {
// Sărim dacă site-ul nu e LTR, acesta este aspect vizual, nu funcțional.
// Ar trebui să încercăm să găsim o soluție elegantă care funcționează pentru ambele direcții.
if ( is_rtl() ) {
return $title;
}
// Împărțim titlul în părți pentru a le putea înfășura cu span-uri.
$title_parts = explode( ': ', $title, 2 );
// Lipim părțile înapoi împreună.
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' );

Folosește această metodă în loc de the_archive_title()
. Funcționează cu CPT (Custom Post Types) și taxonomii personalizate.
<?php
$term = $wp_query->get_queried_object();
$term_title = $term->label //funcționează cu CPT (ex: Cărți)
?? $term->name //funcționează cu termenii din taxonomii personalizate (returnează Mic în mărime/mic)
?? "fără titlu";
?>
<h1><?php echo $term_title; ?></h1>
