自定义分类法WP_Query分类中的所有术语?


8

有没有一种简单的方法来查询来自特定分类法中带有任何术语的任何帖子?

我知道这种技术:

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

但是我想通过一个通配符代替term_slug,或者只是一个空字符串。这样一来,我就能获得所有用该分类法中的任何术语标记的帖子,而不仅仅是一个特定术语。

谢谢您的帮助,戴夫

Answers:



23

我遇到了类似的情况戴夫。这段代码可以达到我的目的。这不是世界上最精简的选择,但它做得很好:

// 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,
        ),
    ),
) );

希望这对您或其他遇到问题的人有所帮助。

凯文


这对我非常有帮助。感谢@kevinlearynet
Tyrun

今天仍然是相对的
user1676224 '18

7

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

$ args =数组(
    'post_type'=>'post',
    'tax_query'=>数组(
        数组(
            'taxonomy'=>'your_custom_taxonomy',
            '操作员'=>'存在'
        ),
    ),
);
$ query =新的WP_Query($ args);

您基本上是在要求在your_custom_taxonomy中分配给任何术语的任何帖子。


4

@Dave Morris:

您是对的,WordPress会决定您是否没有术语,他们只会忽略您的分类法。

三(3)主要的方法,你可以尝试:

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

  2. 获取列表$post->ID小号为你分类的所有帖子,然后使用通过他们'post__id'的说法,或

  3. 通过WP_Query其中一个钩子注释使用的SQL,您可以通过该钩子添加INNER JOIN引用分类法表的SQL 。

我尝试避免在WordPress中使用完整的SQL,直到无法解决它或仅返回ID列表。在这种情况下,我将避免拉出$post-IDs 的列表以与该'post__id'参数一起使用,因为如果您有很多帖子,它可能会遇到性能问题,甚至是内存问题。这样就剩下了#3。

我创建了一个类来扩展WP_Query名为PostsByTaxonomy它使用'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可能正在编写的插件的文件中使用它。

如果您想对其进行快速测试,我已将代码的独立版本发布到Gist,您可以下载该代码并将其复制为Web服务器的根目录test.php,针对用例进行修改,然后使用类似如下的URL从浏览器中进行请求http://example.com/test.php

更新

要从查询中包含的帖子中删除粘性帖子,请尝试以下操作:

$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中使用。


迈克,谢谢您的帮助。由于某种原因,我无法使它正常工作。它不只返回具有从我的自定义分类法分配的术语的帖子。它似乎总是返回其他帖子。但是,它不会返回所有帖子,因此肯定是在做某件事...我可以使用$ query-> have_posts()函数进行迭代吗?两种方法似乎都不适合我。
戴夫·莫里斯

嗯,这很有趣。我在mysql日志中找到了查询,该查询获取了我期望的两个帖子,并且该查询有效。但是由于某种原因,当我遍历$ query-> posts时,又有五篇帖子回来了。我注意到的唯一另一件事是,在运行自定义分类帖子查询之后,立即运行另一个查询,该查询又通过其post_id捕获了另外三个帖子。然后我想所有五个帖子都放在一个结果数组中。
戴夫·莫里斯

我想我知道了。该自定义查询似乎包括粘性帖子,即使它们不在该自定义分类法中也是如此。关于如何正确尊重粘性帖子或至少使它们脱离此特定查询的任何想法?谢谢,戴夫
戴夫·莫里斯

好吧,它们是“粘性的”,对吗?:)我认为这是奇怪的行为,但是如果您使用它caller_get_posts=1,它们应该消失了: codex.wordpress.org/Function_Reference / ... 希望这会有所帮助。
MikeSchinkel 2010年

if(isset($query->posts_by_taxonomy))是将面向对象的方法与WordPress的挂钩方法结合在一起的好技巧。
Jan Fabry

1

您应该只能够设置分类法并取反以包含一个术语。

例如。

<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>

这几乎与分类档案执行的查询相同。


那不行
戴夫·莫里斯

query.php的第1432行检查分类法或术语是否为空,因此您不能就不能只传递一个子弹...还有其他想法吗?
戴夫·莫里斯

@ t31os-这可能也是第一个反应;自从我一直忘记以后,我就被它绊倒了不止一次。但是@Dave Morris是正确的;如果不是分类法/术语对,则将WP_Query其丢弃。
MikeSchinkel

6
@ t31os- WP_Query是的,不幸的是,没有以这种优雅的方式实现。几乎有1200行硬编码的特殊情况。
MikeSchinkel 2010年

3
“将近1200行硬编码的特殊情况。” ...令我
大笑
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.