获取自定义邮政类型的两个自定义分类术语的交集?

时间:2010-09-27 作者:Shaun

(Moderators note: 最初的标题是“How to get\\u posts of a custom post type that is in two custom taxonomy?”)

我有一个自定义的帖子类型,它有两个独立的分类法,一个叫做“项目类型”,另一个叫做“包”。我需要获得属于“项目类型”的项目列表A and “包装”A. 我尝试使用以下代码:

$args = array(
  \'post_type\' => \'portfolio\', 
  \'numberposts\' => -1, 
  \'project_type\' => \'A\', 
  \'package\' => \'A\'
); 
$my_posts = get_posts($args);  
但这会得到项目类型A或包A中的所有帖子。

有什么方法可以说get_posts() 我只想返回两种分类法中的帖子?

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

自v1起。3、该Query Multiple Taxonomies 插件与WP\\u查询配合得很好。原始args按原样工作。

$args = array(
\'post_type\' => \'portfolio\',
\'numberposts\' => -1,
\'project_type\' => \'A\',
\'package\' => \'A\'
);
然后进行新查询并进行检查:

$foo = new WP_Query($args);
var_dump($foo->posts);
我在自己的自定义分类设置上测试了这个,它只返回匹配的帖子both 查询中的术语。

使用QMT获取多个分类术语的另一种便捷方法是构建简单的URL查询:

site.com/?post_type=portfolio&package=foo&project=bar
我已经将此方法用于add_query_args() 函数在修改当前查询的页面上创建链接,通过添加其他术语和分类法对其进行细化。该语法也适用于搜索输入,因为输入字段中的多个单词被发布为foo+bar,这对QMT非常有用:

site.com/?post_type=portfolio&project=alpha&colors=red+blue+green
只返回满足以下条件的帖子all 这些标准-类型:公文包/项目:Alpha/颜色:红色+蓝色+绿色

SO网友:MikeSchinkel

你好@shaun:

@Rarst的正确之处在于adding this functionality to WordPress v3.1, 但它不会在这里一段时间,我相信你现在需要它。你可以试着grab the code they are working on 试着让它发挥作用,你可以the plugin Rarst和躯体都提到了,或者你可以在下面的主题中加入你需要的代码。

以下代码是posts_where 挂钩以添加tax_terms 具有以下格式值的查询变量(即冒号逗号),其中值为termslugs:

"{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"
这是一个独立的.php 您可以在拉出add_action 电话和tax_terms_where() 在主题中发挥作用functions.php 文件(或输入到.php 您自己的一个插件的文件。)

<?php
/*
* Adds "tax_terms" to WP_Query()
*
* See: http://lists.automattic.com/pipermail/wp-hackers/2010-October/035258.html
* See: http://wordpress.stackexchange.com/questions/2255/
*
*/

  header(\'Content-Type:text/plain\');
  include "wp-load.php";
  add_action(\'posts_where\',\'tax_terms_where\',10,2);

  $result = new WP_Query(\'post_type=portfolio&tax_terms=project_type:A,package:A\');
  foreach($result->posts as $post) {
    echo "{$post->post_title}\\n";
  }

function tax_terms_where($where,$wp_query) {
  if (isset($wp_query->query)) {
    $query = $wp_query->query;
    if (is_string($query))
      parse_str($query,$query);
    if (is_array($query) && isset($query[\'tax_terms\'])) {
      global $wpdb;
      $tax_terms = explode(\',\',$query[\'tax_terms\']);
      foreach($tax_terms as $tax_term) {
        list($taxonomy,$term) = explode(\':\',$tax_term);
        $sql = <<<SQL
AND $wpdb->posts.ID IN (
  SELECT tr.object_id
  FROM $wpdb->term_relationships AS tr
  INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
  INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
  WHERE tt.taxonomy=\'%s\' AND t.slug=\'%s\'
)
SQL;
        $where .= $wpdb->prepare($sql,$taxonomy,$term);
      }
    }
  }
  return $where;
}
例如,如果这不是您所需要的,因为您希望$term->term_id 而不是匹配$term->slug 那么,如果您熟悉SQL和.php.

SO网友:Rarst

旧的Q,但显然出现了当前的状态-分类查询在3.1中得到了很大的改进,此后进一步改进。

现在,通过使用AND 关系,例如Codex:

\'tax_query\' => array(
    \'relation\' => \'AND\',
    array(
        \'taxonomy\' => \'movie_genre\',
        \'field\'    => \'slug\',
        \'terms\'    => array( \'action\', \'comedy\' ),
    ),
    array(
        \'taxonomy\' => \'actor\',
        \'field\'    => \'term_id\',
        \'terms\'    => array( 103, 115, 206 ),
        \'operator\' => \'NOT IN\',
    ),
),
请参见Taxonomy Parameters 完整文档。

通常的免责声明-到目前为止,我自己还没有弄乱过定制的东西。

我认为复杂的分类查询还没有在WP-core中实现。尝试Query Multiple Taxonomies 插件。

结束

相关推荐