首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带CPT距离和特色Orderby的Wordpress $wp_query

带CPT距离和特色Orderby的Wordpress $wp_query
EN

Stack Overflow用户
提问于 2014-10-11 00:39:16
回答 1查看 370关注 0票数 0

第一次在这里发帖;在过去的几天里,我已经很接近了,但还是被困住了。使用一个不受支持的主题,这个主题非常适合我们的所有自定义。这是一个商业目录网站。主题包括“特色”位置,以更改格式和突出显示输出的列表。该主题还为列表使用自定义的post类型。用户进入一个城市,状态和主题返回尽可能多的列表,在搜索半径范围内,我们正在努力使任何特色的列表中发现的半径内,以达到最高的结果,即使它不是“最近的”。主题使用以下代码在geo.php文件中设置“距离”:

代码语言:javascript
复制
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)中,有一些参数可以按照最高的等级、字母顺序、最新的顺序等来改变排序顺序。我们被困的地方是试图在距离结果的基础上得到有特色的列表。有一个在顶部使用以下代码返回的wp_query:

代码语言:javascript
复制
 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;
    }

为了使代码更容易理解,我删除了其他一些“案例”。默认情况下,开关顺序中的距离如下所示:

代码语言:javascript
复制
            case 'distance':
            break;

这显然是因为orderby是在geo.php文件中定义的。我尝试添加$wp_query->set( 'meta_key','featured_cat');(它是一个数字,有1或0的特征),然后为orderby添加一个数组,但是它没有被接受。

我想答案就在我眼前,但我希望能得到一些帮助。如能提供任何协助,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-14 14:38:54

弄明白了。我在geo.php文件中注释掉了Orderby子句

代码语言:javascript
复制
if ( 'distance' == $wp_query->get( 'orderby' ) ) {
    $clauses['orderby'] = 'distance ' . ( 'DESC' == strtoupper( $wp_query->get( 'order' ) ) ? 'DESC' : 'ASC' );
}

并将orderby规则移到views.php中。在Wordpress 4.0中,有粒度控制的命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26309890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档