我有一个叫CPT的Service
注册如下:
$args = array(
\'public\' => true,
\'publicly_queryable\' => true,
\'show_ui\' => true,
\'has_archive\' => false,
\'rewrite\' => array(\'slug\' => \'services\', \'with_front\' => false),
\'query_var\' => true,
\'capability_type\' => \'post\',
\'hierarchical\' => false,
\'show_in_nav_menus\' => false,
\'menu_position\' => 20,
\'supports\' => array(
\'title\'
\'editor\',
\'thumbnail\',
\'author\',
\'revisions\'
)
);
register_post_type(\'service\', $args);
我有一个名为“服务”的页面,该页面分配了一个自定义模板,该模板显示所有服务及其类型的永久链接
services/copywriting
(其中“copywriting”是服务的名称)。到目前为止还不错。
我有另一个CPT电话Case Study
. 现在Case Studies
已连接到Services
通过发布Posts 2 Posts 插件。
我正在尝试以下操作:使用Service
类型的发布URL/services/copywriting
显示全部Case Studies
与此相关Service
.
为此,我添加了如下模板重定向规则:因此single.php
模板archive.php
将显示模板。
add_action("template_redirect", \'template_redirect\');
function template_redirect(){
global $wp, $wp_query;
// if Service CPT and it\'s a single page URL then redirect to archive.php template
if($wp->query_vars["post_type"] == "service" && is_single()){
include(TEMPLATEPATH . \'/archive.php\');
exit; //thanks to @kaiser\'s comment
}
}
在
archive.php
我得到的模板:
获取所有Case Studies
与当前关联Service
(我通过查看URL确定services/copywriting
其中“copywriting”是当前服务)创建用于分页类型的链接的函数services/copywriting/page/<page_num>
但是,这些类型的链接services/copywriting/page/<page_num>
不工作,他们总是被重定向到单曲Service
URL链接services/copywriting
.
我是否可以添加一些东西来重新编写规则或过滤器,或者让页面链接以这种方式工作?因此services/copywriting/page/2
将工作并将被引导至archive.php
自定义SQL将在其中启动并显示正确的Case Studies
.
我是否必须有一个专门的模板,而不是archive.php
?
我真的很感激任何提示和帮助!
非常感谢,Dasha
EDIT
我已安装Rewrite Analyzer plugin. 以及测试services/copywriting/page/2
符合以下模式:
services/([^/]+)/page/?([0-9]{1,})/?$
替换如下:
service: copywriting
paged: 2
我不知道这意味着什么:(
EDIT 2
好的,我已经尝试在functions.php
:
add_action(\'init\', \'my_rewrite_add_rewrites\');
function my_rewrite_add_rewrites(){
//rewrite rule for Service single post, make it work as paged
add_rewrite_rule(
\'^services/(.+?)/?(page/([0-9]+))?/?$\',
\'index.php?post_type=service&service=$matches[1]&paged=$matches[3]\',
\'top\'
);
}
我已经刷新了重写规则。但是,当我转到类型为
services/copywriting/page/2
它总是只显示URL而不显示页面位
services/copywriting/
.
我不知道怎么了。是我的regexp错误还是index.php
建筑还是两者兼而有之?
我真的很感激任何帮助!
SO网友:dashaluna
好吧,我让它或多或少正常工作了,虽然还有一个small problem 左边,请继续阅读。。
以下是我得到的:
在里面fucntions.php
:
Rewrite rules
add_action(\'init\', \'my_rewrite_add_rewrites\');
function my_rewrite_add_rewrites(){
add_rewrite_rule(
\'^services/([^/]+)/?$\',
\'index.php?post_type=service&order=ASC&orderby=menu_order\',
\'top\'
);
add_rewrite_rule(
\'^services/([^/]+)/page/?([0-9]{1,})/?$\',
\'index.php?post_type=service&paged=$matches[2]&order=ASC&orderby=menu_order\',
\'top\'
);
}
Redirect rule
add_action("template_redirect", \'my_template_redirect\');
function my_template_redirect(){
global $wp_query;
// if Service CPT URL then redirect to archive.php template
if($wp->query_vars["post_type"] == "service"){
include(TEMPLATEPATH . \'/archive.php\');
exit;
}
}
所以现在,“服务/文案”和“服务/文案/页面/2”等类型的URL正在工作。
然而,有一个problem left. 例如,如果我总共有2页文案服务,那么以下两个URL工作正常:
但是,带有“不存在页面”的URL不会重定向到404
模板,但仍显示archive
显然,模板包含空内容。那么,我如何确保这些“不存在的”分页URL将被重定向到404
模板是否正确?例如services/copywriting/page/3
只有2页数据时的URL。
EDIT
我还注意到,当一个不存在的服务被引用为“services/bla-bla”时
archive
也会显示模板,而不是
404
样板
在我发疯之前,我会非常感激任何提示。谢谢