题
是否有一种简单的方法来查询任何特定分类学术语标记的任何帖子?
我知道这种技术:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
但是我想通过通配符代替term_slug,或者只是一个空字符串。那么,这将为我提供所有在该分类法中标记的帖子,而不仅仅是一个特定术语。
感谢您的帮助,Dave
解决方案
回想起来,我做了Mikeschinkel和T31OS建议的混搭。可能可以将其注入即时的现有查询,但需要WordPress 3.1:
其他提示
我遇到了类似的情况戴夫。该代码出于我的目的而努力。这不是世界上最精益的选择,但它可以很好地完成工作:
// 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)个主要方法 您可以尝试:
使用完整的SQL查询 和
$wpdb->get_results()
,获取清单
$post->ID
s 对于分类法中的所有帖子,然后使用'post__id'
论点,或者注释SQL使用
WP_Query
带有一个钩子,让您添加一个SQLINNER JOIN
引用分类表。
我尝试避免在WordPress中完成SQL,直到无法帮助或只是返回ID列表。在这种情况下,我会避免列出 $post-ID
s供 '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
您可能正在编写插件的文件。
如果您想快速测试,我已经发布了 代码的独立版本 要观察,您可以将其下载并复制到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' ) );
?>
这几乎与分类学存档执行的查询相同。