你想要的是rewrite endpoint.
您已经熟悉这些。WordPress的URL以结尾feed
是一个简单的重写端点,您可以添加自己的端点!
add_rewrite_endpoint
接受两个参数:所需的端点和所需位置的“掩码”。“mask”只是一个数字,您可以使用它进行一些位运算,以指定端点的位置。从WP 3.4开始,您可以指定自定义ep_mask
注册帖子类型时。
基本要点:勾入init
, 呼叫add_rewrite_endpoint
, 指定帖子类型的自定义EP掩码。下面是一个非常快速的示例(作为插件here):
<?php
class WPSE45713
{
const EP = 262144;
private static $ins = null;
public static function instance()
{
is_null(self::$ins) && self::$ins = new self;
return self::$ins;
}
public static function init()
{
add_action(\'plugins_loaded\', array(self::instance(), \'_setup\'));
register_activation_hook(__FILE__, array(__CLASS__, \'activate\'));
register_deactivation_hook(__FILE__, array(__CLASS__, \'deactivate\'));
}
public static function activate()
{
self::instance()->register();
self::instance()->endpoints();
flush_rewrite_rules();
}
public static function deactivate()
{
flush_rewrite_rules();
}
public function _setup()
{
add_action(\'init\', array($this, \'register\'));
add_action(\'init\', array($this, \'endpoints\'), 15);
add_filter(\'request\', array($this, \'filter_request\'));
}
public function register()
{
register_post_type(\'product\', array(
\'label\' => __(\'Products\', \'wpse\'),
\'public\' => true,
\'rewrite\' => array(
\'ep_mask\' => self::EP,
),
));
}
public function endpoints()
{
add_rewrite_endpoint(\'detailed\', self::EP);
}
public function filter_request($vars)
{
if(isset($vars[\'detailed\']))
$vars[\'detailed\'] = true;
return $vars;
}
}
唯一的缺点是端点被用作
/<endpoint_name>/<some_value>
. 所以没有
<some_value>
从技术上讲,呈现端点将不起作用--因此过滤器连接到
request
. 检查端点是否已设置,如果已设置,请将其设置为true。
这也意味着/detailed/asdf
也能很好地工作/detailed/
. 这不是一个大问题,但需要注意。
在前端,您可以使用get_query_var
:
<?php
if(get_query_var(\'detailed\'))
{
// we\'re on /product/some-product/detailed/
// do stuff!
}
add_rewrite_endpoint
添加与为端点指定的名称相同的查询变量。
detailed
在这种情况下。