如果你能帮助我,我将不胜感激:)我很困,不知道如何继续。
我有一个自定义的帖子类型,叫做event
以及为其注册的2个自定义分类法:
event_type
具有标签式功能(例如活动类型:瑜伽、语音工作)event_location
具有类似类别的功能(活动地点除外:英国->布莱顿,伦敦;欧洲->巴黎)
网站上有如下页面
Yoga -> Upcoming events
;
Voice work -> Upcoming workshops
. 根据我们所在的页面,我希望显示适当的事件。例如,如果我们在第页
Yoga -> Upcoming events
我想显示所有
event
自定义帖子
event_type
练习瑜伽,然后将结果分组
event_location
分类术语。例如,列出英国、布莱顿、英国、伦敦、欧洲、巴黎等地的所有瑜伽活动。
我目前在模板中执行的操作如下:
我得到了当前页面的slug和它的祖先我在event_type
分类法,它具有一些与之关联的事件我通过与先前收集的值相交来确定要显示的事件类型然后我构造一个WP\\u查询event
已确定的职位event_type
分类术语这似乎奏效了。然而,结果是无序返回的,我希望他们被event_location
分类术语。例如:
英国
布莱顿活动1活动2伦敦活动3欧洲
巴黎活动4我还想只显示未过期event
发布和排序方式event_date
. 这个event_date
值与event
在单个meta\\u键下发布详细信息。
Here is my code so far:
//pull in the appropriate events depending on the page type: yoga/voice work
/* get the ancestors and current page slugs */
// collect ancestor pages
$relations = get_post_ancestors($post->ID);
// add current post to pages
array_push($relations, $post->ID);
// get pages slugs
$relations_slugs = array();
foreach($relations as $page_ID){
$page = get_page($page_ID);
array_push($relations_slugs, $page->post_name);
}
/* get the term slugs (non-empty) for event_type taxonomy */
//get the event_type taxonomy values
$event_types = get_terms( \'event_type\', \'hide_empty=true\' );
$event_types_slugs = array();
foreach($event_types as $event_type){
array_push($event_types_slugs, $event_type->slug);
}
/* find what event_type to display on the current page */
$page_event_types = array_intersect($relations_slugs, $event_types_slugs);
$page_event_types_string = implode(",",$page_event_types);
/* find the events of the event_type to display on the current page */
$args = array(
\'post_type\' => \'event\',
\'tax_query\' => array(
array(
\'taxonomy\' => \'event_type\',
\'field\' => \'slug\',
\'terms\' => $page_event_types_string
)
)
);
$temp = $wp_query; //assign orginal query to temp variable for later use
$wp_query = null;
$wp_query = new WP_Query($args);
/* run the loop to output the event\'s details */
get_template_part( \'loop\', \'event-details\' );
我不擅长构造SQL语句。如果你能帮助我,我将不胜感激。非常感谢!!!
EDIT
我已经大大简化了功能(因为我对原来的功能感到困惑和迷茫)。请看我的答案。
感谢@Bainternet花时间帮助我!
最合适的回答,由SO网友:dashaluna 整理而成
我对这个有点困惑。最后,我决定不按event_location
分类并简化功能。
我所做的是:
我检测到什么event_type
要通过查看URL显示的事件。然后我显示所有的事件event_type
然后按event_date
ASC-即将到来的将首先出现。此处URL的格式为/events?type=event_type
我提供了一个侧边栏,其中包含所有event_location
类别术语。用户可以通过单击链接查看特定位置中的所有事件。本例中的URL具有以下格式:/events?location=event_location
. 除特定位置以外的所有类型的事件都按ASC顺序显示(即将出现的事件将首先显示)。
然后在我的自定义查询中包括\'tax_query\'
. 例如,对于event_location
分类法类似于:
$wp_query[\'tax_query\'] = array(\'taxonomy\' => \'event_location\',
\'field\' => \'slug\',
\'terms\' => $_GET[\'location\']
)
希望这能帮助别人。
SO网友:Bainternet
尝试使用这个奇特的函数,按术语id对帖子进行分组Scribu and Mike created:
function event_clauses( $clauses, $wp_query ) {
global $wpdb;
if ( isset( $wp_query->query[\'orderby\'] ) && \'event_location\' == $wp_query->query[\'orderby\'] ) {
$clauses[\'join\'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses[\'where\'] .= " AND (taxonomy = \'event_location\' OR taxonomy IS NULL)";
$clauses[\'groupby\'] = "object_id";
$clauses[\'orderby\'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses[\'orderby\'] .= ( \'ASC\' == strtoupper( $wp_query->get(\'order\') ) ) ? \'ASC\' : \'DESC\';
}
return $clauses;
}
添加到args数组
\'orderby\' => \'event_location\'
在查询添加之前
add_filter( \'posts_clauses\', \'event_clauses\', 10, 2 );
查询后添加
remove_filter( \'posts_clauses\', \'event_clauses\');