Forzare WordPress a Mostrare Pagine Invece delle Categorie

10 lug 2013, 22:48:37
Visualizzazioni: 22.6K
Voti: 5

Sto cercando di creare una struttura SILO su uno dei miei siti WordPress.

Ho sempre selezionato questa opzione nel plugin Yoast SEO "Rimuovi la base della categoria (solitamente /category/) dall'URL della categoria."

Quindi le mie pagine di categoria hanno questo URL: sitename.com/apple/ (dove "apple" è la pagina della categoria)

Ora voglio creare una nuova "pagina" con lo stesso slug, apple.

Posso creare facilmente una nuova pagina "apple", tuttavia, quando vado su sitename.com/apple/ viene visualizzata la pagina della categoria -- invece della pagina appena creata.

La mia domanda: Esiste un modo per "sovrascrivere" la priorità predefinita della categoria rispetto a una pagina? Vorrei mostrare la pagina perché avrò il controllo su di essa -- posso personalizzarla, aggiungere più contenuti e modificarli facilmente (inoltre, le pagine mi aiuteranno a strutturare meglio il mio sito)

Apprezzo il vostro aiuto!

0
Tutte le risposte alla domanda 9
7

Una possibile soluzione è non modificare la base delle categorie e lasciarla così com'è, ma invece modificare qualsiasi output di un link di categoria per rimuovere la base della categoria tramite un filtro. Questo ovviamente causerà un errore 404 se non hai creato una pagina al posto a cui puntano questi link, quindi è necessario creare una pagina per ogni categoria.

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

Probabilmente vorrai testare accuratamente questa soluzione per eventuali effetti collaterali, usala a tuo rischio!

MODIFICA - modifica solo i link delle categorie di primo livello:

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 lug 2013 06:28:52
Commenti

Milo, è esattamente quello che volevo! Non riesco a credere che fosse così semplice e possibile. Grazie mille!

C'è però un problema. Le pagine delle sotto-categorie restituiscono errore 404. C'è un modo per risolvere?

Dettagli aggiuntivi: Per i miei siti, i breadcrumb sono obbligatori. Quindi questo è il formato: Home -> Cat 1 -> Sub cat 2 -> post. La cat 1 ora è una PAGINA, ma sub-cat 2 punta a una pagina 404.

Sid Sid
11 lug 2013 07:39:00

dovresti creare pagine figlie sotto le pagine genitore per le sottocategorie.

Milo Milo
11 lug 2013 07:42:12

Sei un genio, ecco cosa sei. Grazie mille. Questo richiede comunque molto tempo e impegno. Penso che lo farò comunque. Però vorrei sapere se posso puntare solo la categoria genitore a una PAGINA mentre le sotto-categorie mostrano la pagina di categoria predefinita?

Sid Sid
11 lug 2013 09:41:33

nella funzione sopra, controlla se $term->parent è uguale a 0. Le categorie figlie avranno un ID di categoria come $term->parent, nelle categorie di livello superiore sarà semplicemente zero.

Milo Milo
11 lug 2013 18:10:18

Capisco che devo usare if ($term->parent == 0) ma non sono sicuro dove inserire questo codice. Ho passato del tempo a cercare su Google ma non riesco a trovare un modo per farlo funzionare. Apprezzerei molto se potessi rivedere il codice. :)

Sid Sid
11 lug 2013 22:27:21

vedi modifica sopra.

Milo Milo
11 lug 2013 22:38:08

Ha funzionato molto bene, grazie! Ho aggiunto in_array($term->slug, ['foo', 'bar']) per applicarlo solo a quelle due categorie per cui avevo pagine

kero kero
22 nov 2018 12:38:49
Mostra i restanti 2 commenti
2

Ho creato la seguente funzione abbastanza semplice per dare priorità alle pagine rispetto alle categorie durante il caricamento dei contenuti.

(Nota: potrebbe non essere il metodo migliore, ma è un approccio semplice. Ho riscontrato un problema quando si utilizza il plugin Advanced Custom Fields: per impostazione predefinita non inserisce i campi personalizzati né della vecchia né della nuova pagina. Aggiungere get_queried_object()->ID come secondo parametro alla funzione get_field() di ACF ha risolto il problema. Testatelo attentamente nel vostro ambiente WordPress.)

function loadPageFirst() {
    // ottiene la categoria effettiva
    $actualCategory = get_category( get_query_var('cat') );
    // ottiene la pagina con lo stesso slug
    $matchingPage = get_page_by_path( $actualCategory->slug );

    // Se non trova corrispondenza, carica il template di elenco normale e termina (modifica se stai usando un template personalizzato, es. category.php)
    if (!$matchingPage) {
        include( get_template_directory() . '/archive.php');
        die();
    }

    // Crea una nuova query con l'ID della pagina e carica il template della pagina
    query_posts( 'page_id=' . $matchingPage->ID );
    include( get_template_directory() . '/page.php');
    die();
}
add_filter( 'category_template', 'loadPageFirst' );

Puoi includerlo nel file functions.php del tuo tema. Sembra funzionare correttamente con il plugin Yoast SEO.

31 mag 2016 17:12:05
Commenti

Credo che non sia necessario includere archive.php e die() — a seconda del tuo tema, potrebbe non funzionare. Puoi semplicemente fare return invece. (Ma grazie mille per il codice!)

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

Non ha funzionato completamente nel mio caso, il titolo della pagina era sballato ad es.

kero kero
22 nov 2018 12:38:18
2

Ecco una risposta super semplice e perfettamente funzionante qui: https://stackoverflow.com/questions/32310453/make-wordpress-use-the-page-instead-of-category

Per completezza:

Contesto

  • example.com è il dominio
  • Ho una pagina WP chiamata "foobar" con contenuto
  • Ho una categoria di post WP chiamata "foobar"
  • Ho un post WP intitolato "cose divertenti da fare con i foobar", e la categoria è impostata su "foobar"

Aspettative

  • Quando vado su example.com/foobar, voglio vedere la pagina riguardante i foobar, non una pagina di categoria WP che mostra tutti i post del blog con quella categoria.
  • Quando vado al post del blog sulle cose divertenti, l'URL è example.com/foobar/cose-divertenti-da-fare-con-i-foobar/

Configurazione

Ecco la mia configurazione (non richiede plugin aggiuntivi o modifiche al codice) Un paio di plugin installati sono WP Rocket e Yoast su cui mi concentrerò in questo thread.

  1. WP Dashboard->Impostazioni->Permalink

  2. Seleziona "Struttura personalizzata" e inserisci /%category%/%postname%/ nel campo

  3. Nella stessa pagina, cambia "Base categoria" con un singolo punto. "." (senza virgolette, solo un singolo punto/punto fermo

Ho Yoast installato, che avevo configurato per sovrascrivere le impostazioni dei permalink, ma credo che questo abbia incasinato il mio compito.

  1. WP Dashboard->SEO->Avanzate->Permalink(scheda)

  2. "Cambia URL->Rimuovi la base della categoria..." = Mantieni

  3. Poi devi svuotare la cache. Io uso WP Rocket per la cache, quindi ho svuotato la cache e ora tutto funziona come dovrebbe.

Modifica: assicurati di salvare le modifiche dopo i passaggi 3 e 5

18 set 2018 13:14:06
Commenti

funziona ancora perfettamente nel 2021

Dark Dark
30 set 2021 14:35:35

Per me questo non ha funzionato con una sottocategoria, per qualche motivo reindirizzava a un post che aveva uno slug simile alla mia sottocategoria.

Robbiegod Robbiegod
4 nov 2022 22:29:46
3

Dipende. Se stai cercando di impostare 2 pagine diverse con lo stesso URL non è una buona idea. Ma se non ti interessano le pagine delle categorie puoi reindirizzarle alle tue pagine.

 RedirectMatch 301 ^/category/(.*)$ /$1

Questo codice va nel file .htaccess e reindirizza /category/pagina verso /pagina/

10 lug 2013 23:02:44
Commenti

Grazie! Tuttavia, come menzionato prima, non ho la base della categoria allegata all'URL. E non posso usare il tradizionale 301 perché entrambi gli URL sono identici.

Sid Sid
10 lug 2013 23:14:03

?? Scusa, non capisco

JMau JMau
10 lug 2013 23:20:29

L'URL della pagina e l'URL della categoria sono gli stessi. Lo sto facendo "intenzionalmente" per creare una struttura SILO, ma Wordpress mostra la pagina della categoria al posto della nuova pagina. Spero sia chiaro.

Sid Sid
11 lug 2013 05:20:44
6

Il "metodo WordPress" per fare ciò sarebbe creare un template PHP personalizzato per la tua pagina di categoria e applicare le tue personalizzazioni lì, piuttosto che creare una "Pagina" unica.

Esistono anche numerosi plugin disponibili che ti permettono di aggiungere immagini e altri campi personalizzati alla pagina archivio delle categorie, che potrebbe essere un'opzione migliore se preferisci non modificare i file del tema.

In alternativa, suggerirei di aggiungere una base di categoria che corrisponda a una delle tue parole chiave principali.

11 lug 2013 04:37:25
Commenti

Il problema, credo, è che WordPress tratta le "pagine" in modo diverso. Si posizionano meglio rispetto alle tradizionali pagine di categoria. Molti SEO stanno facendo quello che ho chiesto sopra -- eliminando completamente la categoria e sostituendola con delle pagine.

Sid Sid
11 lug 2013 05:23:08

Probabilmente dovresti spiegare come aggiungere questo template di pagina (suggerimento: gerarchia dei template), ecc.

kaiser kaiser
11 lug 2013 05:24:34

@Sid - se il contenuto è identico, perché una pagina d'archivio di categoria dovrebbe posizionarsi diversamente da una pagina?

Milo Milo
11 lug 2013 06:10:02

@Milo - Il contenuto non sarà identico, solo l'URL lo sarà. Le pagine avranno contenuti molto più strutturati e link che puntano a materiale correlato.

Sid Sid
11 lug 2013 07:02:15

@Sid il mio punto era che potresti ottenere gli stessi risultati tramite un template di categoria, estraendo contenuti aggiuntivi da altre parti. Un modo rapido per ottenere ciò è il plugin Advanced Custom Fields, che ti permette di aggiungere contenuti aggiuntivi alle pagine di amministrazione dei termini di tassonomia - editor wysiwyg, campi di relazione, ecc..

Milo Milo
11 lug 2013 07:37:18

@Milo sostengo anche io la raccomandazione di Advanced Custom Fields per questo. Puoi anche usare WordPress SEO di Yoast per modificare le meta descrizioni e i titoli, ottenendo così gli stessi benefici SEO che hanno le pagine.

qccreative qccreative
5 set 2013 19:29:59
Mostra i restanti 1 commenti
1

Prima rimuovi la categoria in Yoast Imposta come no-index la categoria in Yoast, ma prima di farlo la struttura dei permalink dovrebbe essere impostata come /%category%/%postname%/

14 apr 2019 05:36:56
Commenti

Questo funziona, ma quando aggiungi una pagina con uno slug corrispondente a una delle tue categorie, la categoria ha ancora la precedenza. Voglio che sia la pagina ad avere la precedenza.

Robbiegod Robbiegod
4 nov 2022 22:22:33
1

Scusa ma non ho abbastanza reputazione per commentare la risposta di @bencergazda.

Trovo che questa sia la soluzione migliore. Ma ho avuto un errore con l'immagine mostrata nell'header del tema, perché non ottenevo il corretto post-id.

Per risolvere ho aggiunto questa riga di codice: "global $post; $post->ID = $matchingPage->ID;"

Il risultato

function loadPageFirst() {
    // ottieni la categoria attuale
    $actualCategory = get_category( get_query_var('cat') );
    // ottieni la pagina con lo stesso slug
    $matchingPage = get_page_by_path( $actualCategory->slug );

    // Se nessuna corrispondenza, carica il template di elenco normale ed esci (modifica se stai usando un template personalizzato per l'elenco, es. category.php)
    if (!$matchingPage) {
        include( get_template_directory() . '/archive.php');
        die();
    }

    // Crea una nuova query con l'ID della pagina e carica il template della pagina
    global $post; $post->ID = $matchingPage->ID;
    query_posts( 'page_id=' . $matchingPage->ID );
    include( get_template_directory() . '/page.php');
    die();
}
add_filter( 'category_template', 'loadPageFirst' );

Cordiali saluti

23 ott 2020 14:15:26
Commenti

Questo non funziona esattamente. Quando provo questo metodo, continua a caricare la "categoria" ma utilizza solo la pagina corrispondente per visualizzare il contenuto. Ho invece bisogno che venga caricata la vera pagina. C'è un modo per ottenere questo risultato?

Robbiegod Robbiegod
4 nov 2022 22:21:41
0

Mi dispiace ma non ho abbastanza reputazione per commentare la risposta di @bencergazda.

Ho apportato alcune modifiche alla sua funzione. Ho rimosso la parte che caricava la pagina della categoria (non necessaria) e ho aggiunto la gerarchia delle pagine:

function loadPageFirst( $file ) {
    // ottieni la categoria attuale
    $actualCategory = get_category( get_query_var('cat') );
    // ottieni la pagina con lo stesso slug
    $matchingPage = get_page_by_path( $actualCategory->slug );

    if ( ! $matchingPage ) {
        return $file;
    }

    // Crea una nuova query con l'ID della pagina e carica il template della pagina
    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 giu 2023 15:11:46
1

È incredibile. Un post di esattamente 10 anni fa che funziona ancora perfettamente. Mi chiedo se la stessa soluzione sia possibile per i tag? Vorrei sostituire le pagine di archivio dei tag con pagine reali su cui ho più controllo.

Qualcuno può aiutarmi a realizzare questo? Grazie in anticipo!

17 ago 2023 05:31:29
Commenti

Per favore non aggiungere "grazie" come risposta. Una volta che avrai sufficiente reputazione, potrai votare positivamente domande e risposte che hai trovato utili. - Da Revisione

bueltge bueltge
18 ago 2023 08:40:26