(主持人注意: :最初名为 “如何获取两种自定义分类法的自定义帖子类型的posts?”)

我有一种自定义帖子类型,该类型具有两个分类法,一个称为 “项目类型” 一个叫 “包裹”. 。我需要获取一个项目列表 “项目类型” A “包裹” A. 。我尝试使用以下代码:

$args = array(
  'post_type' => 'portfolio', 
  'numberposts' => -1, 
  'project_type' => 'A', 
  'package' => 'A'
); 
$my_posts = get_posts($args);  

但这获得了所有帖子 任何一个 在项目A类或软件包中。

有什么办法说 get_posts() 我只想退还那些帖子 两个都 分类学?

有帮助吗?

解决方案

从v1.3开始 查询多个分类法 插件与WP_QUERY一起工作。您的原始args工作原样。

$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);

然后进行新的查询并检查:

$foo = new WP_Query($args);
var_dump($foo->posts);

我通过自己的自定义分类学设置对此进行了测试,它只返回了匹配的帖子 两个都 查询中的术语。

使用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

哪个只返回符合的帖子 全部 这些标准 - 类型:投资组合 /项目:alpha /颜色:红色 +蓝色 +绿色

其他提示

你好 @shaun:

@Rarst 是对的 将此功能添加到WordPress v3.1, ,但是它不会暂时来这里,我敢肯定您现在需要它。你可以尝试 抓住他们正在处理的代码 并尝试使它起作用,您可以使用 插件 两个都 @Rarst@somation 提及,或者您可以将所需的代码包括在下面的主题中。

以下代码是 posts_where 钩子添加一个 tax_terms 具有格式值的查询变量 (即结肠癌) 值为术语的地方 sl:

"{$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和SQL和 .php.

旧的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',
    ),
),

分类参数 用于完整的文档。


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

我认为复杂的分类查询尚未在WP Core中实施。尝试 查询多个分类法 插入。

许可以下: CC-BY-SA归因
scroll top