Il modo migliore per flush_rewrite_rules per il tipo di post personalizzato, in un plugin mu-plugins?


9

Sto scrivendo un plugin che crea un'istanza di un tipo di post personalizzato (tra le altre cose). È un plug-in multisito e vive nella directory mu-plugins .

Qual è la migliore pratica per gestire flush_rewrite_rules () in questa situazione? Per un plug-in 'normale' lo faresti in un hook di attivazione - che non sarà possibile per un plug-in da usare poiché questi hook non sono disponibili.

Dal momento che questo dovrebbe essere un evento "una tantum" dopo aver registrato il tipo di post personalizzato, avrebbe senso fare qualcosa del genere nella mia classe che registra il CPT:

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

Quindi, la registrazione CPT avviene su ogni azione "init" - ma se ho questo diritto, le regole di riscrittura si verificano solo una volta. Mai .

Sono sulla buona strada?

(modifica): l'ho appena provato; il mio CPT sta dando un errore 404 non trovato, quindi le regole di riscrittura non funzionano :-(

(modifica n. 2): ho provato la soluzione per accedere alla variabile globale, come mostrato in questa domanda: Come svuotare in modo affidabile le regole di riscrittura su più siti? - Aggiornerò il mio esempio di codice sopra per mostrarlo. Sfortunatamente sto ancora ricevendo un errore 404 quando provo a caricare un CPT. Vedo che le regole di riscrittura vengono archiviate nel database, sembra proprio che non vengano utilizzate. Mi sono perso.



Non esiste davvero un modo corretto per farlo. Questo è fondamentalmente il migliore al momento di scrivere questo commento.
Pieter Goosen il

@PieterGoosen - grazie, l'ho già visto in precedenza e ho aggiornato la mia domanda per considerare l'altra soluzione. Continua a non funzionare. Mi chiedo se ho rotto qualcosa eseguendo flush_rewrite_rules () prima di vedere l'altra risposta? Forse devo cancellare il mio sito di test e ripristinarlo, per testare accuratamente la procedura corretta?
CC,

Questo potrebbe essere possibile. L'esecuzione errata delle regole di riscrittura flush in un sito multiplo può violare tutte le regole di riscrittura nella rete. Se fossi in te, ricomincerei da capo. Spero solo che questa sia un'installazione locale e non un sito live ;-)
Pieter Goosen,

giusto ... lo proverò. E no, è un sito di test e penso di poter cancellare il DB e reimpostare la configurazione di rete nel mio sonno ormai! :-)
CC,

Risposte:


2

La flush_rewrite_rulesfunzione è affidabile in alcuni contesti come un tema o un plugin basato su hook ma non sono sicuro che funzioni per amu-plugin

La mia affermazione si basa sul fatto che WordPress è inizializzato in questo modo:

  • chiama il wp-settings.phpfile
  • chiama l' do_action( 'muplugins_loaded' );hook, qui il tuo plugin è inizializzato
  • chiama $GLOBALS['wp_rewrite'] = new WP_Rewrite();qui il metodo flush_rulesè inizializzato e disponibile da ora in poi
  • do_action( 'setup_theme' );viene chiamato e scommetto tutti i miei soldi che su questo hook flush_rewrite_rulesfunzionerà

Soluzione?

Personalmente, trovo affidabile la cancellazione dell'opzione rewrite_rules.

delete_option('rewrite_rules');

o

update_option('rewrite_rules', '' );

Ogni volta che WordPress mancherà rewrite_rulesli ricostruirà, questo è anche ciò che fa il flush_rulesmetodo.

Ci sono punti nel flusso di esecuzione di WordPress in cui funzioni come questa non sono disponibili. anche nel cuore di WordPress ho trovato questa affermazione

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

L'unico problema sarebbe la prestazione, non farlo su ogni richiesta perché è un processo difficile per ricostruirli. Come posso vedere, vuoi scaricarli solo alla prima chiamata e questa è una buona cosa.

PS: Non sono un fan così auto-promozionale, ma ho anche scritto un articolo su questo tanto tempo fa e penso che sia ancora valido per questo


0

Se il tuo mu-plugin ha delle opzioni, inserirò il flush subito dopo averle aggiornate:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.