问题描述

有没有一种简单的方法可以查询任何标有任何特定分类学术语的帖子?

我知道这个技巧:

$custom_taxonomy_query = new WP_Query(
 array(
  'taxonomy_name' => 'term_slug',
 )
);

但是我想通过一个通配符代替 term_slug,也可能只是一个空字符串。那么那会给我所有那些用分类法中的任何术语标记的帖子,而不只是一个具体的术语。

感谢您的帮助,戴夫

最佳解决方案

回想起来,我做了一个混搭了 MikeSchinkel 和 t31os 的建议。可以将它注册到现有的查询中,但它需要 WordPress 3.1:

Plugin to get an RSS Feed for posts containing any term from a taxonomy.

次佳解决方案

我遇到类似的情况 Dave 。这段代码为我的目的做了诀窍。这不是世界上最贫穷的选择,但它的工作做得很好:

// Get all term ID's in a given taxonomy
$taxonomy = 'taxonomy_name';
$taxonomy_terms = get_terms( $taxonomy, array(
    'hide_empty' => 0,
    'fields' => 'ids'
) );

// Use the new tax_query WP_Query argument (as of 3.1)
$taxonomy_query = new WP_Query( array(
    'tax_query' => array(
        array(
            'taxonomy' => $taxonomy,
            'field' => 'id',
            'terms' => $taxonomy_terms,
        ),
    ),
) );

希望这可以帮助您或任何其他人遇到问题。

凯文

第三种解决方案

这样的事情可能会起作用:


$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'your_custom_taxonomy',
            'operator' => 'EXISTS'
        ),
    ),
);
$query = new WP_Query( $args );

您基本上是要求任何分配给 your_custom_taxonomy 内的任何职位的职位。

第四种方案

Hi @Dave Morris:

你是正确的,WordPress 决定你是否没有一个术语,他们将忽略你的分类。

有三 (3) 个主要方法可以尝试:

  1. 使用完整的 SQL 查询与 $wpdb->get_results()

  2. 获取您分类中所有帖子的 $post->ID 的列表,然后使用'post__id'参数传递它们,或

  3. 注释 WP_Query 使用的 SQL 与其中一个钩子,让您添加引用分类表的 SQL INNER JOIN

我尝试在 WordPress 中避免完整的 SQL,直到它无法被帮助或者只是返回一个 ID 列表。在这种情况下,我可以避免使用 $post-ID 列表来与'post__id'参数一起使用,因为如果您有很多帖子,可能会遇到性能问题甚至内存问题。所以我们离开了#3 。

我创建了一个扩展名为 PostsByTaxonomyWP_Query 类,它使用'posts_join 钩子。你可以在这里看到它:

class PostsByTaxonomy extends WP_Query {
  var $posts_by_taxonomy;
  var $taxonomy;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    unset($args['taxonomy']);
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_by_taxonomy)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  AND {$wpdb->term_taxonomy}.taxonomy='{$this->taxonomy}'
SQL;
    }
    return $join;
  }
}

你可以在下面看到这个类。参数'taxonomy'是必需的,但您可以传递 WP_Query 期望的其他参数的所有 (所有?),如'posts_per_page'

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
));
foreach($query->posts as $post) {
  echo " {$post->post_title}n";
}

您可以将 PostsByTaxonomy 类复制到主题的 functions.php 文件中,也可以在您可能正在编写的插件的.php 文件中使用。

如果你想快速测试,我已经发布了一个 self-contained 版本的代码到 Gist,您可以下载并复制到您的 Web 服务器的根目录为 test.php,根据您的用例进行修改,然后从您的浏览器使用 http://example.com/test.php

UPDATE

要从查询中包含的帖子中省略粘滞帖子,请尝试:

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
  'caller_get_posts' => true,
));

或者如果您对 PostsByTaxonomy 类不重要,那么您可以将其添加到构造函数中:

  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    $args['caller_get_posts'] = true     // No Sticky Posts
    unset($args['taxonomy']);
    parent::query($args);
  }

更新 2

发布以上我学了’caller_get_posts’ 将被弃用,'ignore_sticky_posts'将用于 WordPress 3.1 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。