是否为分类中的所有术语自定义分类WP_QUERY?

时间:2010-11-05 作者:Dave Morris

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

我知道这个技巧:

$custom_taxonomy_query = new WP_Query( 
 array(
  \'taxonomy_name\' => \'term_slug\',
 )
);
但我想传递一个通配符来代替term\\u slug,或者只传递一个空字符串。然后,这将为我提供在该分类法中由任何术语标记的所有帖子,而不仅仅是一个特定术语。

谢谢你的帮助,戴夫

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

现在回想起来,我已经将MikeSchinkel和t31os的建议进行了混搭。可以动态地将其注入现有查询,但需要WordPress 3.1:

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

SO网友:Kevin Leary

我遇到了类似的情况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,
        ),
    ),
) );
希望这能帮助您或其他遇到此问题的人。

凯文

SO网友:laurenfs132

类似的方法可能会奏效:

$args = array(
    \'post_type\' => \'post\',
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'your_custom_taxonomy\',
            \'operator\' => \'EXISTS\'
        ),
    ),
);
$query = new WP_Query( $args );
基本上,您是在要求为您的\\u custom\\u分类法中的任何术语分配任何帖子。

SO网友:MikeSchinkel

你好@Dave Morris:

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

three (3) main approaches 您可以尝试:

  1. Use a complete SQL query 具有$wpdb->get_results(),

  2. Get a list of $post->IDs ,然后使用\'post__id\' 参数,或

  3. Annotate the SQL used by WP_Query 使用其中一个挂钩,可以添加SQLINNER JOIN 引用分类表。

    我尽量避免在WordPress中使用完整的SQL,直到它无法帮助或只是返回ID列表为止。在这种情况下,我会避免列出$post-IDs用于\'post__id\' 因为如果你有很多帖子,它可能会遇到性能问题,甚至内存问题。So that leaves us with #3.

    I\'ve created a class to extend 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;
      }
    }
    
    您可以如下所示调用此类。The argument \'taxonomy\' is an required 但是你可以通过任何一个(全部?)的其他参数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 您可能正在编写的插件的文件。

    如果你想快速测试,我已经发布了a self-contained version of the code 要了解可下载并复制到web服务器根目录的要点,请执行以下操作:test.php, 根据您的用例进行修改,然后使用URL从浏览器请求,如http://example.com/test.php.

    更新至omit Sticky Posts 从查询中包含的帖子中,尝试以下操作:

    $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

    发布上述内容后,我了解到“来电者获取帖子”将被弃用,并且\'ignore_sticky_posts\' 将在WordPress 3.1中使用。

SO网友:t31os

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

例如:。

<?php
$your_query = new WP_query;
$your_query->query( array( \'taxonomy\' => \'your-taxonomy-name\' ) );
?>
这与分类法归档执行的查询几乎相同。

结束

相关推荐

Saving Taxonomy Terms

我有一个有趣的问题,希望有人能尽快回答。我已经创建了自己的metabox,它基于“我的metabox代码”(下面的列表)正确地显示了我创建的“event\\u types”分类中所有术语的下拉列表。我遇到的问题是,当从下拉列表中选择不同的术语并更新帖子时,能够保存/更新与帖子相关的术语。在对各种代码位进行修补之后,我发现通过手动将term\\u ID number[用逗号分隔]输入数组区域,我得到了我想要的结果。例如,如果在保存帖子时,函数将调用此代码wp_set_post_terms( $post_id