Wordpress $wp_query с расстоянием CPT и популярным

Первое размещение здесь; провел последние несколько дней на этом, и я близко, но застрял. Использование плохо поддерживаемой темы, которая действительно хорошо работает со всеми нашими настройками. Это для веб-сайта бизнес-справочника. Тема включает размещение "Избранные", чтобы изменить форматирование и выделить выводимый список. Тема также использует пользовательские типы записей для списков. Пользователи вводят город, штат, и тема возвращает столько списков, сколько возможно, которые попадают в радиус поиска, поэтому мы стараемся, чтобы любые найденные списки, найденные в пределах этого радиуса, оказались в верхней части результатов, даже если они не "самые близкие". ". Тема устанавливает "расстояние" в файле geo.php, используя следующий код:

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, который возвращает признак вверху, используя следующий код:

 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;

Это очевидно потому, что orderby определен в файле geo.php. Я попытался добавить $wp_query->set( 'meta_key', 'featured_cat'); (это число 1 или 0, где 1 - Featured), а затем добавляется массив для orderby, но он не принимает.

Я думаю, что ответ смотрит мне в лицо, но я надеюсь на некоторую помощь. Любая помощь приветствуется.

1 ответ

Решение

Понял это. Я закомментировал предложение Orderby в файле geo.php

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

И переместил правила заказа в views.php. В Wordpress 4.0 есть детальный контроль над порядком заказа.

Другие вопросы по тегам