定制CPT单一帖子URL的重写规则以用作分页URL

时间:2012-02-28 作者:dashaluna

我有一个叫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 建筑还是两者兼而有之?

我真的很感激任何帮助!

2 个回复
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 样板

在我发疯之前,我会非常感激任何提示。谢谢

SO网友:ommunist

就我所了解的问题而言,您希望将您的CPT分页。在函数中正确声明CPT之后。php,只需确保single-{posttypename}.php 模板具有global $page $paged 在head中声明,并包含对wp\\u link\\u pages()函数的引用。

示例:

<div class="navigation"><?php wp_link_pages(array(\'before\' => \'<strong>Pages:</strong> \', \'after\' => \'&nbsp;\', \'next_or_number\' => \'number\')); </div>

现在,该CPT支持<!--nextpage--> 您的URL将相应生成。

而且this discussion may help. 请记住,CPT和Page不能同名。

结束

相关推荐

Get paged outside of loop?

是否可以在标准WP循环之外进行寻呼?我已经在循环中使用了:<?php if ( $paged >= 2 ) { ?> Some text for the 2nd page on up <?php } ?> 但我希望能够在第二页或更大的所有页面上,在循环之外回显一些文本。可能的还是更好的方法?