Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wordpress 如何在插件停用时运行flush_rewrite_规则_Wordpress - Fatal编程技术网

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_函数”。尝试在激活时添加它,或者完全忽略它,如果需要,使用永久链接设置页面刷新一次。