自定义帖子类型和独立类别-复杂分类

时间:2013-09-17 作者:Ignat B.

输入数据:

有一个自定义的帖子类型CompaniesCompany 类别Products 绑定到的帖子Items -> Item-type 类别Articles 绑定到的帖子Articles 类别

+ Companies (cat)
   |- Company-1 (post)
   `- Company-2
+ Items (cat)
   `- Item-type-1 (cat)
   |   |- Product-1-1 (post)
   |   `- Product-1-2
   `- Item-type-2 (cat)
       |- Product-2-1 (post)
       `- Product-2-2
+ Articles (cat)
   |- Article-1 (post)
   `- Article-2
问题是:

我很感激能有一种方法来实现这样的结构:

http://example.com/company-1/items/item-type-1/product-1 
http://examplecom/company-2/items/item-type-1/product-1 //(note that both company 1 and 2 can produce a similar product)
http://example.com/company-1/articles/article-1-1
http://example.com/company-2/articles/article-2-1
产品和文章帖子都有一个自定义字段,用于存储他们所关联公司的帖子ID。

更新时间:

我在考虑用自定义分类法开发它:

http://example.com/post-type-company/taxonomy-item/term-item-type/product
你能建议更合适的方式吗?

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

在wordpress中,每个帖子类型的slug(帖子名称)是唯一的。

因此,url如下/company-1/items/item-type-1/product-1 还有一个/company-2/items/item-type-1/product-1 哪里product-1 是两种不同产品的帖子名称,不能指定其地址。

如果您创建了两个标题相同的产品,Wordpress在保存时将设置unique 鼻涕虫

文章也是如此。

因此,在url中,例如:

http://example.com/company-1/items/item-type-1/product-1
可以简单地在中重写

http://example.com/index.php?post_type=products&name=product-1 
和url,如:

http://example.com/company-1/articles/article-1-1
可以简单地在中重写

http://example.com/index.php?post_type=articles&name=article-1-1
所以,正如你所看到的,无论是类别。

您只需要2条重写规则:

add_action(\'init\',\'my_rewrite_rules\');

function my_rewrite_rules() {
    add_rewrite_rule( \'[^/]+/items/[^/]+/(.+)/?$\' , \'index.php?post_type=products&name=$matches[1]\' , \'top\' );
    add_rewrite_rule( \'[^/]+/articles/(.+)/?$\' , \'index.php?post_type=articles&name=$matches[1]\' , \'top\' );
}
之后,您必须刷新后端中的重写规则,并保存更改。

现在,如果您在浏览器上手动编写url,url的工作方式与您预期的一样,但问题是使用the_permalink 作用您必须使用“post\\u link”过滤器并生成正确的url:

add_filter(\'post_link\', \'my_custom_permalink\', 99, 3);

function my_custom_permalink($permalink, $post, $leavename) {
  if ( $post->post_type == \'products\' )
     return products_permalink($permalink, $post, $leavename);
  if ( $post->post_type == \'articles\' )
     return articles_permalink($permalink, $post, $leavename);
  return $permalink;
}

function products_permalink($permalink, $post, $leavename) {
  if ( $post->post_type != \'products\' ) return $permalink;
  $cats = get_the_category( $post->ID );
  $companies = get_term_by(\'slug\', \'companies\', \'category\');
  $items= get_term_by(\'slug\', \'items\', \'category\');
  if ( empty($cats) || empty($companies) || empty($items) ) return $permalink;
  $item = \'\';
  $company = \'\';
  while ( ! empty($cats) ) {
    if ( $item && $company )
      return home_url() . \'/\' . $company . \'/items/\' . $item . \'/\' . $post->name;
    $cat = array_pop($cats);
    if ( $cat->parent == $companies->term_id ) $company = $cat->slug;
    if ( $cat->parent == $items->term_id ) $item = $cat->slug;
  }
  return $permalink;
}

function articles_permalink($permalink, $post, $leavename) {
  if ( $post->post_type != \'articles\' ) return $permalink;
  $cats = get_the_category( $post->ID );
  $companies = get_term_by(\'slug\', \'companies\', \'category\');
  if ( empty($cats) || empty($companies) ) return $permalink;
  $company = \'\';
  while ( ! empty($cats) ) {
    if ( $company )
      return home_url() . \'/\' . $company . \'/articles/\' . $post->name;
    $cat = array_pop($cats);
    if ( $cat->parent == $companies->term_id ) $company = $cat->slug;
  }
  return $permalink;
}
这里我假设您只使用标准类别,其中类别“公司”是公司的父类别,“项目”是项目的父类别。

还假设cpt命名为“产品”和“物品”(注意复数)。

A如果您的配置不同,请调整功能。

结束

相关推荐

Get categories without post

我想得到没有帖子的类别。下面是使用post获取类别的sql。。SELECT terms.term_id,terms.name,COUNT(post.ID) FROM wp_posts as post JOIN wp_term_relationships as rel ON post.ID = rel.object_ID JOIN wp_term_taxonomy as ttax ON rel.term_taxonomy_id = ttax.term_taxonomy_id JOI