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



我正在为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/**URL。这很好,因为我想能够做一些古怪的url重写,以获得一些好的进展。问题是,使用这种技术,wordpress无法说出它在哪个页面下,这会打乱集成器所做的布局,如标题图像、活动菜单项、侧边栏。

我试着挂上几个钩子,但没有成功,比如:

  1. wp(global$post并覆盖它)
  2. pre_postrongelection(并更改查询)
  3. template_redirect(全局$post并覆盖它)

什么都没有改变。。。该模板使用The_Id()作为一个函数来检索当前帖子的Id,该函数有效地使用了$post->Id(我认为,现在关闭了源代码),但在我更改$post后,要么有什么东西覆盖了它,要么我的技术不正确。

所以我的问题是,你能使用"add_rewrite_tag"技术在当前帖子中挂起或覆盖url匹配的内容吗。。。我想做这样的事情:

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似乎不在那里之外,一切都很好,告诉我重写不起作用。我在重写器和激活函数中都粘贴了同样的东西,并停用/重新激活了我的插件。

如果该函数仅在激活时运行,那将是一个主要问题。CCD_ 1和CCD_。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请求解释为post-id为440。WordPress没有额外的工作要做,没有额外的过滤、操作等,同时仍然保留sgmpage查询变量。

这有帮助吗?

编辑

为了阻止它重定向到帖子,你需要挂入'redirect_canonical'。我完全忘记了规范。。。总是戴立克一家。。。呃。。。规范重定向!

添加这个片段应该会有所帮助:

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。搜索引擎喜欢这些东西。

就像蜜獾一样,add_rewrite_tag0不在乎,为所欲为。与蜜獾不同,你可以通过过滤重定向值并返回false$requested_url来告诉它停止,本质上说:要么canonical不适用于这里,要么canonica是错误的,在这种情况下,请求的URL实际上就是canonical URL。

最新更新