2014-10-11 71 views
0

第一次在这里发布;在过去的几天花了这么多时间,我很接近,但是卡住了。使用与我们所有自定义项目非常匹配的支持不佳的主题。这是一个商业目录网站。主题包括“精选”展示位置以更改格式并突出显示输出列表。该主题还利用自定义帖子类型的列表。用户输入一个城市,州和主题返回尽可能多的列表,因为它可以在搜索半径范围内,我们试图让在该半径内找到的任何特色列表达到结果的顶部,即使它不是“最接近”。

static function posts_clauses($clauses, $wp_query) { 
    extract(appthemes_geo_get_args()); 

    global $wpdb; 

    $geo_query = $wp_query->get('app_geo_query'); 

    if (!$geo_query) 
     return $clauses; 

    extract($geo_query, EXTR_SKIP); 

    $R = 'mi' == $unit ? 3959 : 6371; 

    $clauses['join'] .= $wpdb->prepare(" INNER JOIN (
     SELECT post_id, (%d * acos(cos(radians(%f)) * cos(radians(lat)) * cos(radians(lng) - radians(%f)) + sin(radians(%f)) * sin(radians(lat)))) AS distance FROM $wpdb->app_geodata 
    ) as distances ON ($wpdb->posts.ID = distances.post_id) 
    ", $R, $lat, $lng, $lat); 

    $clauses['where'] .= $wpdb->prepare(" AND distance < %f", (float) $rad); 

    if ('distance' == $wp_query->get('orderby')) { 
     $clauses['orderby'] = 'distance ' . ('DESC' == strtoupper($wp_query->get('order')) ? 'DESC' : 'ASC'); 
    } 

    return $clauses; 
} 

}

然后另一个文件(views.php)有参数以改变由最高额定排序顺序中:主题使用以下代码设置geo.php文件中的“距离” ,按字母顺序排列,最新等等。我们被困的地方是试图让特色商品出现在距离结果的顶端。目前,它在顶部使用下面的代码返回featured一个wp_query:

function parse_query($wp_query) { 
    global $va_options, $wpdb; 

    $wp_query->set('ls', trim(get_query_var('ls'))); 
    $wp_query->set('s', get_query_var('ls')); 
    $wp_query->set('post_type', VA_LISTING_PTYPE); 
    $wp_query->set('posts_per_page', $va_options->listings_per_page); 

    if ('' == $wp_query->get('order')) 
     $wp_query->set('order', 'asc'); 

    $orderby = $wp_query->get('orderby'); 

    if (empty($orderby)) { 
     $location = trim($wp_query->get('location')); 

     if (!empty($location)) { 
      $orderby = $va_options->default_geo_search_sort; 
     } else { 
      $orderby = $va_options->default_search_sort; 
     } 

     $wp_query->set('orderby', $orderby); 
    } 

    $wp_query->set('va_orderby', $orderby); 

    switch ($orderby) { 
case 'default': 
     default: 
      $wp_query->set('meta_key', VA_ITEM_FEATURED); 
      $wp_query->set('orderby', 'meta_value_num'); 
      $wp_query->set('order', 'desc'); 
      $wp_query->set('va-featured', true); 
      break; 
    } 

我已删除了其他一些“情况”,以使代码更易于理解。默认情况下,在开关排序依据距离看起来是这样的:

  case 'distance': 
      break; 

这显然是因为排序依据在geo.php文件中定义。我试图添加$ wp_query-> set('meta_key','featured_cat'); (它是一个数字,或者是1或0,其中1是特色),然后为orderby添加一个数组,但它没有使用。

我认为答案是盯着我的脸,但我希望得到一些帮助。任何援助表示赞赏。

回答

0

想通了。我注释掉了geo.php文件中的Orderby子句

if ('distance' == $wp_query->get('orderby')) { 
    $clauses['orderby'] = 'distance ' . ('DESC' == strtoupper($wp_query->get('order')) ? 'DESC' : 'ASC'); 
} 

然后将orderby规则移到views.php中。在Wordpress 4.0中,有一些粒度控制器可用于订购。