我正在为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不能说它在哪个页面下,这会弄乱集成商完成的布局,例如标题图像,活动菜单项,侧边栏。
我尝试连接几个钩子但没有成功,例如:
没有任何变化......模板使用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似乎没有,有些东西告诉我重写不起作用。我在我的重写器和激活功能中粘贴了同样的东西,我停用/重新激活了我的插件。
答案 0 :(得分:1)
如果该功能仅在激活时运行,那将是一个主要问题。 add_rewrite_tag
和add_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事实上,在这种情况下是规范网址。