¿La mejor manera de flush_rewrite_rules para el tipo de publicación personalizada, en un complemento de mu-plugins?

9

Estoy escribiendo un complemento que crea una instancia de un tipo de publicación personalizada (entre otras cosas). Es un complemento para varios sitios y se encuentra en el directorio mu-plugins .

¿Cuál es la mejor práctica para manejar flush_rewrite_rules () en esta situación? Para un complemento "normal", haría esto en un gancho de activación, lo que no será posible para un complemento de uso obligatorio ya que esos enlaces no están disponibles.

Dado que se supone que esto es un evento "único" después de registrar el tipo de publicación personalizada, tendría sentido hacer algo como esto en mi clase que registra el CPT:

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

Por lo tanto, el registro de CPT se realiza en cada acción de 'inicio', pero si tengo este derecho, la eliminación de las reglas de reescritura solo ocurre una vez. Siempre .

¿Estoy en el camino correcto?

(editar): Acabo de intentarlo; mi CPT está dando un error 404 no encontrado, por lo que las reglas de reescritura no funcionan :-(

(edición # 2): Probé la solución para acceder a la variable global como se muestra en esta pregunta: ¿Cómo vaciar de forma confiable las reglas de reescritura en multisite? : actualizaré el código de mi ejemplo anterior para mostrar esto. Desafortunadamente, todavía estoy recibiendo un error 404 al intentar cargar un CPT. Veo que las reglas de reescritura se almacenan en la base de datos, parece que no se están utilizando. Estoy perdido.

    
pregunta C C 28.11.2015 - 05:16

2 respuestas

2

La función flush_rewrite_rules es confiable en algunos contextos, como un tema o un complemento basado en enlaces, pero no estoy seguro de que funcione para un mu-plugin

Mi declaración se basa en el hecho de que WordPress se inicializa de esta manera:

  • llamar al archivo wp-settings.php
  • llame al do_action( 'muplugins_loaded' ); hook, aquí se inicializa su complemento
  • llame a $GLOBALS['wp_rewrite'] = new WP_Rewrite(); aquí, el método flush_rules está inicializado y disponible a partir de ahora
  • Se llama a do_action( 'setup_theme' ); y apuesto todo mi dinero a que en este gancho funcionará el flush_rewrite_rules

Solución?

Personalmente, encuentro confiable la eliminación de la opción rewrite_rules.

delete_option('rewrite_rules');

o

update_option('rewrite_rules', '' );

Cuando a WordPress le falte el rewrite_rules que los reconstruirá, esto también es lo que hace el método flush_rules .

Hay puntos en el flujo de ejecución de WordPress donde funciones como esta no están disponibles. incluso en el núcleo de WordPress encontré esta declaración

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

El único problema sería el rendimiento, no hagas esto en todas las solicitudes porque es un proceso difícil reconstruirlas. Como puedo ver, usted desea eliminarlos solo en la primera llamada y esto es bueno.

PD: no soy un fanático de la auto-promoción pero también he escrito un artículo acerca de esto hace mucho tiempo y creo que todavía defiende esto

    
respondido por el Andrei 03.08.2016 - 13:54
0

Si su complemento mu tiene opciones, pondría el color justo después de actualizarlos:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
    
respondido por el Leon Francis Shelhamer 04.02.2016 - 05:04

Lea otras preguntas en las etiquetas