自定义重写到带参数的插件

时间:2015-04-07 作者:Sam

我真的被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?

50%溶液读数后this awesome article 我至少能找到一些工作。最终我能够实现

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

2 个回复
最合适的回答,由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() 在插件激活期间。法典中给出了一个如何做到这一点的示例。

文档:

SO网友:gyo

我会使用add_rewrite_rule() 函数,请注意,该代码未经测试,但应根据您的具体使用情况而定。如果您还需要设置post_id, 只需将其添加到index.php?p=X... 一串

function myplugin_filter_add_rewrite_rules()
{
  // Allow for /myplugin/filter/someFilter
  add_rewrite_rule(\'myplugin/filter/([^/]+)/?$\',
   \'index.php?filter=$matches[1]\',
   \'top\');

  // Optionally keep pagination /myplugin/filter/someFilter/page/2
  add_rewrite_rule(\'myplugin/filter/([^/]+)/page/([0-9]+)?$\',
   \'index.php?filter=$matches[1]&paged=$matches[2]\',
   \'top\');
}

add_filter(\'init\', \'myplugin_filter_add_rewrite_rules\');
如前所述,不要忘记通过访问Settings > Permalinks 或使用flush_rewrite_rules() 在插件激活中(不要在每次加载页面时都执行)。

结束

相关推荐