¿Flush Rewrite Rules en init o rest_api_init? - API REST WordPress

24 sept 2018, 13:57:11
Vistas: 1.25K
Votos: 2

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 );
0
Todas las respuestas a la pregunta 1
6

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.

24 sept 2018 14:58:28
Comentarios

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.

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

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.

Johansson Johansson
24 sept 2018 16:39:10

@MichaelEcklund También he actualizado mi respuesta para ti.

Johansson Johansson
24 sept 2018 16:46:43

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 Milo
24 sept 2018 16:47:49

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

Johansson Johansson
24 sept 2018 16:48:42

bien, señalas que debe hacerse DESPUÉS de haber registrado tus tipos de contenido personalizados, lo cual tiene que ocurrir dentro del bloque de código que tienes allí, así que por el bien de la completitud debería añadirse, ya que tal como está ese código no funcionará.

Milo Milo
24 sept 2018 16:54:26
Mostrar los 1 comentarios restantes