添加_重写_端点不起作用

时间:2014-11-04 作者:Fernando Vera

这个函数我遇到了很多麻烦,我不知道该怎么办,因为我什么都试过了。

我有一个自定义的帖子类型,我们称之为学习。它的url结构为

http://example.com/study/studyname
它们有不同的部分,我想有这样的新结构:

http://example.com.com/study/studyname/view/view_arg
到目前为止我已经试过了add_rewrite_endpoint()add_rewrite_rule() 函数,以及任何结果。

我还尝试禁用所有插件,以防其中一个插件可能是原因,但仍然失败。这是我的代码,我分别尝试了两个选项:

add_filter(\'init\', \'add_rewrite_rules\');
function add_rewrite_rules() {
    global $wp_rewrite;
    add_rewrite_endpoint(\'view\', EP_PERMALINK | EP_PAGES, \'view\' );
    $wp_rewrite->flush_rules();
}
在这里,我还用EP_ALL, 没有view, 没有刷新规则。。。

我还尝试手动创建重写规则:

add_rewrite_rule(
    \'study/([^/]+)/view/([^/]+)?$\',
    \'index.php?study=$matches[1]&view=$matches[2]\',
    \'top\'
);
我读到还应该使用query\\u var进行配置,所以我做了:

add_filter( \'query_vars\', \'conf_query_vars\' );
function conf_query_vars($query_vars){
    $query_vars[] = \'view\';
    return $query_vars;
}
如果我用参数本身尝试url(类似于http://example.com/study/studyname/?view=view_args) 它就像一种魅力,但我不想展示这种结构。

3 个回复
SO网友:Rarst

原则上,您的代码应该(并通过快速检查)工作。你应该not 每次加载页面时,只刷新一次permalink。

使用重写帮助程序,如Monkeyman Rewrite Analyzer 查看是否正在生成规则,规则是什么,以及它们如何与站点中的真实URL匹配。

SO网友:Raphaël Balet

这是一篇老帖子,但这可能会对某人有所帮助,也会回答那个老问题
我创建了一个插件,该插件创建了两个新端点。endpoint_aendpoint_b.

这个endpoint_b 只是一份endpoint_a 并导入到同一个插件中
他们也都有自己的add_action(\'init\') 作用

我所做的一切endpointB 工作内容如下:

使用单个add_action(\'init\') 用于两个端点的函数

 add_action(\'init\', function () {
  add_rewrite_endpoint(\'endpoint_a\', EP_PAGES);
  add_rewrite_endpoint(\'endpoint_b\', EP_PAGES);
});
<停用插件,然后重新激活它(如果没有此步骤,插件将无法工作)因此,您可能会遇到同样的问题
我希望这有帮助

SO网友:Sean Kendle

我也在挣扎,几乎放弃了。加入我的探索之旅吧!(或直接跳到The Solution)

<小时/>

The Problem:

通常,创建新端点时,只需转到“设置”下的“永久链接”页面,即可修复该端点不起作用的问题>;永久链接,只需保存永久链接设置。这在WP代码的某个地方必须调用flush_rewrite_rules(). 这让我觉得很恶心,因为如果你的插件将被不止一个人(你)使用,或者通常被非PHP开发人员使用,他们将不知道在激活你的插件后保存永久链接规则。你的插件应该在激活后就可以运行了,不需要任何奇怪的神秘的第二步。

WordPress似乎需要你add_rewrite_rule() 在…上init 但是,每次加载页面时,您还需要flush_rewrite_rules() 最初添加重写规则后。。。但是,正如@Rarst所说,你不应该flush_rewrite_rules() 在每一页上init.

<小时/>

The Solution:

所以,我想出了这项技术,并对其进行了测试。这种技术不需要使用set\\u transient,尽管您可以像其他人一样轻松地使用它。

First, 您希望插件具有激活器。无论是类还是函数,都应该有一个在激活插件时调用的函数:

(相应地替换泛型变量、类和函数名)

register_activation_hook( __FILE__, \'activate\' );

function activate() {
    //this function will be called at activation, and then on every init as well:
    Plugin_Class_Public::add_endpoint();

    //run this at activation ONLY, AFTER setting the endpoint - needed for your endpoint to actually create a query_vars entry:
    flush_rewrite_rules();
}
以下是添加端点的函数:

public static function add_endpoint() {
    //be sure to replace your_endpoint_slug with your own endpoint
    add_rewrite_endpoint(\'your_endpoint_slug\', EP_PERMALINK | EP_PAGES); 
}
然后,通过调用上述函数在init上注册端点:

add_action(\'init\', array(\'Plugin_Class_Public\', \'add_endpoint\'));
并确保为template\\u设置挂钩,包括:

add_action(\'template_include\', array(\'Plugin_Class_Public\', \'endpoint_output\'));
它将调用如下所示的函数:

public static function endpoint_output($template) {
    if(!is_home()){  //we probably don\'t want this to run on our homepage
        global $wp;
        global $wp_query;
        
        $output = "";
        
        /*note: your_endpoint_slug needs to be replaced here as you did above. 
          Its value will be set to whatever comes after it in the url,
          eg: www.website.com/your_endpoint_slug/some_more/url -
          $wp_query->query_vars[\'your_endpoint_slug\'] = "some_more/url"
         */
        if (isset($wp_query->query_vars[\'your_endpoint_slug\'])) {
            $output = Plugin_Class_Public::generate_output(wp_query->query_vars[\'your_endpoint_slug\']);
            echo $output;
            exit;               
        }
        //print output
    }
    //nothing matched our endpoint, or it\'s the homepage:
    return $template;
}
此函数用于生成输出:

public static function generate_output($url_after_endpoint_in_url) {        
    $output = "";
    //do something to generate your desired output and return it
    return $output;
}
您还可以通过调用flush\\u rewrite\\u rules()来注销停用时的端点,使其更加整洁,尽管这似乎无法正常工作,因为上面的init()函数在您停用时也会运行,因此它仍在保存该端点。欢迎就如何解决此问题提出建议。尽管如此,一旦该插件被停用,它将不再运行template\\u include中的函数,因此不会造成真正的伤害,IMO。您始终可以保存永久链接,以便稍后删除此无关的query\\u var。

register_deactivation_hook( __FILE__, \'deactivate\' );

function deactivate() {
    flush_rewrite_rules();
}
(关于register\\u activation/deactivation\\u hook functions的注意:每个函数中的第一个参数都是指主插件文件,即您在其中放置插件标题注释的文件。通常这两个函数将从主插件文件中触发;但是,如果函数放置在任何其他文件中,则必须更新第一个参数以正确指向到主插件文件。)

结束

相关推荐