帮助重写自定义插件的规则(_R)

时间:2011-03-05 作者:Kevin

我一直在读这个question and answer 我很感兴趣,因为我正试图实现一些非常相似的目标,但我失败了,我想知道是否有人可以帮助我。

我还使用了一个自定义插件,它查询自定义表以填充页面。该页面是一个普通的WP页面,附带了一个模板,可以调用插件文件的函数来获取数据。

如果我在URL中键入此内容,我会正确加载页面:

www.mywebsite。com/?pagename=产品/食品和餐饮工作服;prodid=232(&;pname=Trilby帽子

我想键入此内容(或在链接中使用),并得到相同的结果:

我的网站。com/产品/食品和餐饮工作服/232/Trilby帽子/

(顺便说一句,我一开始也在想重写\\u规则的相反情况;一旦到位,它实际上会将我的URL“更改”为更“友好”的版本:-)

我已经在插件文件中的init函数中添加了这一行(一件事是,我正在使用同一个init函数将一些js排队——我假设只需将这一行添加到同一个函数中就可以了):

 add_rewrite_rule(\'([^/]+)/([^/]+)/([^/]+)/?\',\'index.php?pagename=$matches[1]&prodid=$matches[2]&pname=$matches[3]\',\'top\' );
注意:在我的页面层次结构中,slug中始终有一个父页面和一个子页面;父母很可能永远是同一页,但孩子肯定会有所不同。但我想保持规则的灵活性,以抓住所有的可能性。我的插件的主要触发器是查询字符串中的这两个变量。

我还将prodid和pname添加到$query\\u vars中:

 add_filter( \'query_vars\', \'prod_query_vars\' );
    function prod_query_vars( $query_vars )
    {
        $query_vars[] = \'prodid\';
        $query_vars[] = \'pname\';
        return $query_vars;
    }
有人知道我错在哪里吗?还有一件事。我不理解刷新规则的部分。既然这是一个插件(不是functions.php),那么什么时候需要刷新规则?每次我更新插件文件(尝试不同的代码可能性)时,在尝试使用我的“友好”URL格式之前,我都会先进入Permalinks页面。我在上一个问题的一个示例中注意到:flush\\u rewrite\\u rules(false)被放置在register\\u activation\\u hook()函数中,但我的插件已经设置好并正在运行。我正在尝试修改它,所以我现在想我不会使用它(但这可能是插件未来“安装”的解决方案)

我也不太精通正则表达式,所以我知道它可能是我误入歧途的地方。

很抱歉提出这么冗长的问题,但我想尽可能详细地说明我的情况。

提前感谢任何能帮忙的人。

2 个回复
SO网友:Joe Hoyle

关于何时需要刷新重写规则:

这只能发生一次,请确保not 使命感flush_rules() 在init上,这将真正降低高流量站点的性能。

WordPress将所有重写存储在数据库中的一个数组中,因此您所需要做的就是在更新数据库之前挂接。一种方法是挂接到“rewrite\\u rules\\u array”并添加规则:

add_filter( \'rewrite_rules_array\', \'my_rewrites_function\' );

function my_rewrite_function( $rules ) {

    $my_rules = array(
        \'([^/]+)/([^/]+)/([^/]+)/?\' => \'index.php?pagename=$matches[1]&prodid=$matches[2]&pname=$matches[3]\'
    );
    $rules = array_merge( $my_rules, $rules );

    return $rules;
}
保持“query\\u vars”挂钩不变。您需要访问Permalinks页面,将您的规则插入WordPress的选项中,但之后您应该进行设置。

如果不起作用,您可以挂接到“parse\\u request”,查看为您正在查看的页面选择了哪个重写规则:

add_filter( \'parse_request\', \'my_request_rewrite_check\' );

function my_request_check( $wp ) {

    var_dump( $wp->matched_rule );
    return $wp;
}
此外,您的正则表达式对于上面的结构来说是一个松散的mywebsite.com/products/food-and-catering-workwear/232/Trilby Hat/, 更像是:

^products/([^/]+)/([\\d]*)/([^/]+)/?$
Is表示“以‘products’、‘/’开头,然后是任意单词,‘/’,然后是任意数字,‘/’,然后是任意单词”(“$”表示字符串现在必须结束)

我希望这有帮助!

SO网友:Kevin

好的,在看了这个和这个之后,我意识到我的问题不是重写规则。我的插件是如何处理查询字符串的!!!它正在寻找$\\u GET[\'prodid\']来填充页面。我没有意识到,通过使用“query\\u vars”钩子,我需要使用$prodid(只要我声明它是全局第一)。

不管怎么说,现在已经整理好了,我再次感谢乔的帮助以及第一个(链接)问题的参与者,因为这也为我提供了很多帮助。

结束

相关推荐

curl problem or permalinks

我刚刚配置了我的VPS,我使用的是Centos,一切都很好,但如果我将永久链接设置为自定义结构,然后接受主页,没有帖子出现,它会显示404页,我想这是因为我没有启用curl,但我不知道我的php在哪里。我的centos中的ini文件?好的,我的卷曲被启用了,我检查过了phpinfo(); 这里是URLhttp://74.117.158.182/info.php但如果我在我的wordpress中设置了永久链接,那么接受主页,所有都会给我404页,你可以在这个URL上查看http://mbas.co.in如果