問題描述
有沒有一種簡單的方法可以查詢任何標有任何特定分類學術語的帖子?
我知道這個技巧:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
但是我想通過一個通配符代替 term_slug,也可能只是一個空字符串。那麼那會給我所有那些用分類法中的任何術語標記的帖子,而不只是一個具體的術語。
感謝您的幫助,戴夫
最佳解決方案
回想起來,我做了一個混搭了 MikeSchinkel 和 t31os 的建議。可以將它註冊到現有的查詢中,但它需要 WordPress 3.1:
Plugin to get an RSS Feed for posts containing any term from a taxonomy.
次佳解決方案
我遇到類似的情況 Dave 。這段代碼為我的目的做了訣竅。這不是世界上最貧窮的選擇,但它的工作做得很好:
// 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 );
您基本上是要求任何分配給 your_custom_taxonomy 內的任何職位的職位。
第四種方案
Hi @Dave Morris:
你是正確的,WordPress 決定你是否沒有一個術語,他們將忽略你的分類。
有三 (3) 個主要方法可以嘗試:
-
使用完整的 SQL 查詢與
$wpdb->get_results(), -
獲取您分類中所有帖子的
$post->ID的列表,然後使用'post__id'參數傳遞它們,或 -
註釋
WP_Query使用的 SQL 與其中一個鈎子,讓您添加引用分類表的 SQLINNER JOIN。
我嘗試在 WordPress 中避免完整的 SQL,直到它無法被幫助或者只是返回一個 ID 列表。在這種情況下,我可以避免使用 $post-ID 列表來與'post__id'參數一起使用,因為如果您有很多帖子,可能會遇到性能問題甚至內存問題。所以我們離開了#3 。
我創建了一個擴展名為 PostsByTaxonomy 的 WP_Query 類,它使用'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 文件中使用。
如果你想快速測試,我已經發布了一個 self-contained 版本的代碼到 Gist,您可以下載並複製到您的 Web 服務器的根目錄為 test.php,根據您的用例進行修改,然後從您的瀏覽器使用 http://example.com/test.php 。
UPDATE
要從查詢中包含的帖子中省略粘滯帖子,請嘗試:
$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 。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。