¿Flush Rewrite Rules en init o rest_api_init? - API REST WordPress
Si estoy usando la API REST para crear endpoints en mi plugin, ¿debo hacer flush de las reglas de reescritura en init
o en rest_api_init
?
Entiendo que esto debería hacerse en la activación/desactivación del plugin. Sin embargo, una vez que se activa cualquiera de esos eventos, ¿no hay que respetar el proceso tradicional de hooks para asegurarse de que las reglas de reescritura se actualicen DESPUÉS de que hayan sido modificadas? Es decir, después de que se hayan añadido las rutas REST.
Ejemplo:
function activate() {
// hacer algo cuando este plugin se active...
add_action( 'init', function () {
flush_rewrite_rules( true );
}, 9999 );
return true;
}
# Activación del 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 );

No se debe vaciar las reglas de reescritura de forma rutinaria, como se indica en el codex:
No lo hagas en ningún hook que se active de forma rutinaria.
Deberías hacerlo mediante los hooks de activación del plugin o los hooks de cambio de 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();
}
Cualquiera de las opciones anteriores, y debería hacerse DESPUÉS de haber registrado tus tipos de posts personalizados.
Además, deberías vaciar las reglas de reescritura después de que tu plugin se desactive. Esto asegura que no quede ninguna regla inválida.
Sin embargo, como todo problema, esto también tiene una solución alternativa. Si tus reglas de reescritura contienen una palabra clave semi-única, puedes obtener las reglas de reescritura de las opciones, buscar en ellas y vaciar las reglas solo si es necesario:
add_action( 'init', 'wpse315001_flush_rewrite_rules', 99999 );
function wpse315001_flush_rewrite_rules(){
// Obtener las reglas de reescritura
$rules = get_option('rewrite_rules');
// Verificar si tu regla semi-única existe en esta cadena
if ( ! strpos( $rules, 'tus-reglas-de-reescritura' ) ) {
// ¡Vaciar todas!
flush_rewrite_rules();
}
}
Quizás no sea la mejor solución, pero funciona.

Entiendo que debería hacerse en la activación/desactivación del plugin. Sin embargo, una vez que se activa cualquiera de esos eventos, ¿no hay que respetar aún el proceso tradicional de hooks para asegurarse de que las reglas de reescritura se vacíen DESPUÉS de que se hayan modificado? Es decir, después de que se hayan añadido las rutas REST.

Analizando la clase de reglas de reescritura, puedo ver que una vez que la llamas, las reglas se vacían inmediatamente. Además, el codex menciona estrictamente que esto debe hacerse después de registrar los tipos de post, probablemente por la misma razón. Algún genio desarrollador podría estar registrando los tipos de post en un hook diferente, en un tema, o incluso con prioridad 999999.

llama a la función que registra los tipos de contenido desde dentro de la función wpse315001_flush_rewrite_rules
, luego limpia las reglas.

@Milo Supongo que ese no es el caso, ya que eso resolvería fácilmente el problema. Imagino que el CPT está siendo añadido por otros plugins.
