Flush Rewrite Rules pe init sau rest_api_init în WordPress?

24 sept. 2018, 13:57:11
Vizualizări: 1.25K
Voturi: 2

Dacă folosesc REST API pentru a crea endpoint-uri în plugin-ul meu, ar trebui să flush-uiesc rewrite rules pe init sau pe rest_api_init?

Înțeleg că acest lucru ar trebui făcut la activarea/dezactivarea plugin-ului. Totuși, odată ce oricare dintre aceste evenimente sunt declanșate, nu trebuie să respecți procesul tradițional de hook-uri pentru a te asigura că rewrite rules sunt flush-uite DUPA ce au fost modificate? Adică - După ce rutele REST au fost adăugate.

Exemplu:

function activate() {

    // face ceva când acest plugin este activat...

    add_action( 'init', function () {

        flush_rewrite_rules( true );
    }, 9999 );

    return true;

}

# Activare 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
Toate răspunsurile la întrebare 1
6

Regenerarea regulilor de rescriere (rewrite rules) nu ar trebui făcută în mod obișnuit, conform codicului:

Nu faceți acest lucru pe orice hook care este declanșat în mod obișnuit.

Ar trebui să o faceți fie prin hook-urile de activare a pluginului, fie prin hook-urile de schimbare a temei:

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();
}

Oricare dintre cele de mai sus, și ar trebui făcută DUPĂ ce ați înregistrat tipurile personalizate de postări (custom post types).

De asemenea, ar trebui să regenerați regulile de rescriere după ce plugin-ul este dezactivat. Acest lucru asigură că nu rămân reguli invalide.

Cu toate acestea, ca orice altă problemă, aceasta are și o soluție improvizată. Dacă regulile dvs. de rescriere conțin un cuvânt-cheie semi-unic, puteți obține regulile de rescriere din opțiuni, să faceți o căutare în ele și să le regenerați doar dacă este necesar:

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

    // Obține regulile de rescriere
    $rules = get_option('rewrite_rules');

    // Verifică dacă regula ta semi-unică există în acest șir
    if ( ! strpos( $rules, 'your-rewrite-rules' ) ) {
        // Regenerăm toate!
        flush_rewrite_rules();
    }
}

Poate nu cea mai bună soluție, dar funcționează.

24 sept. 2018 14:58:28
Comentarii

Îmi dau seama că ar trebui făcut la activarea/dezactivarea pluginului. Cu toate acestea, odată ce oricare dintre aceste evenimente sunt declanșate, nu trebuie totuși să respecți procesul tradițional al hook-urilor pentru a te asigura că regulile de rescriere sunt resetate DUPA ce au fost modificate? Adică - după ce rutele REST au fost adăugate.

Michael Ecklund Michael Ecklund
24 sept. 2018 16:32:48

Analizând clasa de reguli de rescriere, pot vedea că odată ce o apelezi, regulile sunt resetate imediat. De asemenea, codexul menționează în mod explicit că acest lucru trebuie făcut după înregistrarea tipurilor de postări, probabil din același motiv. Un geniu de developer ar putea să înregistreze tipurile de postări pe un alt hook, într-o temă, sau chiar cu prioritatea 999999.

Johansson Johansson
24 sept. 2018 16:39:10

@MichaelEcklund De asemenea, am actualizat răspunsul meu pentru tine.

Johansson Johansson
24 sept. 2018 16:46:43

apelează funcția care înregistrează tipurile de conținut din interiorul funcției wpse315001_flush_rewrite_rules, apoi resetează regulile.

Milo Milo
24 sept. 2018 16:47:49

@Milo Presupun că nu este cazul, deoarece asta ar rezolva ușor problema. Cred că CPT este adăugat de alte pluginuri.

Johansson Johansson
24 sept. 2018 16:48:42

ei bine, menționezi că ar trebui făcut DUPĂ ce ai înregistrat tipurile tale personalizate de postări, ceea ce trebuie să se întâmple în blocul de cod pe care îl ai acolo, așa că pentru completitudine ar trebui adăugat, deoarece în forma actuală acel cod nu va funcționa.

Milo Milo
24 sept. 2018 16:54:26
Arată celelalte 1 comentarii