从我的插件中充分覆盖$ post

时间:2012-01-16 20:48:31

标签: wordpress wordpress-plugin wordpress-theming

我正在为wordpress开发我的第一个真正的大插件,到目前为止几乎所有内容都非常流畅。我唯一拥有的是难以欺骗当前帖子,以便用户的布局继续正常工作。让我解释一下。

我正在使用Wrox Profesionnal Wordpress插件开发书的永久链接结构策略。为此,我做了以下几点:

//Used to detect when the plugin gets actuvated
public function pluginActivatedAction(){

    //Send commands to install the rewrite rules
    add_rewrite_tag('%sgmpage%', '([^/]+)');
    add_permastruct('sgmpage', 'sgm/%sgmpage%');
    flush_rewrite_rules();

}

因此,我的插件会响应所有/ sgm / ** 网址。这是很好的原因我希望能够做一些重要的网址重写,以获得一些好消息。问题是,使用这种技术,wordpress不能说它在哪个页面下,这会弄乱集成商完成的布局,例如标题图像,活动菜单项,侧边栏。

我尝试连接几个钩子但没有成功,例如:

  1. wp(global $ post并覆盖它)
  2. pre_post_selection(并更改查询)
  3. template_redirect(全局$ post并覆盖它)
  4. 没有任何变化......模板使用The_Id()作为函数来检索有效使用$ post-> id的当前帖子的id(我认为,现在关闭了源码)但是有一些东西在我更改它之后覆盖$ post,或者我的技术无法正常工作。

    所以我的问题是,无论如何,您可以使用" add_rewrite_tag"来挂钩或覆盖网址匹配的当前帖子。技术......我想做那样的事情:

    global $post;
    $post_id = 440; //Or get_option() later obviously
    $post = get_post($post_id);
    

    但它没有用。

    感谢您的帮助......


    更新

    //Used to detect when the plugin gets actuvated
    public function pluginActivatedAction(){
    
        //Send commands to install the rewrite rules
        add_rewrite_rule('sgm(/(([a-z0-9]+)(/([a-z]+)/?)?)?)', 'index.php?p=440&sgmevent=$matches[3]&sgmpage=$matches[5]');
        flush_rewrite_rules();
    
    }
    

    我删除了其他所有内容,只是添加了一个重写规则来获得p = 440,所有内容仍然正常,除了P查询var似乎没有,有些东西告诉我重写不起作用。我在我的重写器和激活功能中粘贴了同样的东西,我停用/重新激活了我的插件。

1 个答案:

答案 0 :(得分:1)

如果该功能仅在激活时运行,那将是一个主要问题。 add_rewrite_tagadd_permastruct都需要在每个页面加载时运行。 flush_rewrite_rules只应在激活时运行,就像您在此处一样。

我不确定这是否能解决404问题,因为WordPress不知道如何处理'sgmpage'查询变量。你可能做的一件事是,而不是使用add_rewrite_tag,添加这样的东西:

function your_own_add_rewrite_tag_function(){
    global $wp_rewrite, $wp;
    $wp->add_query_var('sgmpage');
    $wp_rewrite->add_rewrite_tag('%sgmpage%', '([^/]+)', 'p=440&sgmpage=');
}

它告诉WordPress确切地使用add_rewrite_tag做了什么,除了它告诉WP还将所有sgmpage请求解释为具有440的帖子ID。没有额外的工作要做WordPress,没有额外的过滤,动作等,同时仍保留sgmpage查询变量。

这有帮助吗?

修改

要阻止它重定向到帖子,您需要挂钩'redirect_canonical'。我完全忘记了规范...这总是Daleks ......呃......规范重定向!

添加此代码段应该有所帮助:

add_filter( 'redirect_canonical', 'redirect_canonical_8886079', 10, 2 );

function redirect_canonical_8886079( $redirect_url, $requested_url ){
    global $wp;
    if(!empty($wp->query_vars['sgmpage']))
        return false;
    return $redirect_url;
}

redirect_canonical查找请求的对象,并确定我们是否在该对象的规范页面上。如果没有,它301将用户重定向到该数据的规范URL。搜索引擎喜欢那些东西。

就像蜜獾一样,redirect_canonical不关心并做它想做的事。与蜜獾不同,您可以通过过滤重定向值并返回false$requested_url告诉它停止,基本上说:规范不适用于此或规范错误且请求的URL事实上,在这种情况下是规范网址。