gpt4 book ai didi

php - 在 WordPress 插件中以编程方式添加 Mod 重写规则

转载 作者:可可西里 更新时间:2023-11-01 12:55:50 24 4
gpt4 key购买 nike

当用户更改永久链接设置时,以下示例插件将自定义 mod 重写规则添加到 .htaccess

/* Plugin Name: Sample Mod Rewrite  */

add_action('generate_rewrite_rules', array(new custom_mod_rewrite, "generate_rewrite_rules"));

class custom_mod_rewrite {
function __construct() {
$this->wp_rewrite = & $GLOBALS["wp_rewrite"];
}
function generate_rewrite_rules() {

$non_wp_rules = array(
'simple-redirect/?$plugin_name' => 'http://google.com',
'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
);

$this->wp_rewrite->non_wp_rules = $non_wp_rules + $this->wp_rewrite->non_wp_rules;
add_filter('mod_rewrite_rules', array(&$this, "mod_rewrite_rules"));
}
function mod_rewrite_rules($rules) {
return preg_replace('#^(RewriteRule \^.*/)\?\$plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
}
}

我发现了两个问题。

  1. 如果设置为默认永久链接,则不会添加规则。
  2. 更重要的是,除非用户更改永久链接设置,否则不会添加规则。(可以通过执行 $wp_rewrite->flush_rules() 来解决插件激活)

对于 #2,我想知道是否有以编程方式添加规则的好方法。

IIS (common on Windows servers) does not support mod_rewrite.

来源:http://codex.wordpress.org/Using_Permalinks#Permalinks_without_mod_rewrite

听起来并不是所有系统都使用 .htaccess。因此,直接编辑 .htaccess 文件可能不是分布式插件的最佳选择。我不知道。可能我必须检查服务器是否使用 Apache,如果是,我需要检查 .htacess 是否可写并且现有规则没有添加规则,然后最后我可以将规则附加到它。此外,当用户停用插件时,必须删除规则。所以有点麻烦。

如果 WordPress 可以使用内置 API 或其他东西来处理它,我想把它留给 WordPress。但上面的例子是我到目前为止所能找到的。所以非常感谢您提供的信息。

更新

正如 pfefferle 所建议的,我可以使用 $wp_rewrite->flush_rules()。但是,问题 #1 仍然存在;使用默认永久链接设置时,它不会产生任何影响。有什么想法吗?

/* Plugin Name: Sample Mod Rewrite  */

$custom_mod_rewrite = new custom_mod_rewrite;
register_activation_hook( __FILE__, array($custom_mod_rewrite, 'flush_rewrite_rules'));
register_deactivation_hook( __FILE__, array($custom_mod_rewrite, 'flush_rewrite_rules'));
add_action('generate_rewrite_rules', array($custom_mod_rewrite, "generate_rewrite_rules"));

class custom_mod_rewrite {
function __construct() {
$this->wp_rewrite = & $GLOBALS["wp_rewrite"];
}
function flush_rewrite_rules() {
$this->wp_rewrite->flush_rules();
}
function generate_rewrite_rules() {

$non_wp_rules = array(
'simple-redirect/?$plugin_name' => 'http://google.com',
'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
);

$this->wp_rewrite->non_wp_rules = $non_wp_rules + $this->wp_rewrite->non_wp_rules;
add_filter('mod_rewrite_rules', array(&$this, "mod_rewrite_rules"));
}
function mod_rewrite_rules($rules) {
return preg_replace('#^(RewriteRule \^.*/)\?\$plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
}
}

此外,当停用插件时,它不会变回以前的规则。我只是按照 codex 示例进行操作,并将其设置为在停用插件时刷新规则。所以应该有一些代码来删除添加的规则。

作为旁注,根据 the codex ,

Flushing the rewrite rules is an expensive operation, ... ... you should flush rewrite rules on the activation hook of a plugin, or when you know that the rewrite rules need to be changed

遗留问题:

  1. 如果设置为默认永久链接,则不会添加规则。
  2. 停用插件时,不会变回之前的规则。

最佳答案

不幸的是,目前似乎还没有有效的解决方案。

关于php - 在 WordPress 插件中以编程方式添加 Mod 重写规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12824334/

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