具有自己的类别和标记URL的CPT

时间:2016-05-10 作者:Suyash Jain

我正在开发一个wordpress网站,其中多个CPT将用于顶层隔离。每个CPT必须有其赢得的类别和标签库。此外,thew应该有自己的url,以便只显示相关的CPT归档页面。

实例

地点

http://example.net
CPT:命令,书本

预期的存档页URL

http://example.net/command  
http://example.net/command/category/category
http://example.net/command/tag/tag1


http://example.net/book 
http://example.net/book/category/category1
http://example.net/book/tag/tag1

http://example.net/command/2016/05
http://example.net/book/2016/05

1 个回复
SO网友:Suyash Jain

首先,我们需要申报CPT。

在此示例中,我使用名称“创建”command“。

此外,我还为这个CPT添加了类别和标记支持。

CPT将是公共的,可搜索的,将有存档页、提要页等。

add_action( \'init\', \'create_post_type\' );

function create_post_type() {

    $post_array =   array(
        \'name\'              => __( \'Command\' ),
        \'singular_name\'     => __( \'command\' )

      );
    $post_args = array(
        \'labels\'                => $post_array,
        \'menu_name\'             => __( \'Command\' ),
        \'taxonomies\'            => array(\'category\',\'post_tag\'),
        \'public\'                => true,
        \'has_archive\'           => true,
        \'rewrite\'               => array(\'slug\' => \'command\'),
        \'publicly_queryable\'    => true,
        \'exclude_from_scratch\'  =>false,
        \'with_front\'            => true,
        \'feeds\'                 => true,
        \'supports\'              => array( \'title\',\'editor\', \'author\', \'thumbnail\', \'excerpt\', \'comments\',\'revisions\' ),
    );
  register_post_type( \'command\',$post_args);

}
现在,我声明重写规则为CPT类别和标记提供单独的URL功能。

http://domain.net/command/category/catname
http://domain.net/command/tag/tagname
将转换为wordpress可以理解的以下URL。

http://domain.net/?page_type=command&category_name=catname
http://domain.net/?page_type=command&tag=tagname
以便wordpress能够理解它们。

add_action(\'init\', \'category_cpt_rewrites\');

function category_cpt_rewrites() {
    $custom_post_types = array(\'command\'); //some example post types
    foreach ( $custom_post_types as $post_type ) {
        $rule = \'^\' . $post_type . \'/category/(.+?)/?$\';
        $rewrite = \'index.php?post_type=\' . $post_type . \'&category_name=$matches[1]\';
        add_rewrite_rule($rule,$rewrite,\'top\');
    }
        foreach ( $custom_post_types as $post_type ) {
        $rule = \'^\' . $post_type . \'/tag/(.+?)/?$\';
        $rewrite = \'index.php?post_type=\' . $post_type . \'&tag=$matches[1]\';
        add_rewrite_rule($rule,$rewrite,\'top\');
    }


}
我们还将重写这样基于日期的归档页面。

http://example.net/command/2016/05
将转换为

http://example.net/?post_type=command&m=201605
代码如下所示。

add_action(\'init\', \'date_cpt_rewrites\');

function date_cpt_rewrites() {
    $custom_post_types = array(\'command\'); //some example post types
    foreach ( $custom_post_types as $post_type ) {
        $rule = \'^\' . $post_type . \'/(\\d+)/(\\d+)/?$\';
        $rewrite = \'index.php?post_type=\' . $post_type . \'&m=$matches[1]$matches[2]\';
        add_rewrite_rule($rule,$rewrite,\'top\');
    }


}
在这里,我们要确保我们的CPT”command“帖子也可以在其他公共存档中使用。默认情况下,帖子类型“post”仅显示在存档页面上。

add_filter( \'pre_get_posts\', \'my_get_posts\' );

function my_get_posts( $query ) {

    if ( is_category() || is_tag() || is_search() || is_home() || is_front_page() || is_author() || is_archive() && $query->is_main_query() )
                $post_type = get_query_var(\'post_type\');
                if($post_type) {
                    $post_type = $post_type;
                }else{
                    $post_type = array(\'post\',\'command\'); // replace cpt to your custom post type
                    $query->set( \'post_type\', $post_type );
                }
    return $query;
}
所以在这里,整个游戏就是将您想要的URL转换为wordpress可理解的URL。

相关推荐