web-dev-qa-db-ja.com

.htaccessからルールを削除する

私は簡単なnon_wp_ruleを.htaccessに書く必要がある小さなプラグインを書いています、そして私はこのようにそれをやっています:

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

ルールは期待どおり.htaccessファイルに書き込まれます。

今、私は2つの問題を抱えています。

問題1

私はこのようにプラグインの無効化中にこのルールを削除しようとすると:

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

} 
register_deactivation_hook( __FILE__, 'ci_remove_rules' );

ルールは削除されません。プラグインを無効にしてから設定>パーマリンクにアクセスすると、ルールが削除されます。

問題2

WordPressは( http://localhost/wordpress )というサブディレクトリにインストールされており、ルールが.htaccessに書かれていると次のようになります。

# 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

あなたが見ることができるように/ Applications/MAMPのようなパスの代わりに....それは/ wordpress/Applications/MAMP ....

これはwp_rewriteのものを扱うのは初めてですので私と一緒に裸の:)

3
tsiger

問題1

あなたのフックci_add_rules()はルールをフラッシュしても実行されますので、それを最初に削除してください(そしてnon_wp_rulesの "unsetting"を避けてください、それを利用する他のプラグインを壊すでしょう)。

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

問題2

ほしいと思う確実に:

plugin_dir_url( 'proxy.php', __FILE__ )

..の代わりに:

plugin_dir_path( __FILE__ ) . 'proxy.php
1
TheDeadMedic