gpt4 book ai didi

wordpress - 如何在插件停用时运行 flush_rewrite_rules

转载 作者:行者123 更新时间:2023-12-04 18:08:01 25 4
gpt4 key购买 nike

我希望我的插件在停用时删除/刷新它正在设置的重写规则。这是我所拥有的。我不确定为什么即使停用了插件,重写规则仍然有效。

谢谢

<?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();
}

最佳答案

重要

如评论中所述,确保仅在需要时使用 flush_rewrite_rules。这是一项昂贵的操作,因此只有在绝对必要时才应使用。

问题

register_activation_hook() initplugins_loaded 操作之前运行。

register_deactivation_hook() initplugins_loaded 操作后运行。

如果您想处理数据库创建/删除内容,而不是当我们想要添加或清理重写规则时,这非常好。

大多数插件使用initplugins_loaded 操作来加载所有内容并生成重写规则。在此之前调用激活 Hook 。

停用 Hook 在周期的后期运行,因此您的 rewrite_rules 逻辑已处理并在停用时添加,没有任何内容被清除。

可能的解决方案

下面是一个非常基本的插件示例,它处理(取消)激活操作上的 flush_rewrite_rules。未经测试,我通过我正在构建的插件将其组合在一起。

<?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
);
}

在激活时设置一个标志(选项),这样我们就可以在 init 操作上生成和刷新重写规则。停用按预期进行,因为我们只在激活时生成重写规则。

我认为这根本不是理想的,因为我们在每个 init 操作上执行数据库查询 (get_option()),其中 99,9999%时间不需要...但这是唯一对我有用的解决方法。

WP 不认为这是一个错误,请参阅 Trac ticket .

如果有人有更好的解决方案,请分享 ;-)。

关于wordpress - 如何在插件停用时运行 flush_rewrite_rules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21787785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com