it-swarm.com.de

Regeln aus .htaccess entfernen

Ich schreibe ein kleines Plugin, das auf .htaccess eine einfache non_wp_rule schreiben muss und ich mache es so:

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');

Die Regel wird wie erwartet in die .htaccess-Datei geschrieben.

Jetzt habe ich 2 Probleme.

Problem 1

Wenn ich versuche, diese Regel während der Plugin-Deaktivierung wie folgt zu entfernen:

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

} 
register_deactivation_hook( __FILE__, 'ci_remove_rules' );

Die Regel wird nicht entfernt. Wenn ich das Plugin deaktiviere und dann auf Einstellungen> Permalinks gehe, wird die Regel entfernt.

Problem 2

WordPress ist in einem Unterverzeichnis ( http://localhost/wordpress ) installiert und wenn die Regel in das .htaccess geschrieben ist, sieht es so aus:

# 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

Wie Sie anstelle eines Pfades wie/Applications/MAMP ... sehen können, ist es/wordpress/Applications/MAMP ...

Bloß mit mir, es ist das erste Mal, dass ich mich mit wp_rewrite beschäftige :)

3
tsiger

Problem 1

Ihr Hook ci_add_rules() wird weiterhin ausgeführt, wenn Sie Regeln löschen. Entfernen Sie ihn daher zuerst (und vermeiden Sie das "Deaktivieren" von non_wp_rules, da Sie andere Plugins beschädigen, die ihn verwenden).

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

Problem 2

Ziemlich sicher, dass Sie wollen:

plugin_dir_url( 'proxy.php', __FILE__ )

..anstatt:

plugin_dir_path( __FILE__ ) . 'proxy.php
1
TheDeadMedic