¿Dónde, cuándo y cómo vaciar correctamente las reglas de reescritura dentro del alcance de un complemento?

9

Tengo un problema un poco extraño con las reglas de reescritura que no se desechan correctamente.

He intentado usar flush_rewrite_rules(); y flush_rewrite_rules(true); .

También he intentado globalizar $wp_rewrite usando $wp_rewrite->flush_rules(); y $wp_rewrite->flush_rules(true);

Ninguno de los cuales parece estar limpiando las reglas de reescritura correctamente. Esas llamadas de hecho están vaciando las reglas de reescritura cuando son llamadas. ¿Cómo puedo saber esto? Uso de la solución para depuración de la regla de reescritura al vaciar la regla .

Actualmente, he reescrito las reglas eliminadas en la activación del complemento y la desactivación del complemento. No hay problemas allí.

Tengo una página de configuración de administración de complementos para que los usuarios configuren el complemento. Algunas de las configuraciones ajustan la estructura del enlace permanente, por lo que las reglas de reescritura deben borrarse en la página de configuración de administración del complemento "Guardar configuración". (Utiliza el estándar update_option(); ) para guardar la configuración.

Me gustaría tener en cuenta que, según la configuración especificada, los tipos de publicación personalizados se crean para coincidir con la configuración especificada por el usuario. Por lo tanto, las reglas de reescritura deben borrarse inmediatamente después de guardar las configuraciones. Aquí es donde las cosas no funcionan adecuadamente.

La solución de enlace anterior para la depuración de reglas de reescritura provista por @toscho muestra que se están vaciando toneladas de reescritura reglas. Sin embargo, al visitar el elemento singular de tipo de publicación personalizado, o incluso el archivo de tipo de publicación personalizado, cada uno devuelve como errores 404.

El tipo de publicación personalizada se registra correctamente y de manera adecuada. Sé con certeza que ese no es el problema.

Inmediatamente después, con la configuración de la página de administración del complemento, guardar. Se crean los tipos de publicación personalizados, se ajusta la estructura del enlace permanente y se intentan borrar todas las reglas de reescritura.

Los tipos de publicación personalizados se cargan siempre, y se cargan en init como de costumbre.

Por alguna razón, las reglas de reescritura no se están vaciando correctamente, porque, como dije antes, visitar las secciones singulares o de archivo del tipo de publicación personalizada devuelve errores 404.

Ahora, la parte rara, si todo lo que hago es simplemente visitar la página de configuración de enlaces permanentes de administración, y luego volver al inicio para ver las secciones singulares o de archivo del tipo de publicación personalizada, mágicamente funcionan como se espera.

¿Qué hace la página de configuración de los enlaces permanentes de la administración que no estoy haciendo y que permite que las reglas de reescritura se realicen correctamente y las mías no?

Quiero decir, como una solución temporal, estoy redirigiendo al usuario a la página de configuración de enlaces permanentes de administración después de guardar la página de configuración de administración del complemento, pero esta no es una solución ideal. Preferiría que las reglas de reescritura se desecharan correctamente dentro del código de mi complemento.

¿Hay algún punto en WordPress en el que al vaciar las reglas de reescritura ya no se borran TODAS las reglas?

admin_menu : la página de configuración de complementos se agrega a la administración de WordPress.

add_options_page() : la página de configuración del complemento se agrega en el menú Configuración.

La página de configuración se representa en la devolución de llamada para add_options_page() . Aquí también es donde se procesa $_POST para actualizar la configuración del complemento y vaciar las reglas de reescritura.

Dado que esta ya es una pregunta larga, estaría dispuesto a proporcionar bloques de código (si es de ayuda) en un enlace externo que ayude a generar una respuesta válida.

    
pregunta Michael Ecklund 15.11.2013 - 18:20

6 respuestas

4

El mejor lugar para vaciar las reglas de reescritura es en la activación / desactivación del complemento.

function myplugin_activate() {
    // register taxonomies/post types here
    flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'myplugin_activate' );

function myplugin_deactivate() {
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

Consulte el artículo de Codex

Disculpe de antemano, no pude resolverlo completamente a través de su pregunta, por lo que esta es una respuesta un tanto cortada de galletas.

    
respondido por el helgatheviking 15.11.2013 - 18:37
4

Es difícil decir qué está mal, sin ver tu código. Pero después de guardar algunas configuraciones, es práctico enlazar a admin_init como se muestra a continuación para vaciar las reglas de reescritura.

Código:

add_action('admin_init', 'wpse_123401_plugin_settings_flush_rewrite');
function wpse_123401_plugin_settings_flush_rewrite() {
    if ( get_option('plugin_settings_have_changed') == true ) {
        flush_rewrite_rules();
        update_option('plugin_settings_have_changed', false);
    }
}


Tiene que configurar la opción en algún lugar en la página de configuración o para ser exacto en algún lugar en el proceso de guardar la configuración. Hacerlo sin la opción es malo, porque no quieres eliminar las reglas todo el tiempo.


Nota: no probado

    
respondido por el Nicolai 15.11.2013 - 19:47
3

Tenía un archivo de clase de tipo de publicación que era responsable de leer la configuración de opciones del complemento y de crear los tipos de publicación personalizados necesarios según la configuración especificada por el usuario.

Este archivo de clase de tipos de publicación se cargó en el gancho init .

Me di cuenta de que lo único que tendría que hacer era actualizar la configuración del complemento y luego borrar las reglas de reescritura. Dado que la clase de tipos de publicación ya se cargó en base a la configuración del complemento. Pero con las páginas de administración, se cargan DESPUÉS del init hook.

Los tipos de publicación nunca se registraron realmente, porque la configuración aún no estaba establecida. La clase de registro de tipos de publicación terminó terminando prematuramente sin tipos de publicación registrados.

La solución fue:

  1. Actualizar la configuración del complemento.
  2. Cargue el archivo de clase de tipos de publicación SOLO una vez aquí para que el nuevo Se crean reglas de reescritura.
  3. Eliminar las reglas de reescritura.

(Anteriormente ... faltaba el paso 2 - Como se mencionó anteriormente ...)

De ahora en adelante, los tipos de publicaciones se cargarán en el gancho init , y ya tendrán configuraciones especificadas, lo que permitirá que los tipos de publicaciones se creen y emparejen con las reglas de reescritura apropiadas.

Por cualquier motivo, tuve que agregar una llamada de JavaScript para redirigir a la página actual, después de realizar los tres pasos anteriores.

También tuve que agregar una llamada a flush_rewrite_rules(); en la página de configuración de administración del complemento.

Por el simple hecho de asegurarnos de que todo esté limpio ...

Paso 1) Navegue a la página de configuración de administración del complemento. - Descarga inicial.

Paso 2) Actualizar la configuración del complemento. - Segundo color.

Paso 3) La página redirige a la página de configuración del complemento. Causando la ... Tercera y última descarga (igual que la descarga inicial: se realiza automáticamente cuando se visita la página de configuración del complemento)

No estoy diciendo que esto sea una solución práctica, pero funcionó para mí. Un problema muy extraño y lo más probable es que tenga que ver con mi infraestructura de codificación.

    
respondido por el Michael Ecklund 15.11.2013 - 20:38
1

@ tazo-todua esto también me funcionó cuando uso multisitio.

add_action( 'wpmu_new_blog', 'set_my_permalink_structure', 11, 2 );

function set_my_permalink_structure( $blog_id ) {

    switch_to_blog( $blog_id );

    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%postname%/' );
    $wp_rewrite->flush_rules();
    $wp_rewrite->init();

    restore_current_blog();
}
    
respondido por el stillatmylinux 11.11.2016 - 22:30
0

Mi solución encontrada fue:

global $wp_rewrite; $wp_rewrite->flush_rules(); $wp_rewrite->init();
    
respondido por el T.Todua 20.04.2015 - 09:00
0

Estaba teniendo exactamente el mismo problema. En mi complemento, tengo tipos de publicaciones que se crean dinámicamente. Por lo tanto, no se pueden registrar a través de register_post_type() en un método estático durante el activation_hook y, por lo tanto, aún no están activos cuando se ejecuta flush_rewrite_rules() durante este enlace (que normalmente es el códice forma recomendada de las reglas de reescritura de descarga).

La solución más limpia que se me ocurrió al final fue limpiar las reglas de reescritura después del registro de los tipos de publicaciones, pero por supuesto solo si esa descarga era realmente necesaria (porque la operación es lenta). En mi caso, en realidad tengo varios tipos de publicaciones personalizadas que heredan de una única clase base, por lo que fue conveniente implementar el código que hace el vaciado allí.

Se puede decidir si la descarga es necesaria mirando la salida de get_option( 'rewrite_rules' ) :

class MyPostTypeClass {

public final function register_as_custom_post_type() {
    ...   //do all the setup of your post type here     
    $args = array(
                  ... //populate the other arguments as you see fit
                  'rewrite' => array('slug' => 'slug-of-your-post-type')
                 );
    register_post_type('post-type-name-of-your-post-type', $args );

    $rewrite_rules_must_be_fluhed = true;
    foreach( get_option( 'rewrite_rules' ) as $key => $rule)
        if(strpos($key, $args['rewrite']['slug'] ) === 0)
        {
            $rewrite_rules_must_be_fluhed = false;
            break;
        }
    if($rewrite_rules_must_be_fluhed)
        flush_rewrite_rules(true);
}
}

Inconvenientes:

  • Depende hasta cierto punto de qué reglas de reescritura exactas genera WP durante register_post_type() .
  • La verificación de si es necesario vaciar durante cada carga de la página también genera cierta sobrecarga.

Ventajas:

  • Completamente encapsulado en la clase que representa el tipo de publicación.
  • Solo borra las reglas de reescritura si es realmente necesario.

Solo usa esto si no puedes registrar tu tipo de publicación en una función estática que puede llamar tanto en init como en activation_hook !

La dependencia de cómo se ven las reglas de reescritura generadas durante register_post_type() puede mitigarse reemplazando la prueba if(strpos($key, $args['rewrite']['slug'] ) === 0) con algo más elaborado, es decir, una expresión regular.

    
respondido por el cgogolin 21.07.2018 - 11:08