这让我发疯了,我敢肯定这很简单,但我所搜索的东西都没有一个简单的结构(一切都非常复杂)。

我有一个自定义帖子类型product_listing和一个自定义分类法product_cat(属于分层结构,应该具有类似的类别)。

我只希望我的URL看起来像这样:

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/


我都没有sl是一样的,我也不希望它们是。这是我的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来访问所有气味的列表,但它们不必特定于类别。

有人可以帮助我吗?

#1 楼

将帖子类型参数中的slug更改为products/%product_cat%,并将分类法参数中的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知道您如何继续使用此产品,我们可以解决其他问题问题!

评论


哇,我敬畏!这工作!最后!我从来没有想过会!!!非常感谢SOOOOOO! ............现在,我将如何生成一个链接(类似于the_permalink之类的东西)以单独获取分类法URL? / products / my-product-cat /

– RodeoRamsey
2010-12-14在3:21



我想我已经解决了这个问题^^^ ............但是现在我陷入了分页问题。当使用任何分页(自定义功能或内置功能)时,似乎会中断,因为/ products / my-product-cat /看起来还可以,但/ products / my-product-cat / page / 2 /返回404并删除了taxonomy.php文件支持index.php文件。我已经尝试了所有可能找到的东西,但仍然一无所获。

– RodeoRamsey
2010-12-14 6:45

您是否考虑将单个产品重写更改为product / cat-name / product-name? (请注意唯一性)问题在于未触发分类法分页的重写规则,因为它已被单一产品的较早规则所捕获!

–TheDeadMedic
2010-12-14 10:52



我愿意接受。但是,请绕开我的头,这是否意味着如果您要查看的是单个产品页面还是“类别”页面,则产品将具有不同的URL路径?因此,单一将是product / cat-name / prod-name,但是cats将是products / cat-name /?这样会否破坏“人类友好”网址的目的?我很难帮助客户了解wp仪表板,更不用说区别了...如果我误会了,请告诉我!我也可能对没有前台目录感到满意,例如product-cat / product-nam和product-cat /。那行得通吗?

– RodeoRamsey
2010-12-14 14:44

知道了-尽管我会说它是“人类友好的”,因为档案(产品/)和单项(产品/)之间有明显的区别。不,我会保留“前目录”-它有助于与帖子和页面保持明显区别,另外,否则可能会导致性能问题(即冗长的重写规则)。

–TheDeadMedic
2010-12-14 15:31

#2 楼

感谢@TheDeadMechanic,您的回答对我有所帮助,但仅部分帮助了我。我想按照@RodeoRamsey的要求做同样的事情,但是使用嵌套类别(即:mysite.com/products/category1/child-category-1/grandchild-category-1/product-name),并且您的解决方案对此无效。

我终于想出了一个扩展的解决方案可以,因此,如果其他任何人都需要嵌套的类别/子类别,则可以根据我自己的问题查看详细的解决方案。希望它能对其他人有所帮助,并感谢您的初始步骤。

#3 楼

我不确定wp是否支持开箱即用的结构-但是您可以很容易地创建自己的重写规则。

在此处查看先前的答案作者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部分可能是多余的-我不确定是否需要。

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

评论


好吧,那不是很有趣。哦,男孩,我认为自定义重写规则超出了我的范围。我尝试了上面的代码(其余代码来自另一篇文章),没有任何变化。我刷新了所有内容,然后再次尝试,但仍然没有任何更改,因此我注释掉了自定义帖子类型和分类法中设置的所有重写规则,并刷新并保持不变。

– RodeoRamsey
2010-12-14在1:09

#4 楼

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

评论


我以前见过这个,并避免使用它,因为它说的是“非分层”分类法。我曾经将其设置为分层结构,所以我认为它不会起作用,但是到目前为止,它似乎已经成功了!另外,它似乎正在完成我试图实现的/ products / cat-name / prod-name /结构(请参见对其他答案的评论)。 @TheDeadMedic,这是一个可行的选择吗?还是应该坚持在functions.php文件中进行重写?

– RodeoRamsey
2010-12-14 17:57

#5 楼

实际上,这很容易。您只需要一行。这是我的代码

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' => array('hierarchical' => true),
    ));


,并应用于GenerateWP.com为我的Reviews CPT生成的分类法。我在自己的WordPress网站https://www.wpstarters.com

function reviews_category_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Reviews Categories', 'Taxonomy General Name', 'reviews_category' ),
        'singular_name'              => _x( 'Reviews Category', 'Taxonomy Singular Name', 'reviews_category' ),
        'menu_name'                  => __( 'Reviews Category', 'reviews_category' ),
        'all_items'                  => __( 'All Review Categories', 'reviews_category' ),
        'parent_item'                => __( 'Parent Review Category', 'reviews_category' ),
        'parent_item_colon'          => __( 'Parent Review Category:', 'reviews_category' ),
        'new_item_name'              => __( 'New Review Category Name', 'reviews_category' ),
        'add_new_item'               => __( 'Add New Review Category', 'reviews_category' ),
        'edit_item'                  => __( 'Edit Review Category', 'reviews_category' ),
        'update_item'                => __( 'Update Review Category', 'reviews_category' ),
        'view_item'                  => __( 'View Review Category', 'reviews_category' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'reviews_category' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'reviews_category' ),
        'choose_from_most_used'      => __( 'Choose from the most used', 'reviews_category' ),
        'popular_items'              => __( 'Popular Review Categories', 'reviews_category' ),
        'search_items'               => __( 'Search Items', 'reviews_category' ),
        'not_found'                  => __( 'Not Found', 'reviews_category' ),
        'no_terms'                   => __( 'No Review Categories', 'reviews_category' ),
        'items_list'                 => __( 'Review Categories list', 'reviews_category' ),
        'items_list_navigation'      => __( 'Review Categories list navigation', 'reviews_category' ),
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => false,
        'show_in_rest'               => true,
        'rewrite' => array( 'hierarchical' => true ),
    );
    register_taxonomy( 'reviews_category', array( 'wps_reviews' ), $args );

}
add_action( 'init', 'reviews_category_taxonomy', 0 );


上使用了所有您需要的内容,因此将'rewrite'=> array ('hierarchical'=> true),