Forțează WordPress să afișeze Pagini în loc de Categorii

10 iul. 2013, 22:48:37
Vizualizări: 22.6K
Voturi: 5

Î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!

0
Toate răspunsurile la întrebare 9
7

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 );
11 iul. 2013 06:28:52
Comentarii

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.

Sid Sid
11 iul. 2013 07:39:00

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

Milo Milo
11 iul. 2013 07:42:12

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?

Sid Sid
11 iul. 2013 09:41:33

î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.

Milo Milo
11 iul. 2013 18:10:18

Î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. :)

Sid Sid
11 iul. 2013 22:27:21

vezi modificarea de mai sus.

Milo Milo
11 iul. 2013 22:38:08

A funcționat excelent, mulțumesc! Am adăugat in_array($term->slug, ['foo', 'bar']) pentru a se aplica doar la acele două categorii pentru care aveam pagini

kero kero
22 nov. 2018 12:38:49
Arată celelalte 2 comentarii
2

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.

31 mai 2016 17:12:05
Comentarii

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!)

Nabha Cosley Nabha Cosley
12 apr. 2018 02:56:15

Nu a funcționat complet în cazul meu, titlul paginii era afectat, de exemplu.

kero kero
22 nov. 2018 12:38:18
2

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.

  1. WP Dashboard->Settings->Permalinks

  2. Selectați "Structură personalizată" și introduceți /%category%/%postname%/ în câmp

  3. 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.

  1. WP Dashboard->SEO->Advanced->Permalinks(filă)

  2. "Schimbă URL-uri->Elimină baza categoriei..." = Păstrează

  3. 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

18 sept. 2018 13:14:06
Comentarii

încă funcționează perfect în 2021

Dark Dark
30 sept. 2021 14:35:35

Pentru mine nu a funcționat cu o subcategorie, din nu știu ce motiv redirecționa către un articol care avea un slug similar cu subcategoria mea.

Robbiegod Robbiegod
4 nov. 2022 22:29:46
3

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ă/

10 iul. 2013 23:02:44
Comentarii

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.

Sid Sid
10 iul. 2013 23:14:03

?? Îmi pare rău, nu înțeleg

JMau JMau
10 iul. 2013 23:20:29

URL-ul paginii și URL-ul categoriei sunt identice. Fac acest lucru "intenționat" pentru a crea o structură SILO, dar WordPress afișează pagina de categorie în locul noii pagini. Sper că are sens acum.

Sid Sid
11 iul. 2013 05:20:44
6

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.

11 iul. 2013 04:37:25
Comentarii

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.

Sid Sid
11 iul. 2013 05:23:08

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

kaiser kaiser
11 iul. 2013 05:24:34

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

Milo Milo
11 iul. 2013 06:10:02

@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 Sid
11 iul. 2013 07:02:15

@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.

Milo Milo
11 iul. 2013 07:37:18

@Milo susțin și eu recomandarea de a folosi Advanced Custom Fields pentru asta. Poți folosi și WordPress SEO by Yoast pentru a modifica meta descrierile și titlurile, obținând astfel aceleași beneficii SEO pe care le au paginile.

qccreative qccreative
5 sept. 2013 19:29:59
Arată celelalte 1 comentarii
1

Mai întâi elimină categoria în Yoast Setează categoria ca no-index în Yoast, dar înainte de a face asta, structura permalinkului trebuie setată ca /%category%/%postname%/

14 apr. 2019 05:36:56
Comentarii

Această metodă funcționează, dar atunci când adaugi o pagină cu un slug care se potrivește cu una dintre categoriile tale, categoria încâ câștigă. Eu vreau ca pagina să câștige.

Robbiegod Robbiegod
4 nov. 2022 22:22:33
1

Î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

23 oct. 2020 14:15:26
Comentarii

Acest lucru nu funcționează exact așa cum ar trebui. Când încerc această metodă, încă se încarcă "categoria", dar folosește doar pagina corespunzătoare pentru a afișa conținutul. Am nevoie ca pagina reală să se încarce. Există vreo modalitate de a face asta?

Robbiegod Robbiegod
4 nov. 2022 22:21:41
0

Î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' );
16 iun. 2023 15:11:46
1

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!

17 aug. 2023 05:31:29
Comentarii

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

bueltge bueltge
18 aug. 2023 08:40:26