Flush Rewrite Rules su init o rest_api_init? Quale scegliere per l'API REST

24 set 2018, 13:57:11
Visualizzazioni: 1.25K
Voti: 2

Se sto utilizzando l'API REST per creare endpoint nel mio plugin, dovrei eseguire il flush delle rewrite rules su init o su rest_api_init?

So che dovrebbe essere fatto durante l'attivazione/disattivazione del plugin. Tuttavia, una volta che uno di questi eventi viene triggerato, non bisogna comunque rispettare il tradizionale processo degli hook per assicurarsi che le rewrite rules vengano flusate DOPO che sono state modificate? Ovvero - dopo che le route REST sono state aggiunte.

Esempio:

function activate() {

    // fai qualcosa quando questo plugin viene attivato...

    add_action( 'init', function () {

        flush_rewrite_rules( true );
    }, 9999 );

    return true;

}

# Attivazione Plugin
register_activation_hook( __FILE__, function () {

    require_once( PATH . '/backend/inc/activation.php' );
    Backend\activate();

} );

init

add_action( 'init', function () {

    flush_rewrite_rules( true );
}, 9999 );

rest_api_init

add_action( 'rest_api_init', function () {

    flush_rewrite_rules( true );
}, 9999 );
0
Tutte le risposte alla domanda 1
6

Il flush delle regole di riscrittura non dovrebbe essere eseguito di routine, come indicato nel codex:

Non farlo su alcun hook che viene attivato regolarmente.

Dovresti farlo tramite gli hook di attivazione del plugin o gli hook di cambio tema:

add_action( 'after_switch_theme', 'wpse315001_flush_rewrite_rules' );

register_deactivation_hook( __FILE__, 'wpse315001_flush_rewrite_rules' );
register_activation_hook( __FILE__, 'wpse315001_flush_rewrite_rules' );
function wpse315001_flush_rewrite_rules() {
    flush_rewrite_rules();
}

Uno dei metodi sopra indicati, e dovrebbe essere fatto DOPO aver registrato i tuoi custom post type.

Inoltre, dovresti eseguire il flush delle regole di riscrittura dopo che il tuo plugin è stato disattivato. Questo assicura che nessuna regola non valida rimanga.

Tuttavia, come ogni altro problema, anche questo ha una soluzione alternativa non proprio elegante. Se le tue regole di riscrittura contengono una parola chiave semi-unica, puoi ottenere le regole di riscrittura dalle opzioni, eseguire una ricerca su di esse e fare il flush delle regole solo se necessario:

add_action( 'init', 'wpse315001_flush_rewrite_rules', 99999 );
function wpse315001_flush_rewrite_rules(){

    // Ottieni le regole di riscrittura
    $rules = get_option('rewrite_rules');

    // Controlla se la tua regola semi-unica esiste in questa stringa
    if ( ! strpos( $rules, 'your-rewrite-rules' ) ) {
        // Flush totale!
        flush_rewrite_rules();
    }
}

Forse non è la soluzione migliore, ma può funzionare.

24 set 2018 14:58:28
Commenti

Mi rendo conto che dovrebbe essere fatto all'attivazione/disattivazione del plugin. Tuttavia, una volta che uno di questi eventi viene attivato, non bisogna comunque rispettare il tradizionale processo degli hook per garantire che le regole di riscrittura vengano svuotate DOPO che sono state modificate? Ovvero - Dopo che le rotte REST sono state aggiunte.

Michael Ecklund Michael Ecklund
24 set 2018 16:32:48

Analizzando la classe delle regole di riscrittura, posso vedere che una volta che la chiami, le regole vengono immediatamente svuotate. Inoltre, il codex menziona chiaramente che questo deve essere fatto dopo la registrazione dei post type, probabilmente per lo stesso motivo. Qualche geniale sviluppatore potrebbe registrare i post type su un hook diverso, su un tema, o addirittura con priorità 999999.

Johansson Johansson
24 set 2018 16:39:10

@MichaelEcklund Ho anche aggiornato la mia risposta per te.

Johansson Johansson
24 set 2018 16:46:43

chiama la funzione che registra i tipi di contenuto all'interno della funzione wpse315001_flush_rewrite_rules, quindi svuota le regole.

Milo Milo
24 set 2018 16:47:49

@Milo presumo che non sia il caso, poiché risolverebbe facilmente il problema. Immagino che il CPT venga aggiunto da altri plugin.

Johansson Johansson
24 set 2018 16:48:42

beh, noti che dovrebbe essere fatto DOPO aver registrato i tuoi custom post types, cosa che deve avvenire all'interno del blocco di codice che hai lì, quindi per completezza dovrebbe essere aggiunto, poiché così com'è quel codice non funzionerà.

Milo Milo
24 set 2018 16:54:26
Mostra i restanti 1 commenti