带有允许存档和分页的帖子ID的自定义帖子类型URL

时间:2013-06-26 作者:kel

我很难让我的自定义帖子类型URL正常工作。我找到的每一个解决方案都削弱了另一个需要工作的部分。我要做的是domain.com/post_type/post_id/post_name.

除了档案馆之外,我所有的东西都适用于:

register_post_type(\'post-type\',
    array(
    \'rewrite\' => array(
    \'slug\' => \'post-type/%post_id%\',
    \'with_front\' => false,
    \'pages\' => true,
    \'ep_mask\' => 1 
    )
))
那么我有:

add_filter(\'post_type_link\', \'custom_post_type_link\', 1, 3);
function custom_post_type_link($post_link, $post = 0, $leavename = false) {

    if ($post->post_type == \'post-type\')) {
        return str_replace(\'%post_id%\', $post->ID, $post_link);
    } else {
        return $post_link;
    }
}
所以我在想办法domain.com/post_type 工作。它目前抛出一个404。

我知道如果我拆下过滤器/%post_id% 从我的重写中可以看出,存档将起作用。在此基础上,我尝试添加重写规则:

add_action( \'init\', \'custom_rewrites_init\' );
function custom_rewrites_init(){
    add_rewrite_rule(
        \'post-type/([0-9]+)?$\',
        \'index.php?post_type=post-type&p=$matches[1]\',
        \'top\' );
}
这样做,如果有人输入,URL不会重定向domain.com/post_type/post_iddomain.com/post_type/post_id/post_name/2 不起作用。

有人知道最好的方法吗?

3 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

您的代码/解决方案非常好。您使用slug 以非常智能的方式使用param,因此WordPress会自动创建正确的permastruct 对于本CPT。

我想你唯一错过的就是has_archive 参数。默认值为false 你没有把它设为真。因此WordPress不会为您的CPT创建归档链接/页面。

has\\u存档(布尔或字符串)

(可选)启用post类型存档。

默认情况下,将使用$post\\U type作为归档段塞。默认值:错误注释:如果启用了重写,将生成正确的重写规则。还可以使用“重写”更改所使用的slug。

如果您这样做,WordPress将为归档页创建重写规则。会有一个小问题。它们将包含%post_id% 在他们身上。但这很容易纠正。您只需在register_post_type 电话:

global $wp_rewrite;

$new_rules = array();
foreach ( $wp_rewrite->extra_rules_top as $key => $rule ) {
    echo $key;
    if (strpos($key, \'post-type/%post_id%/\') === 0 ) {
        $new_rules[ str_replace(\'%post_id%/\', \'\', $key) ] = $rule;
        unset( $wp_rewrite->extra_rules_top[$key] );
    }
}
$wp_rewrite->extra_rules_top = $wp_rewrite->extra_rules_top + $new_rules;
它将修复WordPress创建的存档页面的规则。这是一个干净的解决方案—它不会留下任何混乱,而且它会处理归档页面(提要等)的所有规则

SO网友:birgire

您可以尝试添加以下代码段:

add_filter( \'rewrite_rules_array\', \'custom_rewrite_rules_array\' );
function custom_rewrite_rules_array( $rules ) {
        $newrules = array();
        $newrules[\'^post-type/page/?([0-9]{1,})/?$\'] = \'index.php?post_type=post-type&paged=$matches[1]\';
        $newrules[\'^post-type$\'] = \'index.php?post_type=post-type\';
       return $newrules + $rules;
}
添加对的支持domain.com/post-type/domain.com/post-type/page/2.

你只需要记住保存永久链接。

SO网友:Chris Wiegman

保存模板文件后,是否重置了永久链接设置?在使用新的永久链接之前,必须在“设置”->“永久链接”中重新保存永久链接设置。

结束

相关推荐