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


62

这让我发疯,我敢肯定这很简单,但是我所寻找的没有一个简单的结构(一切都非常复杂)。

我有一个自定义帖子类型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/

我的都不是一样的,我也不希望自己是。这是我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但它们不必特定于类别。

有谁能够帮助我?

Answers:


63

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


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

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

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

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

2
您知道了-尽管我会说它 “人类友好的”,因为档案(products/)和单数(product/)之间有明显的区别。不,我会保留“前目录”-它有助于与帖子和页面保持明显区别,另外,否则您最终可能会遇到性能问题(即冗长的重写规则)。
TheDeadMedic 2010年

6

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

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


4

我不确定wp是否立即支持该结构-但是您可以很容易地创建自己的重写规则来做到这一点。

在此处查看先前的答案作者URL重写

你可以换线

$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年

2

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


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

0

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

函数create_product_taxonomies()
{
//添加新的分类法,使其具有层次性(如类别)
    $ labels =数组(
        '名称'=> _x('类别','分类学通用名称'),
        'singular_name'=> _x('Category','分类学单数名称'),
        'search_items'=> __('Search Categories'),
        'all_items'=> __('All Categories'),
        'parent_item'=> __('父母类别'),
        'parent_item_colon'=> __('父母类别:'),
        'edit_item'=> __('Edit Category'),
        'update_item'=> __('Update Category'),
        'add_new_item'=> __('添加新类别'),
        'new_item_name'=> __('新类别名称'),
        'menu_name'=> __('Category'),
    );

    register_taxonomy('product_cat',array('product_listing'),array(
        'hierarchical'=>是,
        '标签'=> $ labels,
        'show_ui'=>是,
        'query_var'=>是,
        'rewrite'=> array('hierarchical'=> true),
    ));

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

函数reviews_category_taxonomy(){

    $ labels =数组(
        'name'=> _x('Reviews Categories','Taxonomy General Name','reviews_category'),
        'singular_name'=> _x('Reviews Category','Taxonomy单一名称','reviews_category'),
        'menu_name'=> __('评论类别','reviews_category'),
        'all_items'=> __('所有评论类别','reviews_category'),
        'parent_item'=> __('家长评论类别','reviews_category'),
        'parent_item_colon'=> __('家长评论类别:','reviews_category'),
        'new_item_name'=> __('新评论类别名称','reviews_category'),
        'add_new_item'=> __('添加新评论类别','reviews_category'),
        'edit_item'=> __('编辑评论类别','reviews_category'),
        'update_item'=> __('更新评论类别','reviews_category'),
        'view_item'=> __('查看评论类别','reviews_category'),
        'separate_items_with_commas'=> __('用逗号分隔项目','reviews_category'),
        'add_or_remove_items'=> __('添加或删除项目','reviews_category'),
        'choose_from_most_used'=> __('从最常用的选项中选择','reviews_category'),
        'popular_items'=> __('热门评论类别','reviews_category'),
        'search_items'=> __('Search Items','reviews_category'),
        'not_found'=> __('Not Found','reviews_category'),
        'no_terms'=> __('无评论类别','reviews_category'),
        'items_list'=> __('评论类别列表','reviews_category'),
        'items_list_navigation'=> __('评论类别列表导航','reviews_category'),
    );
    $ args =数组(
        '标签'=> $ labels,
        'hierarchical'=>是,
        'public'=>是,
        'show_ui'=>是,
        'show_admin_column'=>是,
        'show_in_nav_menus'=>是的,
        'show_tagcloud'=>否,
        'show_in_rest'=>是,
        'rewrite'=> array('hierarchical'=> true),
    );
    register_taxonomy('reviews_category',array('wps_reviews'),$ args);

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

所有您需要的,因此将'rewrite'=> array('hierarchical'=> true),

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.