如何按自定义分类术语对自定义帖子类型帖子进行分组

时间:2011-03-18 作者:dashaluna

如果你能帮助我,我将不胜感激:)我很困,不知道如何继续。

我有一个自定义的帖子类型,叫做event 以及为其注册的2个自定义分类法:

  1. event_type 具有标签式功能(例如活动类型:瑜伽、语音工作)event_location 具有类似类别的功能(活动地点除外:英国->布莱顿,伦敦;欧洲->巴黎)
网站上有如下页面Yoga -> Upcoming events; Voice work -> Upcoming workshops. 根据我们所在的页面,我希望显示适当的事件。例如,如果我们在第页Yoga -> Upcoming events 我想显示所有event 自定义帖子event_type 练习瑜伽,然后将结果分组event_location 分类术语。例如,列出英国、布莱顿、英国、伦敦、欧洲、巴黎等地的所有瑜伽活动。

我目前在模板中执行的操作如下:

我得到了当前页面的slug和它的祖先event_type 分类法,它具有一些与之关联的事件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花时间帮助我!

3 个回复
最合适的回答,由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\');

SO网友:dashaluna

我无法让过滤器按照@Bainternet的建议工作。我已经尝试构建整个SQL,但我肯定我做错了什么,因为它不起作用:S非常感谢您的帮助。谢谢

我已经硬编码了event_typeevent_date 目前的元键值。

  SELECT posts.*
  FROM wp_posts as posts
  LEFT OUTER JOIN wp_postmeta as postmeta ON posts.ID = postmeta.post_id
  LEFT OUTER JOIN wp_term_relationships as relationships ON posts.ID = relationships.object_id
  LEFT OUTER JOIN wp_term_taxonomy as taxonomy ON relationships.term_taxonomy_id = taxonomy.term_taxonomy_id
  LEFT OUTER JOIN wp_terms as terms ON taxonomy.term_id = terms.term_id
  WHERE posts.post_type = \'event\' AND posts.post_status = \'publish\' 
  AND postmeta.meta_key = \'event_date\' AND postmeta.meta_value >= \'2011-02-02\'
  AND terms.slug = \'kirtan\' AND taxonomy.taxonomy = \'event_type\' AND taxonomy.count > 0
  GROUP BY taxonomy.taxonomy
  ORDER BY terms.slug ASC, postmeta.meta_value ASC

结束

相关推荐