3

我需要在我的插件中添加一个重写规则,并将它与我的代码一起分发。如果我将规则放在 WordPress 根文件夹的 .htaccess 中,一切正常,但我需要使用我的规则分发插件。

我尝试在插件文件夹中放置一个 .htaccess 并尝试使用add_rewrite_rule函数,但也不起作用。

这里的 .htaccess 代码在 WordPress 根文件夹中正常工作,但在我的插件文件夹中不起作用:

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteRule my-plugin/pages/tp(.*)\.php$ wp-content/plugins/my-plugin/pages/request.php?pid=$1

</IfModule>

我在我的插件中尝试以下代码,但也不起作用:

add_filter( 'query_vars', 'add_query_vars' );
function add_query_vars( $query_vars )
{
    $query_vars[] = 'pid';
    return $query_vars;
}
add_action( 'init', 'add_init' );
function add_init()
{
    $plugin_url = 'the-path-to-my-plugin-folder';
    add_rewrite_rule('my-plugin/pages/tp(.*)\.php'
                  , $plugin_url . 'pages/request.php?pid=$matches[1]','top');

    global $wp_rewrite;
    $wp_rewrite->flush_rewrite_rules(); // I know this should be called only one time, but I put it here just to keep simple the sample code
}

但我总是收到找不到 URL 的错误。我做错了什么?我怎样才能做我需要的?我搜索了类似的问题,但没有一个能解决我的问题。

我的插件文件夹结构是:

主文件夹:/wp-content/plugins/my-plugin ------ /pages(子文件夹)-------------/request.php(应该接收请求的脚本)

4

2 回答 2

4

注意:WordPress Rewrite API 与 Apache Rewrite 模块不同。WP Rewrite API 不会将请求重定向到另一个 URL,它用于解析当前 URL 并填充query_vars数组。

add_rewrite_rule问题出在函数调用的第二个参数中。它必须从开始index.php?,然后应该有你的论点,例如pid,例如:

"index.php?pid=$matches[1]...."

所以你的add_init功能应该是这样的:

add_action( 'init', 'wpse8170_add_init' );
function wpse8170_add_init()
{
    add_rewrite_rule('my-plugin/pages/tp(.*)\.php', 'index.php?pid=$matches[1]', 'top');
}

不要忘记通过访问Settings»Permalinks页面刷新重写规则。

进一步阅读:

于 2013-01-31T10:40:11.440 回答
1

WP/wp-admin使用 PHP 脚本 (admin.php) 处理目录中的插件,如下所示:

http://MyWP.com/wp-admin/admin.php?page=MyPlugin/module.php

因此,插件目录中的 .htaccess 文件在调用插件时不会被解析。wp-admin正如您已经发现的那样,它们必须放在目录或根目录中。

虽然在安装插件时将 .htacces 文件复制到根目录 - 并在删除时将其删除 - 是可能的,但我认为这不是最佳选择。在 WP 空间中拥有 .htaccess 文件似乎不是一个好主意。

您的第二种方法看起来好多了:在主脚本中创建重写规则。

查看您的代码,我认为问题在于模式(要匹配的传入 URL 字符串)和可能的替换 URL 路径(您的问题中的 $plugin_url)。

函数中的$rule参数add_rewrite_rule()应捕获用于调用插件模块的 URL 段(上图)。

我不能提出任何其他建议,因为您没有提供有关插件及其目录树的足够信息,除了可以从重写规则中的正则表达式中猜到的内容。但是,这是实现您所需要的方法的一般概念。

于 2013-01-31T08:08:27.400 回答