Forzare WordPress a Mostrare Pagine Invece delle Categorie
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!
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 );

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.

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

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?

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.

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

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.

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

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.
WP Dashboard->Impostazioni->Permalink
Seleziona "Struttura personalizzata" e inserisci /%category%/%postname%/ nel campo
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.
WP Dashboard->SEO->Avanzate->Permalink(scheda)
"Cambia URL->Rimuovi la base della categoria..." = Mantieni
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

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/

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.

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.

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.

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

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

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

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

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

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

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
