Tengo un problema un poco extraño con las reglas de reescritura que no funcionan 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. De hecho, esas llamadas están vaciando las reglas de reescritura cuando se llaman. ¿Cómo se esto? Uso de la solución para depurar la regla de reescritura de vaciado .
Actualmente, tengo reglas de reescritura en la activación y desactivación de complementos. 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 ser vaciadas en la página de configuración de administración de complementos "Guardar configuración". (Utiliza el estándar update_option();
) para guardar la configuración.
Me gustaría señalar que, según la configuración especificada, se crean tipos de publicación personalizados para que coincidan con la configuración especificada por el usuario. Por lo tanto, las reglas de reescritura deben eliminarse inmediatamente después de guardar la configuración. Aquí es donde las cosas no funcionan adecuadamente.
La solución de enlace anterior para depurar las reglas de reescritura proporcionadas por @toscho
está mostrando que está descargando toneladas de reglas de reescritura. Sin embargo, al visitar el elemento singular de tipo de publicación personalizado, o incluso el archivo de tipo de publicación personalizado para ese asunto, cada uno devuelve como errores 404.
El tipo de publicación personalizada se registra de forma correcta y adecuada. Sé con certeza que ese no es el problema.
Inmediatamente después de guardar la configuración de la página de administración del complemento. Se crean los tipos de publicaciones personalizadas, se ajusta la estructura de enlaces permanentes y se intenta eliminar todas las reglas de reescritura.
Los tipos de publicaciones personalizadas se cargan siempre y se cargan init
como de costumbre.
Por alguna razón, las reglas de reescritura no se limpian correctamente, porque como dije antes, visitar secciones singulares o de archivo del tipo de publicación personalizada devuelve errores 404.
Ahora la parte extraña, si todo lo que hago es simplemente visitar la página de configuración de enlaces permanentes de administración, y luego volver al frente para ver secciones singulares o archivadas del tipo de publicación personalizada, funcionan mágicamente como se esperaba.
¿Qué hace esa página de configuración de enlaces permanentes de administración que no estoy haciendo que permita que las reglas de reescritura se vacíen adecuadamente y las mías no?
Quiero decir, como 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. Prefiero que las reglas de reescritura se alineen correctamente dentro del código de mi complemento.
¿Hay algún punto en WordPress en el que el vaciado de las reglas de reescritura ya no borra TODAS las reglas?
admin_menu
- La página de configuración del complemento 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 $_POST
se procesa para actualizar la configuración de los complementos y eliminar las reglas de reescritura.
Dado que esta es una pregunta larga, estaría dispuesto a proporcionar bloques de código (si ayuda) en un enlace externo para ayudar a producir una respuesta válida.
fuente
flush_rewrite_rules
, que simplemente elimina larewrite_rules
opción y la regenera, puede abrir el archivowp-admin/options-permalinks.php
y ver dónde sucede. Como esta operación solo elimina la opción completa, no es posible eliminar parcialmente las reglas.init
que se registran los tipos de publicación. Me imaginé que la configuración de la página se estaba guardando y la página se volvería a cargar ... luego dispararía elinit
gancho nuevamente para registrar los tipos de publicaciones necesarias. Así que pensé que los tipos de publicaciones ya estarían cargados, y todo lo que tenía que hacer era actualizar la opción, luego eliminar las reglas de reescritura de mi página de configuración de complementos. Publicaré una respuesta de cómo descubrí una solución.Respuestas:
El mejor lugar para eliminar las reglas de reescritura es la activación / desactivación de complementos.
Ver el artículo del codex
Disculpas de antemano, no lo hice todo el camino a través de su pregunta, por lo que esta es una respuesta un poco cortante de galletas.
fuente
Es difícil saber qué pasa, sin ver su código. Pero después de guardar algunas configuraciones, es práctico conectarlo
admin_init
como se muestra a continuación para enjuagar sus reglas de reescritura.Código:
Debe establecer la opción en algún lugar de su página de configuración o para ser exacto en algún lugar del proceso de guardar la configuración. Hacerlo sin la opción es malo, porque no desea eliminar las reglas cada vez.
Nota: no probado
fuente
*_option()
página de configuración. @helgathevikingTenía un archivo de clase de tipo de publicación que se encargaba 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
.Pensé que todo lo que tenía que hacer era actualizar la configuración del complemento y luego eliminar las reglas de reescritura. Dado que la clase de tipos de publicación ya se cargó según la configuración del complemento. Pero con las páginas de administración, se cargan DESPUÉS del
init
gancho.Los tipos de publicación nunca se registraron realmente, porque la configuración aún no se había establecido. La clase de registro de tipos de publicación terminó antes de tiempo sin ningún tipo de publicación registrada.
La solución fue:
(Anteriormente ... faltaba el paso 2 - Como se mencionó anteriormente ...)
A partir de ahora, los tipos de publicaciones se cargarán en el
init
gancho 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 alguna razón, 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
flush_rewrite_rules();
en la página de configuración de administración del complemento.Entonces, en aras de garantizar que todo esté enjuagado ...
Paso 1) Navega a la página de configuración de administración del complemento. - Descarga inicial.
Paso 2) Actualiza la configuración del complemento. - Segunda descarga.
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 digo que sea una solución práctica, pero funcionó para mí. Problema muy extraño y muy probablemente tenga que ver con mi infraestructura de codificación.
fuente
@ tazo-todua esto también funcionó para mí cuando uso multisitio.
fuente
MI SOLUCIÓN encontrada fue:
fuente
Estaba teniendo exactamente el mismo problema. En mi plugin, tengo tipos de publicaciones que se crean dinámicamente. Por lo tanto, no se pueden registrar a través
register_post_type()
de un método estático duranteactivation_hook
y, por lo tanto, aún no están activos cuandoflush_rewrite_rules()
se ejecuta durante este enlace (que normalmente es la forma recomendada de enjuagar las reglas de reescritura).La solución más limpia que se me ocurrió al final fue eliminar las reglas de reescritura después del registro de los tipos de publicación, pero, por supuesto, solo si ese enjuague era realmente necesario (porque la operación es lenta). En mi caso, en realidad tengo varios tipos de publicaciones personalizadas que heredan de una sola clase base, por lo que era deseable implementar el código que hace el vaciado allí.
Se puede decidir si es necesario enjuagar mirando la salida de
get_option( 'rewrite_rules' )
:Inconvenientes:
register_post_type()
.Ventajas:
Solo use esto si no puede registrar su tipo de publicación en una función estática que puede llamar durante ambos
init
y elactivation_hook
!La dependencia de cómo se
register_post_type()
ven las reglas de reescritura generadas durante el proceso puede mitigarse reemplazando la pruebaif(strpos($key, $args['rewrite']['slug'] ) === 0)
con algo más elaborado, es decir, una expresión regular.fuente