Cómo hacer que WordPress modifique un archivo .htaccess de cierta manera

27 nov 2012, 13:19:10
Vistas: 425
Votos: 0

He aprendido un poco sobre la API de reescritura de WordPress, lo suficiente como para agregar otra regla de reescritura para un plugin. El plugin funciona si se instala en la raíz, pero estoy encontrando que si WordPress está instalado en un subdirectorio, necesito hacer los siguientes cambios en el archivo .htaccess. Me gustaría saber cómo automatizar estos cambios si es posible. Además, hay un segundo problema. Si alguien va a la configuración de Permalinks en WordPress, mis cambios personalizados se sobrescriben (excepto por mi regla especial que usa la API de reescritura de WP). Entonces, necesito algo que use la API de reescritura de WordPress para que no se sobrescriban.

Archivo .htaccess original

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /mysubdir/
RewriteRule ^index\.php$ - [L]
# mi línea especial de la API de reescritura de WP
RewriteRule ^special(.*)$ /mysubdir/wp-content/plugins/special/app/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /mysubdir/index.php [L]
</IfModule>
# END WordPress

Cambios que hice para que el plugin funcione en un subdirectorio

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

#RewriteBase /mysubdir/

RewriteRule ^index\.php$ - [L]
# mi línea especial de la API de reescritura de WP
RewriteRule ^special(.*)$ /mysubdir/wp-content/plugins/special/app/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#RewriteRule . /mysubdir/index.php [L]

RewriteRule . index.php [L]
</IfModule>
# END WordPress
2
Comentarios

Las reglas de reescritura deberían funcionar bien independientemente de dónde esté instalado el sitio (en un subdirectorio o no). ¿Cómo añadiste tu reescritura? Parece que tu pregunta debería ser "¿Por qué no funciona mi reescritura personalizada con WordPress en un subdirectorio?"

chrisguitarguy chrisguitarguy
27 nov 2012 14:03:24

@chrisguitarguy Estoy implementando contenido seguro en mi plugin. Estoy interceptando /mi-publicación (porque ha sido marcada en mi plugin como segura) y redirigiendo a /especial/seguro/mi-publicación (no es una ruta física, sino una reescritura lógica), donde mi plugin intercepta y muestra el contenido solo a miembros registrados.

Volomike Volomike
28 nov 2012 00:03:11
Todas las respuestas a la pregunta 2
0

Si no quieres que WordPress sobrescriba tus cambios en el archivo .htaccess, asegúrate de escribir tus cambios fuera del bloque de comentarios de WordPress, es decir, ya sea antes o después de esto:

# BEGIN WordPress
...
# END WordPress

Piensa en esta área como el territorio de WordPress. Cualquier cosa dentro de este bloque será sobrescrita por WordPress cuando tenga que hacer cambios en el .htaccess.

Esto es lo que puedes hacer después del bloque de comentarios de WordPress:

# BEGIN WordPress
...
# END WordPress

<IfModule mod_rewrite.c>
# Escribe tus reglas de reescritura aquí.
</IfModule>
27 nov 2012 14:00:40
0

Puedes usar add_rewrite_rule() para agregar reglas al archivo .htaccess. Si agregas estas reglas en init (o justo antes de que se actualicen las reglas), entonces cada vez que se actualicen las reglas (es decir, cuando se guardan los ajustes de enlaces permanentes), esas reglas se conservarán.

Nota: normalmente una reescritura pasada a add_query_arg tiene la forma:

'index.php?p=12&food=$matches[1]&variety=$matches[2]'

y WordPress la maneja internamente y no la agrega al archivo .htaccess. Pero si la primera parte no es index.php?, entonces se trata como una regla de reescritura externa y se agrega a .htaccess. Ver fuente.

27 nov 2012 14:24:03