WP重写规则-自定义帖子类型和分类

时间:2014-05-14 作者:Drew

几天来,我一直在拼命想办法解决这个问题。我有一个自定义的帖子类型和自定义分类法,我正在尝试让我的URL正常工作。

下面是我想要的URL结构:http://url.dev/custom-post-type/taxonomy/post-name/

前两部分正在发挥作用。我可以去custom-post-type 它使用我的archive-custom-post-type.php 文件我也可以去/custom-post-type/taxonomy 它使用我的taxonomy-name.php.

然而,当我尝试去一个实际的帖子时,它会给我一个404错误页面。我正在使用Rewrite Analyzer 插件,看起来我的重写规则是正确的。下面是一些屏幕截图。

enter image description here

enter image description here

看起来不错,这就是需要发生的事情。但是,当我尝试转到单个产品页面时,出现了404错误。

这是我函数中的实际重写规则。php

function taxonomy_slug_rewrite($wp_rewrite) {
    $rules = array();
    // get all custom taxonomies
    $taxonomies = get_taxonomies(array(\'_builtin\' => false), \'objects\');
    // get all custom post types
    $post_types = get_post_types(array(\'public\' => true, \'_builtin\' => false), \'objects\');

    foreach ($post_types as $post_type) {
        foreach ($taxonomies as $taxonomy) {

            // go through all post types which this taxonomy is assigned to
            foreach ($taxonomy->object_type as $object_type) {

                // check if taxonomy is registered for this custom type
                if ($object_type == $post_type->rewrite[\'slug\']) {

                    // get category objects
                    $terms = get_categories(array(\'type\' => $object_type, \'taxonomy\' => $taxonomy->name, \'hide_empty\' => 0));

                    // make rules
                    foreach ($terms as $term) {
                        $rules[$object_type . \'/\' . $term->slug . \'/([^/]*)/?\'] = \'index.php?pagename=$matches[1]&\' . $term->taxonomy . \'=\' . $term->slug;
                    }
                }
            }
        }
    }
    // merge with global rules
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter(\'generate_rewrite_rules\', \'taxonomy_slug_rewrite\');
我做错什么了吗?

如果我将永久链接恢复为默认值,我可以转到:http://uss.local/?ultrasound-equipment=sequoia-512&equipment-manufacturer=acuson 而且效果很好。但当我切换到“Post Name”permalink时,它就不起作用了。

1 个回复
SO网友:Milo

您无需通过为每个术语添加规则即可实现此目的rewrite 注册帖子类型和分类时的参数。唯一需要的额外规则是处理分类法的分页。

首先,注册post类型。注册帖子类型和分类的顺序很重要!我省略了大多数论点,将重点放在重要的方面:

$args = array(
    \'has_archive\' => \'custom-type\',
    \'rewrite\' => array(
        \'slug\' => \'custom-type/%custom-tax%\',
        \'with_front\' => false
    )
);
register_post_type( \'custom-type\', $args );
然后注册分类:

$args = array(
    \'rewrite\' => array(
        \'slug\' => \'custom-type\',
        \'with_front\' => false
    )
);
register_taxonomy( \'custom-tax\', array( \'custom-type\' ), $args );
然后添加重写规则以处理分类分页:

function wpd_taxonomy_pagination_rewrites(){
    add_rewrite_rule(
        \'custom-type/([^/]+)/page/([0-9]+)/?$\',
        \'index.php?custom-tax=$matches[1]&paged=$matches[2]\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_taxonomy_pagination_rewrites\' );
要在permalink中获取所选术语,请过滤post_type_link:

function wpd_post_link( $post_link, $id = 0 ){
    $post = get_post($id);  
    if ( is_object( $post ) && $post->post_type == \'custom-type\' ){
        $terms = wp_get_object_terms( $post->ID, \'custom-tax\' );
        if( $terms ){
            foreach( $terms as $term ){
                if( 0 == $term->parent ){
                    return str_replace( \'%custom-tax%\' , $term->slug , $post_link );
                }
            }
        } else {
            return str_replace( \'%custom-tax%\' , \'uncategorized\', $post_link );
        }
    }
    return $post_link;
}
add_filter( \'post_type_link\', \'wpd_post_link\', 1, 3 );

结束

相关推荐

Custom permalinks structure

我希望有这样的结构:www.mysite.com/2013 (必须显示2013年的所有职位)www.mysite.com/my-category/2013 (必须显示2013年和“我的类别”类别的所有帖子)www.mysite.com/my-category/my-tag/ (必须显示所有类别为“我的类别”和标记为“我的标记”的帖子)www.mysite.com/my-category/ (必须显示“我的类别”类别的所有帖子)www.mysite.com/my-