Forțează WordPress să afișeze Pagini în loc de Categorii
Încerc să creez o structură SILO pe unul dintre site-urile mele WordPress.
Am bifat întotdeauna această opțiune în plugin-ul Yoast SEO "Elimină baza categoriei (de obicei /category/) din URL-ul categoriei."
Astfel, paginile mele de categorie au acest URL: sitename.com/apple/ (unde "apple" este pagina categoriei)
Acum vreau să creez o nouă "pagină" cu același slug, apple.
Pot crea ușor o nouă pagină "apple", dar când accesez sitename.com/apple/ se afișează pagina categoriei -- în loc de pagina nou creată.
Întrebarea mea: Există vreo modalitate de a "suprascrie" prioritatea implicită a categoriei față de o pagină? Aș dori să afișez pagina deoarece voi avea control asupra ei -- pot personaliza, adăuga mai mult conținut și le pot modifica ușor (plus, paginile mă vor ajuta să îmi structurez site-ul mai bine)
Apreciez ajutorul vostru!

O posibilă soluție este să nu schimbi baza categoriei și să o lași așa cum este, dar să modifici orice afișare a unui link de categorie pentru a elimina baza categoriei printr-un filtru. Desigur, acest lucru va duce la o eroare 404 dacă nu ai creat o pagină în locul unde aceste link-uri trimit, deci este necesar să creezi o pagină pentru fiecare categorie.
function wpa_alter_cat_links( $termlink, $term, $taxonomy ){
if( 'category' != $taxonomy ) return $termlink;
return str_replace( '/category', '', $termlink );
}
add_filter( 'term_link', 'wpa_alter_cat_links', 10, 3 );
Probabil vei dori să testezi acest lucru în detaliu pentru orice efecte secundare, folosește la propriul risc!
EDITARE - modificarea doar a link-urilor categoriilor de nivel superior:
function wpa_alter_cat_links( $termlink, $term, $taxonomy ){
if( 'category' == $taxonomy && 0 == $term->parent ){
return str_replace( '/category', '', $termlink );
}
return $termlink;
}
add_filter( 'term_link', 'wpa_alter_cat_links', 10, 3 );

Milo, exact asta voiam! Nu-mi vine să cred că a fost atât de ușor și posibil. Mulțumesc mult!
Totuși, există o problemă. Paginile subcategoriilor duc către eroarea 404. Există vreo modalitate de a remedia asta?
Detalii suplimentare: Pentru site-urile mele, sunt necesare breadcrumbs (firimituri de pâine). Iată formatul: Acasă -> Categoria 1 -> Subcategoria 2 -> articol. Categoria 1 este acum o PAGINĂ, dar subcategoria 2 duce către o pagină 404.

ar trebui să creezi pagini copil sub paginile părinte pentru subcategorii.

Geniu, asta ești. Mulțumesc mult. Asta necesită într-adevăr mult timp și efort. Cred că o voi face oricum. Totuși, aș dori să știu dacă pot direcționa doar categoria părinte către o PAGINĂ, în timp ce subcategoria să afișeze pagina implicită de categorie?

în funcția de mai sus, verifică dacă $term->parent
este egal cu 0
. Categoriile copil vor avea un ID de categorie ca $term->parent
, iar la categoriile de nivel superior va fi zero.

Înțeleg că trebuie să folosesc if ($term->parent == 0) dar nu sunt sigur unde să pun acest cod. Am căutat pe Google ceva timp dar nu am reușit să fac asta să funcționeze. Aș aprecia foarte mult dacă ai putea revizui codul. :)

Am creat următoarea funcție destul de simplă pentru a face ca paginile să aibă o importanță mai mare decât categoriile la încărcarea conținutului.
(Notă: aceasta poate să nu fie cea mai bună, dar este o modalitate simplă. Am descoperit o problemă când folosesc plugin-ul Advanced Custom Fields, acesta nu inserează câmpurile personalizate nici ale paginii vechi, nici ale celei noi în mod implicit. Adăugarea get_queried_object()->ID
ca al doilea parametru al funcției get_field()
din ACF a rezolvat această problemă. Testați-o cu atenție în mediul dumneavoastră WordPress.)
function loadPageFirst() {
// obține categoria actuală
$actualCategory = get_category( get_query_var('cat') );
// obține pagina cu același slug
$matchingPage = get_page_by_path( $actualCategory->slug );
// Dacă nu există o potrivire, încarcă șablonul normal de listare și ieși (editează dacă folosești un șablon personalizat de listare, de ex. category.php)
if (!$matchingPage) {
include( get_template_directory() . '/archive.php');
die();
}
// Creează o nouă interogare cu ID-ul paginii și încarcă șablonul paginii
query_posts( 'page_id=' . $matchingPage->ID );
include( get_template_directory() . '/page.php');
die();
}
add_filter( 'category_template', 'loadPageFirst' );
Puteți include acest cod în fișierul functions.php al temei dumneavoastră. Se pare că funcționează corect cu plugin-ul Yoast SEO.

Cred că nu este necesar să incluzi archive.php și die() — în funcție de tema ta, acest lucru poate să nu funcționeze. Poți pur și simplu să folosești return în schimb. (Dar mulțumesc mult pentru cod!)

Există un răspuns super simplu și perfect funcțional aici: https://stackoverflow.com/questions/32310453/make-wordpress-use-the-page-instead-of-category
Pentru completitudine:
Context
- example.com este domeniul
- Am o pagină WP numită "foobar" cu conținut
- Am o categorie de postări WP numită "foobar"
- Am o postare WP intitulată "lucruri distractive de făcut cu foobars", iar categoria este setată la "foobar"
Așteptări
- Când accesez example.com/foobar, vreau să văd pagina despre foobars, nu o pagină de categorie WP care afișează toate postările din blog cu acea categorie.
- Când accesez postarea despre lucrurile distractive, URL-ul este example.com/foobar/lucruri-distractive-de-facut-cu-foobars/
Configurare
Iată configurația mea (nu necesită pluginuri suplimentare sau modificări de cod) Câteva pluginuri instalate sunt WP Rocket și Yoast pe care mă voi concentra în acest thread.
WP Dashboard->Settings->Permalinks
Selectați "Structură personalizată" și introduceți /%category%/%postname%/ în câmp
Pe aceeași pagină, schimbați "Baza categoriei" în un singur punct. "." (fără ghilimele, doar un singur punct)
Am instalat Yoast, pe care l-am configurat să suprascrie setările de permalinkuri, dar cred că asta a încurcat sarcina mea.
WP Dashboard->SEO->Advanced->Permalinks(filă)
"Schimbă URL-uri->Elimină baza categoriei..." = Păstrează
Apoi trebuie să goliți cache-ul. Folosesc WP Rocket pentru caching, așa că am golit cache-ul și acum totul funcționează așa cum ar trebui.
Editare: asigurați-vă că salvați modificările după pașii 3 și 5

Depinde. Dacă încerci să setezi 2 pagini diferite cu același URL, nu este o idee bună. Dar dacă nu te interesează paginile de categorie, le poți redirecționa către paginile tale.
RedirectMatch 301 ^/category/(.*)$ /$1
Acest cod se adaugă în fișierul .htaccess
și redirecționează /category/pagină către /pagină/

Mulțumesc! Totuși, cum am menționat anterior, nu am baza de categorie atașată la URL. Și nu pot folosi redirecționarea 301 tradițională deoarece ambele URL-uri sunt identice.

Modul "WordPress" de a face acest lucru ar fi să creezi un șablon PHP personalizat pentru pagina de categorie și să aplici personalizările acolo, în loc să creezi o "Pagină" unică.
De asemenea, există numeroase plugin-uri disponibile care îți permit să adaugi imagini și alte câmpuri personalizate la pagina de arhivă a categoriei, ceea ce poate fi o opțiune mai bună dacă preferi să nu modifici fișierele temei.
Alternativ, aș sugera să adaugi o bază de categorie care este poate unul dintre cuvintele cheie principale țintite.

Problema este, cred eu, că WordPress tratează „paginile” diferit. Ele se clasează mai bine decât paginile tradiționale de categorii. Mulți specialiști SEO fac ceea ce am întrebat mai sus — elimină complet categoria și o înlocuiesc cu pagini.

Probabil ar trebui să detaliezi cum să adaugi acest șablon de pagină (indică: ierarhia șabloanelor), etc.

@Sid - dacă conținutul este identic, de ce s-ar clasifica diferit o arhivă de categorii față de o pagină?

@Milo - Conținutul nu va fi identic, doar URL-ul va fi același. Paginile vor avea un conținut mult mai structurat și linkuri către materiale conexe.

@Sid punctul meu era că poți obține aceleași rezultate prin intermediul unui șablon de categorie, extragând conținut suplimentar din alte părți. o modalitate rapidă de a realiza acest lucru este prin plugin-ul Advanced Custom Fields, care îți permite să adaugi conținut suplimentar pe paginile de administrare a termenilor de taxonomie - editori wysiwyg, câmpuri de relații, etc.

Îmi pare rău, dar nu am suficientă reputație pentru a comenta la răspunsul lui @bencergazda.
Consider că aceasta este cea mai bună soluție. Dar am întâmpinat o eroare cu afișarea imaginii în header-ul temei, deoarece nu se obținea ID-ul corect al postării.
Pentru soluție, am adăugat linia de text în cod: "global $post; $post->ID = $matchingPage->ID;"
Rezultatul
function loadPageFirst() {
// obține categoria actuală
$actualCategory = get_category( get_query_var('cat') );
// obține pagina cu același slug
$matchingPage = get_page_by_path( $actualCategory->slug );
// Dacă nu există potrivire, încarcă șablonul normal de listare și iese (editează dacă folosești un șablon personalizat, ex. category.php)
if (!$matchingPage) {
include( get_template_directory() . '/archive.php');
die();
}
// Creează o nouă interogare cu ID-ul paginii și încarcă șablonul de pagină
global $post; $post->ID = $matchingPage->ID;
query_posts( 'page_id=' . $matchingPage->ID );
include( get_template_directory() . '/page.php');
die();
}
add_filter( 'category_template', 'loadPageFirst' );
Cele mai bune salutări

Îmi pare rău, dar nici eu nu am suficiente reputație pentru a comenta la răspunsul lui @bencergazda.
Am făcut câteva modificări în funcția sa. Am eliminat partea care încărca pagina de categorie (necesară) și am adăugat ierarhia paginilor:
function loadPageFirst( $file ) {
// obține categoria actuală
$actualCategory = get_category( get_query_var('cat') );
// obține pagina cu același slug
$matchingPage = get_page_by_path( $actualCategory->slug );
if ( ! $matchingPage ) {
return $file;
}
// Face o nouă interogare cu ID-ul paginii și încarcă șablonul paginii
query_posts( 'page_id=' . $matchingPage->ID );
$page_template = get_page_template_slug( $matchingPage->ID ) ? get_page_template_slug( $matchingPage->ID ) : null;
$pages = array(
$page_template,
'page-' . $actualCategory->slug . '.php',
'page-' . $matchingPage->ID . '.php',
'page.php',
'singular.php',
'index.php',
);
foreach ( $pages as $page ) {
$file = get_theme_file_path( $page );
if ( $page === null || ! file_exists( $file ) ) {
continue;
}
return $file;
}
}
add_filter( 'category_template', 'loadPageFirst' );

Acest lucru este uimitor. Exact un articol de acum 10 ani și încă funcționează perfect. Mă întreb dacă aceeași soluție este posibilă și pentru etichete? Aș dori să înlocuiesc paginile de arhivă pentru etichete cu pagini reale pe care am mai mult control asupra lor.
Poate cineva să mă ajute să realizez asta? Vă mulțumesc anticipat!

Vă rugăm să nu adăugați "mulțumesc" ca răspuns. Odată ce aveți suficientă reputație, veți putea vota întrebări și răspunsuri care v-au fost utile. - Din Recenzie
