问题描述

我想创建一个与类别类似的自定义分类法,作为类别的行为与默认帖子 (基于/%category%/%postname%/permalink 结构),以便自定义帖子类型中的帖子是显示为 www.example.com/custom-post-type/custom-taxonomy-name/post-name/post-name 另外,我希望类别元框仅在我们添加新的默认帖子时显示,而不是在自定义帖子类型中添加新帖子,而自定义分类框仅显示当我们在自定义帖子类型中添加新帖子时,而不是在添加新的默认帖子时。

最佳解决方案

首先,如果要仅显示分类法,只能将自定义帖子类型显示为自定义帖子类型,然后通过将自定义帖子类型名称作为参数传递到 register_taxonomy,然后将分类法注册到该自定义帖子类型。通过这样做,分类法 metabox 只出现在自定义帖子类型上。如果您不想显示类别 metabox 到自定义帖子类型,那么在注册自定义帖子类型时删除术语类别作为参数,而是包含类似这样的分类标题名称’taxonomies’ => 阵列 (‘post_tag’,’your_taxonomy_name’) 。这里是我如何实现的代码。我已经在自定义帖子类型主题下注册了一个自定义分类法,并使用 slug themes_categories


function themes_taxonomy() {
    register_taxonomy(
        'themes_categories',  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces).
        'themes',        //post type name
        array(
            'hierarchical' => true,
            'label' => 'Themes store',  //Display name
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'themes', // This controls the base slug that will display before each term
                'with_front' => false // Don't display the category base before
            )
        )
    );
}
add_action( 'init', 'themes_taxonomy');

然后改变永久链接我创建了以下功能


function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'themes')
        return $link;

    if ($cats = get_the_terms($post->ID, 'themes_categories'))
        $link = str_replace('%themes_categories%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

然后我注册了一个自定义的帖子类型与 slug 主题如下


//Registering Custom Post Type Themes
add_action( 'init', 'register_themepost', 20 );
function register_themepost() {
    $labels = array(
        'name' => _x( 'Themes', 'my_custom_post','custom' ),
        'singular_name' => _x( 'Theme', 'my_custom_post', 'custom' ),
        'add_new' => _x( 'Add New', 'my_custom_post', 'custom' ),
        'add_new_item' => _x( 'Add New ThemePost', 'my_custom_post', 'custom' ),
        'edit_item' => _x( 'Edit ThemePost', 'my_custom_post', 'custom' ),
        'new_item' => _x( 'New ThemePost', 'my_custom_post', 'custom' ),
        'view_item' => _x( 'View ThemePost', 'my_custom_post', 'custom' ),
        'search_items' => _x( 'Search ThemePosts', 'my_custom_post', 'custom' ),
        'not_found' => _x( 'No ThemePosts found', 'my_custom_post', 'custom' ),
        'not_found_in_trash' => _x( 'No ThemePosts found in Trash', 'my_custom_post', 'custom' ),
        'parent_item_colon' => _x( 'Parent ThemePost:', 'my_custom_post', 'custom' ),
        'menu_name' => _x( 'Themes Posts', 'my_custom_post', 'custom' ),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Custom Theme Posts',
        'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'post-formats', 'custom-fields' ),
        'taxonomies' => array( 'post_tag','themes_categories'),
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_position' => 5,
        'menu_icon' => get_stylesheet_directory_uri() . '/functions/panel/images/catchinternet-small.png',
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => array('slug' => 'themes/%themes_categories%','with_front' => FALSE),
        'public' => true,
        'has_archive' => 'themes',
        'capability_type' => 'post'
    );
    register_post_type( 'themes', $args );//max 20 charachter cannot contain capital letters and spaces
}  

注册自定义帖子时,您需要记住的几件事情。将 has_archive 参数更改为自定义帖子类型段号,另一个将重写段名称更改为’slug’ => 「custom_post_type_slug /%taxonomy_slug%

现在,当您在写入帖子类型页面中添加新的帖子类型时,您将看到 http://www.example.com/wordpress/themes/%themes_categories%/post-name/的固定链接。如果没有选择此帖子的自定义分类法,则固定链接将保留 http://www.example.com/wordpress/themes/%themes_categories%/post-name/,然后会显示不良请求。为了纠正这个,我们在自定义分类法中创建一个默认的术语。 (与类别中未分类相同) 将其添加到 functions.php

function default_taxonomy_term( $post_id, $post ) {
    if ( 'publish' === $post->post_status ) {
        $defaults = array(
            'themes_categories' => array( 'other'),   //

            );
        $taxonomies = get_object_taxonomies( $post->post_type );
        foreach ( (array) $taxonomies as $taxonomy ) {
            $terms = wp_get_post_terms( $post_id, $taxonomy );
            if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
                wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
            }
        }
    }
}
add_action( 'save_post', 'default_taxonomy_term', 100, 2 );

现在当自定义分类空白时,permlaink 自动成为 http://www.example.com/wordpress/themes/other/post-name/。

最后不要忘记通过点击管理部分中的永久链接设置保存更改来刷新重写,否则将被重定向到 404 错误。希望这可以帮助你。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。