Risolvere un conflitto tra il nome di un custom post type e il permalink di una pagina (stesso slug)

19 feb 2014, 10:32:09
Visualizzazioni: 46.7K
Voti: 32

Ho un custom post type chiamato "visningshus" e anche una Pagina con lo stesso slug. Questa è la configurazione che deve essere mantenuta.

Attualmente, "http://my-site.com/visningshus" elenca tutti i post di quel tipo. Voglio invece mostrare la pagina che ha quello slug nel permalink.

Come posso fare in modo che WordPress non dia la precedenza al nome del post type, ma mostri invece la Pagina con quel permalink?

0
Tutte le risposte alla domanda 8
3
52

La soluzione più semplice sarebbe disabilitare la pagina archivio per questo CPT:

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

Non dimenticare di aggiornare i permalink successivamente in "Impostazioni > Permalink"

19 feb 2014 12:28:14
Commenti

Ha funzionato perfettamente - ma ora tutti i permalink che iniziano con il nome del custom post type restituiscono un errore 404, nonostante siano corretti in wp-admin e non sembri esserci alcun rewrite in atto. In altre parole, tutti i permalink sono corretti sul sito, ma tutti i custom post danno un 404. Puoi aiutarmi con questo? :)

Henrik Erlandsson Henrik Erlandsson
11 mar 2014 17:44:05

@HenrikErlandsson Forse il tuo post type ha lo stesso nome di una pagina. In questo caso ti consiglio di cambiare il nome del tuo post type. Esempio: Nome del custom post type - Prima: products Dopo: cpt_products.

Bruno Monteiro Bruno Monteiro
6 apr 2016 20:08:19

Molto intelligente. Risolve un sacco di problemi

bysanchy bysanchy
9 apr 2017 18:08:32
0
12

Non ho abbastanza reputazione per commentare il post di @Carl, ma la sua è la risposta corretta (almeno per questa situazione di mantenere lo slug della pagina e lo slug del custom post type uguali e non utilizzare un file archive.php)

Ma la sua soluzione causerebbe errori con la paginazione. Per evitare errori di paginazione:

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

Questo codice controlla la paginazione, prende il numero di pagina, e poi dall'altro lato forza l'uso della pagina con lo slug corrispondente, inserendo poi la variabile della pagina.

Questo in aggiunta a 'has_archive' => false, come indicato sopra dovrebbe raggiungere la funzionalità desiderata.

Come altri hanno detto, assicurati di svuotare le regole di riscrittura visitando Impostazioni > Permalink dopo aver fatto questa modifica.

Spero questo aiuti qualcuno, perché so che mi ha bloccato per molto tempo.

14 mar 2017 22:22:43
3

Ciao Henrik!

Penso che tutto ciò che devi fare sia aggiungere una regola di riscrittura alle regole di riscrittura di WordPress già esistenti. Aggiungi questo snippet di codice al tuo functions.php del tema o includilo come plugin separato...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
13 mag 2016 17:19:54
Commenti

Se qualcuno utilizza questo codice, rimuovi flush_rewrite_rules(); Non dovresti modificare le regole di riscrittura su init ogni volta. Ricarica una volta e poi rimuovilo, oppure svuota manualmente i permalink andando nelle impostazioni dei permalink nel pannello di amministrazione e cliccando "Salva modifiche"

tehlivi tehlivi
14 giu 2017 21:10:47

Tra tutte le risposte qui, questa ha funzionato per me !!! Grazie mille.

Pooja Mistry Pooja Mistry
11 giu 2020 19:12:17

Riguardo a flush_rewrite_rules() - non è una buona idea usare questa funzione in un hook init - o in qualsiasi altro hook che viene eseguito frequentemente. Questo farà sì che la tua installazione WordPress svuoti le regole di riscrittura dal database e le reinserisca per ogni singolo caricamento di pagina, il che è un sovraccarico veramente inutile, ed è il motivo per cui WordPress non lo fa automaticamente. Dopo aver creato la regola di riscrittura, basta andare in Impostazioni > Permalink e cliccare su salva - questo svuoterà manualmente le regole di riscrittura una sola volta, che è tutto ciò che è necessario.

bosco bosco
12 giu 2021 05:36:09
0

Se hai registrato il tipo di post personalmente, puoi modificare lo stato dell'archivio e l'URL nel tuo tema o plugin.

'has_archive' => true, abilita l'archivio in post-type-permalink. quindi cambialo con

'has_archive' => false, disabiliterà l'archivio.

'has_archive' => 'custom-slug', abiliterà l'archivio con uno slug personalizzato(http://my-site.com/custom-slug/).

Se un plugin o il tuo tema lo registra, puoi disabilitarlo nel modo indicato da krafter. Puoi anche utilizzare uno slug personalizzato per l'archivio.

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => 'custom-slug', 
        [...]
    )
);

Se hai bisogno sia della pagina che dell'archivio, il modo migliore sarebbe posizionare l'archivio in uno slug personalizzato diverso.

9 feb 2020 14:47:48
4

L'ho risolto senza risolvere il conflitto. Crea una pagina con lo slug visningshus e scrivi quello che vuoi al suo interno. Prendi nota dell'ID di questa pagina.

Crea e personalizza il template archive-custom-post-type.php nel modo che preferisci (molto probabilmente utilizzerai semplicemente un template di pagina) ma sostituisci la parte del loop con:

$recent = new WP_Query("page_id=id-tua-pagina");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

Poi quando andrai all'indirizzo http://my-site.com/visningshus vedrai il contenuto gestito dalla pagina all'URL corretto.

Fammi sapere se funziona.

19 feb 2014 12:31:15
Commenti

Buona idea, ma è eccessivamente complicata. Hai provato la mia soluzione?

kraftner kraftner
19 feb 2014 12:32:51

@kraftner no, non l'ho fatto. La proverò la prossima volta. Grazie!

molokom molokom
19 feb 2014 12:55:20

Questo comporta anche alcuni effetti collaterali come l'intestazione e tutto il resto che viene creato come se fosse una pagina archivio e non una pagina normale. Non consiglierei di utilizzare questa soluzione.

kraftner kraftner
19 feb 2014 13:00:30

E se l'ID della pagina cambia? Questo non è sicuro.

Joel James Joel James
6 feb 2017 09:19:05
0

Non è permesso votare, ma sono favorevole alla soluzione di Carl, register_post_type dovrebbe avere

'has_archive' => false

Semplice. Tuttavia, quando si affrontano problemi di paginazione, dai un'occhiata a

add_rewrite_rule
23 feb 2017 19:31:02
0

Ciò che ha risolto il problema per me è stato impostare archive su false, ma anche impostare Hierarchical su false durante la configurazione del mio custom post type!

5 ott 2018 15:50:24
0

Ecco una soluzione generale per dare priorità alla paginazione rispetto al contenuto dei custom post type per QUALSIASI slug di custom post type.

// dai priorità alla paginazione rispetto alla visualizzazione del contenuto dei custom post type
add_action('init', function() {
  add_rewrite_rule(
    '(.?.+?)/page/?([0-9]{1,})/?$',
    'index.php?pagename=$matches[1]&paged=$matches[2]',
    'top'
  );
});

Oltre ad aggiungere questo snippet, dovresti anche assicurarti che il tuo custom post type abbia archive = false

e infine, non meno importante, vai alla pagina delle impostazioni dei Permalink Impostazioni > Permalink (/wp/wp-admin/options-permalink.php) e salva le impostazioni attuali per aggiornare la struttura dei link nella pagina.

8 ott 2018 09:33:12