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 является признаком), а затем добавляется массив для заказа, но он не принимает.

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

0

Решение

Понял это. Я закомментировал предложение 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 есть детальный контроль над порядком заказов.

0

Другие решения

Других решений пока нет …