自定义帖子类型和默认帖子的自定义插件

时间:2014-06-24 作者:Andrea Moro

现在,我已经花了几个小时试图完成这项工作,却没有找到合适的解决方案。

WHAT I WANT TO ACHIEVE

我希望WP使用以下URL结构:

1) Posts -> /%category%/articles/%postname%/
2) CPT   -> /%category%/CPT/%postname%/
其中%category%位是帖子中使用的默认类别分类法

WHAT I DID SO FAR

要将默认类别分类添加到CPT,在注册CPT时添加了此位

\'taxonomies\'         => array(\'category\'),
鉴于以下是重写参数

$rewrite_args = array( \'slug\' => \'%category%/test\', \'with_front\' => false, \'feeds\' => false, \'pages\' => false );

CHANGING THE DEFAULT POST

我知道最明显的解决方案是改变设置面板中的permalink结构。无论如何都需要这样做,否则我将描述的任何东西都会起作用。

因此,我的Permalink结构设置为

/%category%/articles/%postname%/

WHAT\'S HAPPENING

如果我离开基本配置,没有挂钩,什么都没有。立柱按预期工作。

当我挂接post\\u type\\u链接以使我的CPT替换%类别%时,默认配置停止工作。

我试图重新注册帖子类型;这似乎提供了更好的结果(虽然在管理栏中两次查看“posts”项目会带来不便),但由于某种原因,当我这样做时,CPT自定义slug停止工作。

你有什么特别的提示吗?ThanksAndrea公司

3 个回复
最合适的回答,由SO网友:Milo 整理而成

您必须添加自己的重写规则才能使其正常工作,这是无法避免的。

首先,不要使用%category% 重写标记,注册您自己的标记,并将其用于CPT类别:

function wpd_query_vars( $qvars ) {
    $qvars[] = \'cptcat\';
    return $qvars;
}
add_filter( \'query_vars\', \'wpd_query_vars\' );
然后,可以将该标记替换为中的类别post_type_link. 请注意,这只处理一个级别的术语。如果要进行父/子术语永久链接,则必须修改此函数并添加重写规则以捕获术语层次结构的每一层。

function wpd_test_post_link( $post_link, $id = 0 ){
    $post = get_post($id);  
    if ( is_object( $post ) && $post->post_type == \'your_cpt\' ){
        $terms = wp_get_object_terms( $post->ID, \'category\' );
        if( $terms ){
            foreach( $terms as $term ){
                if( 0 == $term->parent ){
                    return str_replace ( \'%cptcat%\' , $term->slug , $post_link );
                }
            }
        } else {
            return str_replace ( \'%cptcat%\' , \'uncategorized\', $post_link );
        }
    }
    return $post_link;
}
add_filter( \'post_type_link\', \'wpd_test_post_link\', 1, 2 );
现在这仍然行不通,因为WordPress认为您的永久链接是一个父/子类别请求。添加重写规则以覆盖:

function wpd_test_rewrites(){
    add_rewrite_rule(
        \'([^/]+)/CPT/([^/]+)/?$\',
        \'index.php?your_cpt=$matches[2]\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_test_rewrites\' );

SO网友:Caleuanhopkins

/%category%/ 不是Wordpress在为客户帖子类型设置slug时可以处理或替换的变量。

如果希望在自定义帖子类型中运行类别系统,就像普通帖子类型中可用的那样,请确保已启用这些系统:

capability_type\' => \'post\',\'has_archive\' => true,\'hierarchical\' => true,

希望这会有所帮助。

SO网友:Chronotope

我认为您正在寻求使用add_permastruct 作用我对它做的不多,但据我所知,这就是您想要做的:

(改编自TutsPlus tutorial)

// Please note that this will only work on WordPress 3.4+ http://core.trac.wordpress.org/ticket/19871
add_rewrite_tag(\'%yourcpt_cpt%\',\'(yourcptname)s\',\'post_type=\');
add_permastruct(\'cpt_category_archive\', \'%category%/%yourcpt_cpt%/%postname%\');
你的CPT声明看起来不错,但是\'slug\' => \'%category%/test\' 应该是\'slug\' => \'test\'

这是未经测试的,因此您应该在非生产服务器上尝试。您可能应该在激活代码后刷新重写规则(可能使用flush_rewrite_rules()).

这是一些关于WP Rewrite的高级研究,更多信息请参阅codex条目中的WP Rewrite和add\\u permastruct以及code.

结束

相关推荐

How to change taxonomy slug?

我有一些注册的分类法,如下所示:/********************************* Género *****************************/ function genre_init() { $labels_genre = array( \'name\' => _x( \'Géneros\', \'taxonomy general name\' ), \'singular_name\' => _