问题描述
(主持人注意:最初的标题是 “如何使用两种自定义分类法的自定义帖子类型的 get_posts?”)
我有一个自定义的帖子类型,它有两个分开的分类,一个叫做”Project Type”,一个叫做”Package” 。我需要获得”Project Type” A
和”Package” A
的项目列表。我尝试使用以下代码:
$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);
$my_posts = get_posts($args);
但是,这将获得项目类型 A 或包 A 中的所有帖子。
有没有办法在 get_posts()
说,我想只返回那些在两个分类标准的帖子?
最佳解决方案
从 v1.3 开始,Query Multiple Taxonomies 插件对 WP_Query 非常有用。你的原始参数是按原样工作的。
$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);
然后进行一个新的查询并检查它:
$foo = new WP_Query($args);
var_dump($foo->posts);
我根据自己的自定义分类法设置进行了测试,只返回与查询中的两个条款相匹配的帖子。
使用 QMT 抓取多个分类术语的另一个方便方法是构建简单的 URL 查询:
site.com/?post_type=portfolio&package=foo&project=bar
我已经使用 add_query_args()
函数来创建在修改当前查询的页面上的链接,通过添加附加的术语和分类来进行改进。语法同样适用于搜索输入,因为输入字段中的多个单词被贴出为 foo + bar,这对 QMT 非常有用:
site.com/?post_type=portfolio&project=alpha&colors=red+blue+green
其中只返回满足所有这些条件的帖子 – 类型:投资组合/项目:Alpha /Colors:红色+蓝色+绿色
次佳解决方案
嗨 @shaun:
@Rarst 是正确的,因为他们是 adding this functionality to WordPress v3.1,但它不会在这里一段时间,我相信你现在需要它。您可以尝试使用 grab the code they are working on 并尝试使其正常工作,您可以使用 @Rarst 和 @somatic 提到的 the plugin,或者您可以在下面的主题中包含所需的代码。
以下代码是 posts_where
钩子,用于添加具有格式值 (即 colon-commas) 的 tax_terms
查询变量,其值为术语 slugs:
"{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"
这是一个 self-contained .php
,您可以将其拖放到您网站的根目录,以便将 add_action
调用和 tax_terms_where()
函数拉入您的主题的 functions.php
文件 (或您自己的插件之一的.php
文件) 中进行测试。
<?php
/*
* Adds "tax_terms" to WP_Query()
*
* See: http://lists.automattic.com/pipermail/wp-hackers/2010-October/035258.html
* See: http://wordpress.stackexchange.com/questions/2255/
*
*/
header('Content-Type:text/plain');
include "wp-load.php";
add_action('posts_where','tax_terms_where',10,2);
$result = new WP_Query('post_type=portfolio&tax_terms=project_type:A,package:A');
foreach($result->posts as $post) {
echo "{$post->post_title}n";
}
function tax_terms_where($where,$wp_query) {
if (isset($wp_query->query)) {
$query = $wp_query->query;
if (is_string($query))
parse_str($query,$query);
if (is_array($query) && isset($query['tax_terms'])) {
global $wpdb;
$tax_terms = explode(',',$query['tax_terms']);
foreach($tax_terms as $tax_term) {
list($taxonomy,$term) = explode(':',$tax_term);
$sql = <<<SQL
AND $wpdb->posts.ID IN (
SELECT tr.object_id
FROM $wpdb->term_relationships AS tr
INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
WHERE tt.taxonomy='%s' AND t.slug='%s'
)
SQL;
$where .= $wpdb->prepare($sql,$taxonomy,$term);
}
}
}
return $where;
}
如果这不完全是您需要的,因为例如,您宁愿匹配 $term->term_id
,而不是匹配 $term->slug
,那么代码不应该太难以根据您的需要进行修改,假设您对 SQL 和.php
很满意。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。