Come posso far modificare a WordPress un file .htaccess in un certo modo?

27 nov 2012, 13:19:10
Visualizzazioni: 425
Voti: 0

Ho imparato giusto un po' della WordPress Rewrite API — abbastanza per aggiungere un'altra regola di riscrittura per un plugin. Il plugin funziona se installato nella root, ma sto scoprendo che se WordPress è installato in una sottocartella, allora devo apportare le seguenti modifiche al file .htaccess. Vorrei sapere come automatizzare queste modifiche se possibile. Inoltre, c'è un secondo problema. Se si va nelle Impostazioni dei Permalink in WordPress, le mie modifiche personalizzate vengono sovrascritte (tranne la mia regola speciale che utilizza la WP Rewrite API). Quindi, ho bisogno di qualcosa che utilizzi la WordPress Rewrite API in modo che non vengano sovrascritte.

File .htaccess originale

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /mysubdir/
RewriteRule ^index\.php$ - [L]
# mia riga speciale con WP Rewrite API
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

Modifiche apportate per far funzionare il plugin in una sottocartella

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

#RewriteBase /mysubdir/

RewriteRule ^index\.php$ - [L]
# mia riga speciale con WP Rewrite API
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
Commenti

Le regole di riscrittura dovrebbero funzionare correttamente indipendentemente da dove è installato il sito (in una sottodirectory o meno). Come hai aggiunto la tua riscrittura? Sembra che la tua domanda dovrebbe essere "Perché la mia riscrittura personalizzata non funziona con WordPress in una sottodirectory?"

chrisguitarguy chrisguitarguy
27 nov 2012 14:03:24

@chrisguitarguy Sto gestendo contenuti protetti nel mio plugin. Intercetto /my-post (perché è stato contrassegnato nel mio plugin come protetto) e reindirizzo a /special/secured/my-post (non un percorso fisico, ma una riscrittura logica), dove il mio plugin intercetta e mostra il contenuto solo ai membri loggati.

Volomike Volomike
28 nov 2012 00:03:11
Tutte le risposte alla domanda 2
0

Se non vuoi che WordPress sovrascriva le tue modifiche nel file .htaccess, assicurati di scrivere le tue modifiche al di fuori del blocco di commenti di WordPress, cioè prima o dopo questo:

# BEGIN WordPress
...
# END WordPress

Considera questa area come il territorio di WordPress. Qualsiasi cosa all'interno di questo blocco verrà sovrascritta da WordPress quando dovrà apportare modifiche a .htaccess.

Questo è ciò che puoi fare dopo il blocco di commenti di WordPress:

# BEGIN WordPress
...
# END WordPress

<IfModule mod_rewrite.c>
# Scrivi qui le tue regole di riscrittura.
</IfModule>
27 nov 2012 14:00:40
0

Puoi utilizzare add_rewrite_rule() per aggiungere regole al file .htaccess. Se aggiungi queste regole durante l'azione init (o appena prima che le regole vengano aggiornate), ogni volta che le regole vengono aggiornate (ad esempio quando vengono salvate le impostazioni dei permalink), tali regole verranno mantenute.

Nota, tipicamente una riscrittura passata a add_query_arg ha la forma:

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

e WordPress la gestisce internamente senza aggiungerla al file .htaccess. Ma se la prima parte non è index.php? allora viene trattata come una regola di riscrittura esterna e aggiunta al file .htaccess. Vedi sorgente.

27 nov 2012 14:24:03