Pagina singola di un custom post type reindirizza alla pagina 404

7 mar 2016, 16:23:39
Visualizzazioni: 18.4K
Voti: 5

Ho dichiarato il post type come segue:

 $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'query_var' => true,
        'rewrite' => array('slug' => 'agences'),
        'capability_type' => 'post',
        'has_archive' => true,
        'hierarchical' => false,
        'menu_position' => 5,
        'taxonomies' => array('brands', 'country'),
        'supports' => array('title', 'editor', 'author', 'thumbnail', 'custom-fields')
    );

    register_post_type('destinations', $args);

Inizialmente potevo accedere alla pagina singola di questo post type usando single-agences.php ma ora viene reindirizzato alla 404.

Ho controllato altre risposte e ho scoperto che è un errore comune ma le altre soluzioni non hanno risolto il problema. Qualsiasi aiuto sarà prezioso.

3
Commenti

Poiché non stai utilizzando le regole di riscrittura predefinite, devi svuotarle e ricostruirle. Vedi questo: custom_post_type con has_archive non cambia il permalink

cybmeta cybmeta
7 mar 2016 16:42:44

Il tuo file single dovrebbe essere single-destinations.php, non con la regola di riscrittura. E tutto il tuo codice dovrebbe essere all'interno di una funzione agganciata a init.

Mayeenul Islam Mayeenul Islam
7 mar 2016 20:47:28

Ho provato single-destinations.php prima di provare single-agences.php ma non funzionava. Anche se non utilizza questi file dovrebbe usare single.php ma restituisce un errore 404. e sì, il codice è in una funzione agganciata a init.

Deepak jha Deepak jha
7 mar 2016 20:55:44
Tutte le risposte alla domanda 2
5
12

Un CPT appena registrato mostra un errore 404 perché la funzione register_post_type() non aggiorna automaticamente le regole di riscrittura. Sta a te decidere se farlo manualmente o automaticamente.

Metodo Manuale:

Accedi a /wp-admin/, poi vai su Impostazioni » Permalink, e semplicemente clicca il pulsante Salva modifiche per aggiornare le regole di riscrittura.

Metodo Automatico:

Puoi aggiornare le regole di riscrittura usando la funzione flush_rewrite_rules(). Tuttavia, poiché register_post_type() viene chiamato nell'hook init, verrà eseguito ogni volta che l'hook init viene attivato. Anche il codex lo conferma:

Questa funzione è utile quando si utilizzano custom post type perché permette l'aggiornamento automatico delle regole di riscrittura di WordPress (che di solito devono essere aggiornate manualmente per i nuovi custom post type). Tuttavia, questa è un'operazione costosa quindi dovrebbe essere usata solo quando strettamente necessario.

Per questo motivo è meglio agganciare l'operazione a qualcosa che viene eseguito una sola volta, e che aggiorna le regole solo quando necessario. Come @cybmeta ha già mostrato. Ma puoi anche seguire l'approccio di @bainternet:

/**
 * Per attivare la pagina singola del CPT
 * @author  Bainternet
 * @link http://en.bainternet.info/2011/custom-post-type-getting-404-on-permalinks
 * ---
 */
$set = get_option( 'post_type_rules_flased_mycpt' );
if ( $set !== true ){
    flush_rewrite_rules( false );
    update_option( 'post_type_rules_flased_mycpt', true );
}

Lui salva un valore nella tabella options solo per il tuo post type. E se il valore non è presente, aggiorna le regole di riscrittura. Se è presente, non lo fa.

Ma nota che questa operazione effettua una query al database ogni volta (se non è in cache). Quindi, preferirei agganciare il codice all'hook after_setup_theme per i temi, o a register_activation_hook per i plugin.

Bonus

Durante il debug delle regole di riscrittura, questi plugin possono essere molto utili:

7 mar 2016 17:11:54
Commenti

Non è un CPT appena registrato. Ho anche provato a ripulire le regole di rewrite più volte ma non ha funzionato. Quando uso il formato permalink "semplice" funziona. Ma non con il formato "Nome articolo".

Deepak jha Deepak jha
7 mar 2016 20:22:18

Potresti confermare che mod_rewrite sia abilitato sul tuo server e che funzioni per altri URL standard di questa installazione WordPress? Ti consiglio anche di seguire il processo di debug base.

Mayeenul Islam Mayeenul Islam
7 mar 2016 20:47:08

Sul server ho molte installazioni WordPress con diversi custom post type e tutti funzionano correttamente.

Deepak jha Deepak jha
7 mar 2016 20:57:58

Quindi per noi è impossibile da rilevare. Puoi condividere il tuo prodotto utilizzando GitHub, Bitbucket, GitLab, ecc., in modo che qualcuno possa verificare se ha funzionato globalmente o meno. È troppo localizzato al tuo ambiente di sviluppo, che purtroppo nessuno può toccare. :(

Mayeenul Islam Mayeenul Islam
7 mar 2016 21:45:20

Era dovuto a un plugin "Remove taxonomy base slug". Era in conflitto con lo slug base del CPT "destinations". Ho dovuto usare "add_rewrite_rule" per controllare lo slug e reindirizzarlo manualmente alla posizione corretta.

Deepak jha Deepak jha
8 mar 2016 20:10:23
0

Era dovuto a un plugin "Remove taxonomy base slug". Era in conflitto con lo slug base del CPT "destinations". Ho dovuto usare add_rewrite_rule per verificare lo slug e reindirizzarlo manualmente alla posizione corretta

6 lug 2017 07:51:43