我真的被WP\\U重写功能卡住了。。。
我有一个插件,它使用短代码呈现,并显示完整的网站内容。E、 g.:
//?p=2 (maps to domain.tld/myplugin/)
[my-plugin]
这个插件基本上是一些列表内容的目录。
我想要的是,基本上,我想要实现好的URL,以便对插件显示的列表内容进行分类。E、 g.:
domain.tld/myplugin/?filter=someFilter // works but is ugly
domain.tld/myplugin/someFilter // is what I want
我试过的方法
add_rewrite_rule
以及修改:
global $wp_rewrite
$customRules = [
"myplugin/([^/]+)/?" => "?p=2&filter=$matches[1]" // try 1.1
"myplugin/([^/]+)/?" => "/myplugin/filter=$matches[1]" // try 2.1
];
$wp_rewrite->rules = $customRules + $wp_rewrite->rules; // try 1
$wp_rewrite->extra_rules_top = $customRules + $wp_rewrite->extra_rules_top // try 2
然而,我的重写都没有成功。我能做到的最好的事情就是简单地重定向到
/myplugin/
没有向页面添加任何参数。我想这是由于Wordpress匹配
?p=2
到
/myplugin/
如页面的permalink结构中所定义。所以我的猜测是,参数只是从规则中剥离出来的。
所以我的问题是:
我怎样才能实现我想要的?我真的必须把重写规则硬写进。htaccess?
domain.tld/myplugin/filter/someFilter
a syntax like "param/value"
这是由
add_rewrite_endpoint()
并将过滤器添加到
query_vars
. 目前,我正在做这件事,但最终我真的想把它归结为:
domain.tld/myplugin/someFilter
因此,我们仍将非常感谢您的帮助;)
@websupporter更新第一个解决方案在此处尝试了用户提供的方法,但仍然不起作用。我停用了所有插件,但仍然无法正常工作。
据我所知,在这一点上唯一可能干扰的是.htaccess
但对我来说,这个看起来也很标准。。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
最合适的回答,由SO网友:websupporter 整理而成
这种方法应该适合您:
<?php
/**
* Plugin Name: Rewrite Shortcode
**/
add_shortcode( \'myplugin\', \'mp_shortcode\' );
function mp_shortcode(){
return \'<p>Filter: \' . get_query_var( \'filter\' ) . \'</p>\';
}
add_action( \'init\', \'mp_rewrite\' );
function mp_rewrite(){
$post_id = 2;
add_rewrite_rule( \'myplugin/([^/]+)/?$\', \'index.php?p=\' . $post_id . \'&filter=$matches[1]\', \'top\' );
add_rewrite_tag( \'%filter%\', \'([^/]+)\' );
}
?>
我很快开发了一个小插件,所以我可以自己测试它。当您与全球
$wp_rewrite
我认为使用这些函数可能更好,这些函数在Codex中有记录。基本上只是,因为我更了解他们:)所以我不能确切地说,你做错了什么,但我可以说,我做的有什么不同。
您的方法:
"myplugin/([^/]+)/?" => "?p=2&filter=$matches[1]
我已经明确告诉WordPress使用索引。php,正如文档中所述。我使用
add_rewrite_tag()
生成一个新的查询变量,可以使用
get_query_var()
在我的短代码中。
Attention: Flush the Rules!使用这些功能时,必须转到“设置”>“永久链接”,然后单击“更新”按钮。如果不这样做,新规则将不会激活。您也可以使用flush_rewrite_rules()
在插件激活期间。法典中给出了一个如何做到这一点的示例。
文档: