問題描述
(主持人注意:最初的標題是 「如何使用兩種自定義分類法的自定義帖子型別的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。