我不知道你对“简单”的定义是什么,所以不确定这是否符合条件。动态地做到这一点并不是一项简单的任务。
首先,我们注册一个新的查询变量以传递备用标识符:
function wpd_portfolios_query_var($query_vars){
$query_vars[] = \'portfolio_key\';
return $query_vars;
}
add_filter(\'query_vars\', \'wpd_portfolios_query_var\');
接下来,我们添加一个重写规则来处理传入的请求,并相应地设置查询变量:
function wpd_portfolios_rewrite(){
add_rewrite_rule(
\'portfolios/([^/]+)/?$\',
\'index.php?post_type=portfolio&portfolio_key=$matches[1]\',
\'top\'
);
}
add_action( \'init\', \'wpd_portfolios_rewrite\' );
然后我们上钩
parse_query
, 检查是否设置了查询变量,并将这些请求转换为单数post请求。否则WordPress将默认将这些请求设置为
is_home
.
function wpd_portfolios_parse( $query ){
if( isset( $query->query_vars[\'portfolio_key\'] ) ){
$query->is_home = 0;
$query->is_single = 1;
$query->is_singular = 1;
}
}
add_action( \'parse_query\', \'wpd_portfolios_parse\' );
接下来我们上钩
pre_get_posts
使用所需的元值为公文包帖子设置元查询。
function wpd_portfolios_query( $query ){
if( isset( $query->query_vars[\'portfolio_key\'] ) ){
$query->set( \'posts_per_page\', 1 );
$meta_query = array(
array(
\'key\' => \'portfolio_key\',
\'value\' => $query->query_vars[\'portfolio_key\']
)
);
$query->set( \'meta_query\', $meta_query );
}
}
add_action( \'pre_get_posts\', \'wpd_portfolios_query\' );
最后,我们过滤
single_template
要加载这些请求的特殊模板,请执行以下操作:
function wpd_portfolios_template( $template = \'\' ){
global $wp_query;
if( isset( $wp_query->query_vars[\'portfolio_key\'] ) ){
$template = locate_template( \'portfolio-special.php\', false );
}
return $template;
}
add_filter( \'single_template\', \'wpd_portfolios_template\' );