web-dev-qa-db-fra.com

Supprimer les règles de .htaccess

J'écris un petit plugin qui doit écrire à .htaccess un simple non_wp_rule et je le fais comme ceci:

function ci_flush_rules()
{
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
register_activation_hook(__FILE__, 'ci_flush_rules');


function ci_add_rules()
{
    global $wp_rewrite;
    $proxy = plugin_dir_path(__FILE__) . 'proxy.php';
    $non_wp_rules = array('(.*)\.(jpe?g|gif|png)$' => $proxy);
    $wp_rewrite->non_wp_rules = $non_wp_rules + $wp_rewrite->non_wp_rules;
}
add_action('generate_rewrite_rules', 'ci_add_rules');

La règle est écrite dans le fichier .htaccess comme prévu.

Maintenant, j'ai 2 problèmes.

Problème 1

Quand j'essaie de supprimer cette règle lors de la désactivation du plugin, comme ceci:

function ci_remove_rules()
{
    global $wp_rewrite;
    $wp_rewrite->non_wp_rules = array();
    $wp_rewrite->flush_rules();

} 
register_deactivation_hook( __FILE__, 'ci_remove_rules' );

La règle ne soit pas supprimée. Si je désactive le plug-in, puis que je visite Paramètres> Permaliens, la règle est supprimée.

Problème 2

WordPress est installé dans un sous-répertoire ( http://localhost/wordpress ) et lorsque la règle est écrite dans le fichier .htaccess, il se présente comme suit:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteRule ^(.*)\.(jpe?g|gif|png)$ /wordpress/Applications/MAMP/htdocs/wordpress/wp-content/plugins/myplugin/proxy.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>
# END WordPress

Comme vous pouvez le voir au lieu d’un chemin tel que/Applications/MAMP .... c’est/wordpress/Applications/MAMP ....

Nu avec moi car c'est la première fois que je traite avec des trucs wp_rewrite :)

3
tsiger

Problème 1

Votre hook ci_add_rules() fonctionnera toujours lorsque vous supprimerez les règles, supprimez-le-le d'abord (et évitez de "désactiver" non_wp_rules, vous casserez les autres plugins qui l'utilisent).

function ci_remove_rules()
{
    remove_action( 'generate_rewrite_rules', 'ci_add_rules' );
    $GLOBALS['wp_rewrite']->flush_rules();
}

Problème 2

Je suis sûr que tu veux:

plugin_dir_url( 'proxy.php', __FILE__ )

..au lieu de:

plugin_dir_path( __FILE__ ) . 'proxy.php
1
TheDeadMedic