Wordpress 如何在插件停用时运行flush_rewrite_规则
我希望我的插件在停用时删除/刷新它正在设置的重写规则。这是我的。我不知道为什么,即使关闭了插件,重写规则仍然有效 谢谢Wordpress 如何在插件停用时运行flush_rewrite_规则,wordpress,Wordpress,我希望我的插件在停用时删除/刷新它正在设置的重写规则。这是我的。我不知道为什么,即使关闭了插件,重写规则仍然有效 谢谢 <?php if(!class_exists('MyPlugin')) { class MyPlugin { public function __construct() { add_action('init', array( &$this, 'add_rewrite_rule' ) );
<?php
if(!class_exists('MyPlugin'))
{
class MyPlugin
{
public function __construct() {
add_action('init', array( &$this, 'add_rewrite_rule' ) );
add_action('init', array( &$this, 'add_rewrite_tag' ) );
}
public static function activate() { }
public static function deactivate() {
flush_rewrite_rules();
}
public function add_rewrite_rule(){
global $wp_rewrite;
add_rewrite_rule('^content/([^/]*)/?$','index.php?page_id=10&myuniquepid=$matches[1]','top');
$wp_rewrite->flush_rules();
}
public function add_rewrite_tag(){
add_rewrite_tag('%myuniquepid%','([^&]+)');
}
} // END class MyPlugin
} // END if(!class_exists('MyPlugin'))
if(class_exists('MyPlugin'))
{
// Installation and uninstallation hooks
register_activation_hook(__FILE__, array('MyPlugin', 'activate'));
register_deactivation_hook(__FILE__, array('MyPlugin', 'deactivate'));
// instantiate the plugin class
$myplugin = new MyPlugin();
}
重要
如评论中所述,请确保仅在需要时刷新\u重写\u规则。这是一项昂贵的操作,因此只有在绝对必要时才能使用
问题
register\u activation\u hook()
register\u deactivation\u hook()
在加载了操作的初始化和插件之后运行
如果您想要处理DB创建/删除内容,而不是在我们想要添加或清理重写规则时,这非常好
大多数插件使用init
或plugins\u loaded
操作加载所有内容并生成重写规则。在此之前调用激活挂钩
停用钩子在循环的后期运行,因此您的重写规则逻辑被处理,并且在停用时也被添加,没有任何内容被清除
可能的解决方案
下面是一个非常基本的插件示例,用于处理(取消)激活操作上的刷新重写规则。未经测试,我从正在构建的插件中将其组合在一起
<?php
/*
Plugin Name: Flush Rewrite Rules testing
Plugin URI: https://fake.com
Description: flsuh rewrite rules on activation/deactivation
Version: 0.0.1
Author: Bjorn
Author URI: https://fake.com
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
register_activation_hook( __FILE__, 'frrt_activation');
register_deactivation_hook( __FILE__, 'frrt_deactivation');
add_action('init', 'frrt_flush_rewrite_rules');
function frrt_activation() {
if ( ! get_option( 'frrt_flush_rewrite_rules_flag' ) ) add_option( 'frrt_flush_rewrite_rules_flag', true );
}
function frrt_deactivation() {
flush_rewrite_rules();
}
function frrt_flush_rewrite_rules() {
if( get_option( 'frrt_flush_rewrite_rules_flag' ) ) {
add_filter('generate_rewrite_rules', 'frrt_generate_rewrite_rules');
flush_rewrite_rules();
delete_option( 'frrt_flush_rewrite_rules_flag' );
}
}
function frrt_generate_rewrite_rules($wp_rewrite) {
$wp_rewrite->rules = array_merge(
['some-base-url/([^/]+)/?$' => 'index.php?example_query_var=$matches[1]'],
$wp_rewrite->rules
);
}
在flush函数前面有一个美元符号$flush\u rewrite\u rules()代码>-这是干什么用的?@Shazzad-那会是个打字错误add\u rewrite\u rule()
方法正在用init刷新rewrite。这显然是错误的做法。纠正这一点可以解决这个问题,因为它是在插件停用调用完成后(在init上)调用的。因此,使用add_rewrite_rule()
再次保存的数据。那么,您是说add_rewrite_rule
不应在init
上调用?应该叫什么名字?或者我应该将flush_rules()
位移出add_rewrite_函数
?谢谢,我指的是第二个“将flush_rules()位移出add_rewrite_函数”。尝试在激活时添加它,或者完全忽略它,如果需要,使用永久链接设置页面刷新一次。