Flush Rewrite Rules pe init sau rest_api_init în WordPress?
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 );

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ă.

Î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.

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.

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

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

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