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

9

Estoy escribiendo un complemento que crea una instancia de un tipo de publicación personalizada (entre otras cosas). Es un complemento multisitio y vive 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', lo haría en un gancho de activación, que no será posible para un complemento de uso obligatorio ya que esos ganchos no están disponibles.

Dado que se supone que 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 registre 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' ) );

Entonces, el registro de CPT ocurre en cada acción 'init', pero si tengo este derecho, la descarga de reglas de reescritura solo ocurre una vez. Nunca .

¿Estoy en el camino correcto?

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

(editar # 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 sitios múltiples? - Actualizaré mi ejemplo de código anterior para mostrar esto. Lamentablemente, todavía recibo un error 404 al intentar cargar un CPT. Veo que las reglas de reescritura se almacenan en la base de datos, simplemente parece que no se están utilizando. Estoy perdido.

CC
fuente
Realmente no hay una forma adecuada de hacer esto. Esto es básicamente lo mejor al momento de escribir este comentario.
Pieter Goosen el
@PieterGoosen: gracias, lo vi antes y actualicé mi pregunta para considerar la otra solución. Sigue sin funcionar. Me pregunto si rompí algo ejecutando flush_rewrite_rules () antes de ver la otra respuesta. ¿Quizás deba eliminar mi sitio de prueba y restablecerlo para probar con precisión el procedimiento correcto?
CC
Eso podría ser posible. La ejecución incorrecta de las reglas de reescritura de vaciado en un multisitio puede romper todas las reglas de reescritura en su red. Si estuviera donde tú, simplemente comenzaría de nuevo. Solo espero que sea una instalación local y no un sitio en vivo ;-)
Pieter Goosen
bien ... lo intentaré. ¡Y no, es un sitio de prueba y creo que ahora puedo borrar la base de datos y restablecer la configuración de la red mientras duermo! :-)
CC

Respuestas:

2

La flush_rewrite_rulesfunción es confiable en algunos contextos, como un tema o un complemento basado en ganchos, pero no estoy seguro de si funciona para unmu-plugin

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

  • llamar al wp-settings.phparchivo
  • llama al do_action( 'muplugins_loaded' );gancho, aquí se inicializa tu complemento
  • llame $GLOBALS['wp_rewrite'] = new WP_Rewrite();aquí el método flush_rulesse inicializa y está disponible a partir de ahora
  • do_action( 'setup_theme' );se llama y apuesto todo mi dinero a que en este gancho flush_rewrite_rulesfuncionará

¿Solución?

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

delete_option('rewrite_rules');

o

update_option('rewrite_rules', '' );

Siempre que a WordPress le falte, los rewrite_rulesreconstruirá, esto es también lo que hace el flush_rulesmétodo.

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 haga esto en cada solicitud porque es un proceso difícil reconstruirlos. Como puedo ver, desea eliminarlos solo en la primera llamada y esto es algo bueno.

PD: No soy tan fanático de la autopromoción, pero también escribí un artículo sobre esto hace mucho tiempo y creo que todavía lo defiende.

Andrei
fuente
0

Si su plugin mu tiene opciones, pondría el rubor justo después de actualizarlas:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Leon Francis Shelhamer
fuente