好的,谢谢大家的回答。无论如何,我需要更多的灵活性,所以我最终没有使用wp模板自动糖。。。
因此,这个答案与我最初的问题没有严格的联系,但我认为它也可以帮助人们。
我构建了一个自定义函数,从特定的自定义分类法和可选的父术语中检索一组自定义帖子。如果父项通过,则返回的帖子将属于直接父项术语子项。代码如下:
// $post_type: string
// $taxonomy: string
// $parent_term: string (slug) || int (term_id)
// retrieves posts of a specific post_type and taxonomy, sorted by term
function get_taxonomy_posts($post_type, $taxonomy, $parent_term = \'\'){
if(!$post_type || !$taxonomy) return false;
global $wpdb;
//if $parent_term is defined and is not an integer then should be a slug, so let\'s get its id
if(!empty($parent_term) && !is_int($parent_term)){
$parent_data = get_term_by(\'slug\',$parent_term,$taxonomy);
$parent_term = $parent_data->term_id;
}
$term_ids = get_terms($taxonomy, array( \'parent\' => $parent_term, \'fields\' => \'ids\' ));
if(is_wp_error($term_ids)) return false;
$term_ids_str = implode(\',\',$term_ids);
// NOTE: terms.term_order gets added to tables by this plugin:
// http://wordpress.org/plugins/taxonomy-terms-order/
$query = $wpdb->prepare(
"select p.ID, p.post_title, p.post_content, p.post_excerpt, t.term_id, t.term_order, t.name as term_name, t.slug as term_slug, tt.count
from " . $wpdb->prefix . "posts p
inner join " . $wpdb->prefix . "term_relationships rel on p.ID = rel.object_id
inner join " . $wpdb->prefix . "term_taxonomy tt on tt.term_taxonomy_id = rel.term_taxonomy_id
inner join " . $wpdb->prefix . "terms t on tt.term_id = t.term_id
where p.post_type = %s and p.post_status = %s and t.term_id in (" . $term_ids_str . ")
order by t.term_order, p.menu_order"
,$post_type
,"publish"
);
$records = $wpdb->get_results($query);
$posts_array = array();
foreach($records as $record){
$term_name = $record->term_name;
if(!key_exists($term_name, $posts_array)) $posts_array[$term_name] = array();
$posts_array[$term_name][] = $record;
}
return $posts_array;
}//end get taxonomy_posts
它将为您提供一个数组,其中键是术语名称,值是属于该术语的帖子数组(或者更准确地说,帖子的帖子数据)。它可以很容易地修改为将例如键作为term\\u id而不是term\\u name。返回的单个post数据如下所示:
object(stdClass)#2308 (9) {
["ID"]=>
string(3) "269"
["post_title"]=>
string(26) "title"
["post_content"]=>
string(0) "content"
["post_excerpt"]=>
string(0) "excerpt"
["term_id"]=>
string(3) "803"
["term_order"]=>
string(1) "2"
["term_name"]=>
string(27) "term name"
["term_slug"]=>
string(26) "term-slug"
["count"]=>
string(1) "3"
}
旁注1:目前,我正在使用分类术语排序插件,因此在查询中,我按照custom term\\u order字段对术语进行排序。同样,如果您不使用插件,只需根据您的喜好更改检索到的字段和order by子句。
旁注2:代替分类法taxonomyname termname。php,现在我基本上使用一个虚拟页面并应用一个自定义模板(我的意思是/* Template Name: [name] */
): 这不是强制性的,但我这样做是为了让wp的主查询只执行一个简单的1 post查询,而不是一种重复的术语查询。
希望有帮助!