是否有一种简单的方法来查询任何特定分类学术语标记的任何帖子?

我知道这种技术:

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

但是我想通过通配符代替term_slug,或者只是一个空字符串。那么,这将为我提供所有在该分类法中标记的帖子,而不仅仅是一个特定术语。

感谢您的帮助,Dave

有帮助吗?

解决方案

回想起来,我做了Mikeschinkel和T31OS建议的混搭。可能可以将其注入即时的现有查询,但需要WordPress 3.1:

插件以获取包含分类法的任何术语的帖子的RSS提要。

其他提示

我遇到了类似的情况戴夫。该代码出于我的目的而努力。这不是世界上最精益的选择,但它可以很好地完成工作:

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

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

你好 @Dave Morris:

您是正确的,WordPress决定如果您没有术语,他们会忽略您的分类法。

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

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

  2. 获取清单 $post->IDs 对于分类法中的所有帖子,然后使用 'post__id' 论点,或者

  3. 注释SQL使用 WP_Query 带有一个钩子,让您添加一个SQL INNER JOIN 引用分类表。

我尝试避免在WordPress中完成SQL,直到无法帮助或只是返回ID列表。在这种情况下,我会避免列出 $post-IDs供 'post__id' 争论,因为如果您有很多帖子,它可能会遇到性能问题甚至记忆问题。 这样就让我们拥有#3。

我创建了一个课程来扩展 WP_QueryPostsByTaxonomy 使用 '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 您可能正在编写插件的文件。

如果您想快速测试,我已经发布了 代码的独立版本 要观察,您可以将其下载并复制到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。

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

例如。

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

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

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