使用带有存档静态页面的自定义帖子类型时的固定链接

时间:2014-10-14 作者:user1443216

我创建了一个名为“公文包”的自定义帖子类型,并使用静态页面列出我的公文包帖子,因为我需要使用内容编辑器添加内容。

我的问题是,我想要这种结构:

http://www.example.com/portfolio/ (这是一个静态页面)

http://www.example.com/portfolio/photography (分类术语)

http://www.example.com/portfolio/photography/post-title (单柱式)

可能吗?

我该怎么做?

2 个回复
最合适的回答,由SO网友:Jesse Pearson 整理而成

是的,这是可能的,通过创建自定义分类法,然后在自定义帖子类型中创建重写,然后为post_type_link 编辑实际永久链接。一旦代码就绪,就必须转到“设置”>“永久链接”,然后单击“提交”刷新所有内容。

add_action( \'init\', \'register_custax_type\', 0 );
function register_custax_type() {
    // Add new hierarchical taxonomy
    $labels = array(
        \'name\'              => _x( \'Types\', \'taxonomy general name\' ),
        \'singular_name\'     => _x( \'Type\', \'taxonomy singular name\' ),
        \'search_items\'      => __( \'Search Types\' ),
        \'all_items\'         => __( \'All Types\' ),
        \'parent_item\'       => __( \'Parent Type\' ),
        \'parent_item_colon\' => __( \'Parent Type:\' ),
        \'edit_item\'         => __( \'Edit Type\' ),
        \'update_item\'       => __( \'Update Type\' ),
        \'add_new_item\'      => __( \'Add New Type\' ),
        \'new_item_name\'     => __( \'New Type Name\' ),
        \'menu_name\'         => __( \'Type\' ),
    );

    $args = array(
        \'hierarchical\'      => true,
        \'labels\'            => $labels,
        \'show_ui\'           => true,
        \'public\'            => true,
        \'show_admin_column\' => true,
        \'query_var\'         => true,
        \'rewrite\'           => array( \'slug\'  => \'portfolio\' )
    );

    register_taxonomy( \'type\', array( \'portfolio\' ), $args );
}

add_action( \'init\', \'register_cpt_portfolio\' );
function register_cpt_portfolio() {

    $labels = array( 
        \'name\'                  => _x( \'Portfolios\', \'portfolio\' ),
        \'singular_name\'         => _x( \'Portfolio\', \'portfolio\' ),
        \'add_new\'               => _x( \'Add New\', \'portfolio\' ),
        \'add_new_item\'          => _x( \'Add New Portfolio\', \'portfolio\' ),
        \'edit_item\'             => _x( \'Edit Portfolio\', \'portfolio\' ),
        \'new_item\'              => _x( \'New Portfolio\', \'portfolio\' ),
        \'view_item\'             => _x( \'View Portfolio\', \'portfolio\' ),
        \'search_items\'          => _x( \'Search Portfolios\', \'portfolio\' ),
        \'not_found\'             => _x( \'No Portfolios found\', \'portfolio\' ),
        \'not_found_in_trash\'    => _x( \'No Portfolios found in Trash\', \'portfolio\' ),
        \'parent_item_colon\'     => _x( \'Parent Portfolio:\', \'portfolio\' ),
        \'menu_name\'             => _x( \'Portfolios\', \'portfolio\' ),
    );

    $args = array( 
        \'labels\'                => $labels,
        \'hierarchical\'          => false,
        \'description\'           => \'Portfolios\',
        \'supports\'              => array( \'title\', \'revisions\', \'editor\', \'thumbnail\' ),
        \'public\'                => true,
        \'show_ui\'               => true,
        \'show_in_menu\'          => true,
        \'menu_position\'         => 25,
        \'menu_icon\'             => \'dashicons-images-alt\',
        \'show_in_nav_menus\'     => true,
        \'publicly_queryable\'    => true,
        \'exclude_from_search\'   => true,
        \'has_archive\'           => false,
        \'query_var\'             => true,
        \'can_export\'            => true,
        \'capability_type\'       => \'page\',
        \'taxonomies\'            => array( \'type\' ),
        \'rewrite\'               => array(
                                \'slug\'          => \'portfolio/%type%\',
                                \'with_front\'    => false
                                )
    );

    register_post_type( \'portfolio\', $args );
}

add_filter( \'post_type_link\', \'portfolio_permastruct\', 10, 2 );
function portfolio_permastruct( $link, $post ) {
    // Only update portfolio permalinks
    if( $post->post_type !== \'portfolio\')
        return $link;

    // get terms, if none are returned, it\'s false and just returns
    if( $cats = get_the_terms( $post->ID, \'type\' ) )
        $link = str_replace( \'%type%\', array_pop( $cats )->slug, $link );
    return $link;
}
可以找到完整的漫游here

SO网友:Heidi

这可以作为一种变通方法。尝试将您的帖子类型的名称从“Portfolio”改为“Work”或“Examples”它只需要是一个对你有意义的词。

然后将分类法的名称从“Type”更改为“Portfolio”

我认为WordPress默认显示术语与分类法的关系,因为可能存在在不同分类法中使用相同术语的示例。

例如,想象一个列出书评的网站。自定义帖子类型可以是“books”

您还可以有分类法,如“作者姓氏、流派、语言等”

如果你有一本关于吸血鬼的书,作者叫吉姆·英格利什,那么你会在作者姓氏和语言分类中使用英语这个词。在这种情况下http://www.example.com/author-last-name/English 将列出所有名为English的作者http://www.example.com/language/English 会列出所有用英语写的书。

如果你能创造出http://www.example.com/books/English 这会让人困惑。理论上,这将是所有英文书籍和所有名为English的作者的书籍,这可能需要一个特殊的查询。

我意识到这个例子有点复杂,但我认为这就是WordPress的行为方式的原因。

结束

相关推荐

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-