有几种方法可以做到这一点。如果您在这里查找有关“虚拟页面”的问题,您可能会找到一些适合您的选项。
一种快速实现此功能的方法-
1) 在WordPress admin的Pages下创建一个页面。这将是加载到主查询中的页面,并将用作稍后添加的重写规则的目标。页面的内容并不重要,如果不想输出,不需要输出,只是为了WordPress可以成功运行主查询。
(2)Add whatever query vars 您需要从URL中提取数据。例如album_id
, podcast_id
, 等确保它们足够独特,不会与WordPress自己的查询变量冲突。There\'s a likely not complete list of those vars on the register taxonomy codex page. 示例:
function wpd_my_query_vars( $qvars ) {
$qvars[] = \'album_id\';
$qvars[] = \'podcast_id\';
return $qvars;
}
add_filter( \'query_vars\', \'wpd_my_query_vars\' , 10, 1 );
3)为要服务的各种请求添加所需的重写规则。您的规则将针对您在步骤1中创建的页面,并设置您在步骤2中添加的查询变量。示例:
function wpd_rewrite_rules(){
add_rewrite_rule(
\'^albums/([^/]*)/?\',
\'index.php?page_id=42&album_id=$matches[1]\',
\'top\'
);
}
add_action( \'init\', \'wpd_rewrite_rules\', 10, 0 );
请注意,重写规则需要
flushed 每当添加新规则时。您也可以通过访问admin中的Settings>Permalinks页面来完成此操作。
4) 最后一步是可选的。您可以使用单个页面模板处理所有这些类型的请求。如果要将各种请求分离到它们自己的模板中,请将筛选器添加到page_template
为每个加载一个不同的。请注意,WordPress将所有这些请求都视为您的目标页面,否则无法单独检测您使用自己的规则和查询变量创建的任何其他差异。示例:
function wpd_page_template( $template = \'\' ) {
global $wp_query;
if( ! array_key_exists( \'album_id\', $wp_query->query_vars ) ) return $template;
$template = locate_template( \'album-template.php\' );
return $template;
}
add_filter( \'page_template\', \'wpd_page_template\' );
您可以对此进行扩展,以检查是否存在为加载其他模板而添加的各种查询变量。您可以直接从访问自定义查询变量
$wp_query
如上所述,或者如果你在道德上反对全球化
get_query_var
. 您还可以通过
is_page
conditional tag.
在这种方法中,可能还有一些其他方面需要清理。例如,您可能希望删除rel_canonical
从wp_head
操作,并添加您自己的函数以输出此内容的规范元标记。