有没有一种简单的方法来查询来自特定分类法中带有任何术语的任何帖子?
我知道这种技术:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
但是我想通过一个通配符代替term_slug,或者只是一个空字符串。这样一来,我就能获得所有用该分类法中的任何术语标记的帖子,而不仅仅是一个特定术语。
谢谢您的帮助,戴夫
有没有一种简单的方法来查询来自特定分类法中带有任何术语的任何帖子?
我知道这种技术:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
但是我想通过一个通配符代替term_slug,或者只是一个空字符串。这样一来,我就能获得所有用该分类法中的任何术语标记的帖子,而不仅仅是一个特定术语。
谢谢您的帮助,戴夫
Answers:
回想起来,我对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,
),
),
) );
希望这对您或其他遇到问题的人有所帮助。
凯文
嗨@Dave Morris:
您是对的,WordPress会决定您是否没有术语,他们只会忽略您的分类法。
有三(3)主要的方法,你可以尝试:
使用完整的SQL查询使用$wpdb->get_results()
,
获取列表$post->ID
小号为你分类的所有帖子,然后使用通过他们'post__id'
的说法,或
通过WP_Query
其中一个钩子注释使用的SQL,您可以通过该钩子添加INNER JOIN
引用分类法表的SQL 。
我尝试避免在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
可能正在编写的插件的文件中使用它。
如果您想对其进行快速测试,我已将代码的独立版本发布到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);
}
发布上述内容后,我了解到“ caller_get_posts”将被弃用,'ignore_sticky_posts'
并将在WordPress 3.1中使用。
caller_get_posts=1
,它们应该消失了: codex.wordpress.org/Function_Reference / ... 希望这会有所帮助。
if(isset($query->posts_by_taxonomy))
是将面向对象的方法与WordPress的挂钩方法结合在一起的好技巧。
您应该只能够设置分类法并取反以包含一个术语。
例如。
<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>
这几乎与分类档案执行的查询相同。
WP_Query
其丢弃。
WP_Query
是的,不幸的是,没有以这种优雅的方式实现。几乎有1200行硬编码的特殊情况。