当前位置: 首页>>技术教程>>正文


自定义帖子类型,分类法和永久链接

webfans 技术教程 , , , 去评论

问题描述

这让我疯狂,我确信这很简单,但我搜索的东西都没有提供简单的结构(一切都非常复杂)。

我有一个自定义的帖子类型product_listing和一个product_cat的自定义分类(它是分层的,应该有类似的类别)。

我只是想让我的网址看起来像这样:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

但对于我的生活,无论我做什么,我都会遇到可怕的404问题。页面工作正常,帖子工作正常,但我的自定义帖子无法正常工作。他们出现在:

mysite.com/products/product-name1
mysite.com/products/product-name2

这实际上有效!只是我想在那里看到我的自定义分类,而且我希望能够访问我设置的taxonomy.php模板,方法是:

mysite.com/products/category1/
mysite.com/products/category2/

我的slu are都不一样,我也不想要它们。这是我的functions.php文件的帖子类型和分类:

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

我还有另一个scents的自定义分类,我想要有一些友好的网址,但我对此更加开放。我想通过访问mysite.com/products/scents来访问所有气味列表,但它们不必是特定类别的。

有谁能够帮我?

最佳解决方案

slug中的slug更改为products/%product_cat%中的slug,将分类法参数中的slug更改为products,然后刷新重写规则。 WordPress现在应该处理/products/my-product-cat/post-name/

最后,我们需要帮助WordPress生成永久链接(开箱即用,它将无法识别permastruct标签%product_cat%):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

有一点需要注意,这只会抓住按名称排序的帖子的第一个产品类别。如果您要为单个产品分配多个类别,我可以轻松更改确定在永久链接中使用哪个类别的方式。

Lemme知道你如何继续这个,我们可以解决其他问题!

次佳解决方案

谢谢@TheDeadMechanic,你的回答帮助了我,但只是部分。我想做同样的事情@RodeoRamsey要求,但是使用嵌套类别(即:mysite.com/products/category1/child-category-1/grandchild-category-1/product-name)并且您的解决方案不起作用。

我终于提出了一个扩展的解决方案来解决我的问题,所以如果其他人需要嵌套的类别/子类别,你可以在我自己的问题上看到detailed solution。希望它能帮助别人,并感谢您的初步步骤。

第三种解决方案

我不确定wp是否支持开箱即用的结构 – 但您可以非常轻松地创建自己的重写规则。

查看以前的答案Author url rewrite

你可以改变这条线

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

喜欢的东西

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

这里的product_cat部分可能是多余的 – 我不确定是否需要它。

您可以添加任何您喜欢的规则,它们将优先于内置规则。

第四种方案

是的,在为自定义帖子类型设置永久链接之前,这让我发疯了。我找到了一个处理自定义帖子类型的插件。它非常易于使用。 http://wordpress.org/extend/plugins/custom-post-permalinks/ WP应该将此作为核心功能添加!狮子座

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/3018.html,转载请务必附带本地址声明。