gillespieza
  • 0
Учитель

Фильтровать по одному пользовательскому полю, упорядочивать по другому?

  • 0

У меня есть настраиваемый тип сообщения «Список», и я хочу получить все списки, в которых есть настраиваемое поле gateway_value != 'Yes', и упорядочить результаты по другому настраиваемому полю, location_level1_value . Я могу заставить запросы работать по отдельности, но не могу их объединить:

Запрос 1 (отсортировать по местоположению):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

Запрос 2 (значение пользовательского поля != Да):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

Комбинированный запрос:

Я посмотрел на кодекс для помощи с этим, но следующий запрос не работает:

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

Что я делаю неправильно с комбинированным запросом?

[ОБНОВЛЕНИЕ]: Итак, теперь, когда выпущена версия 3.1, комбинированный запрос выше по-прежнему не работает. Я получаю результаты, просто неправильно отсортированные.

[ОБНОВЛЕНИЕ]: var_dump($wp_query->request) дает следующее:

string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"

Share
  1. Вы используете WordPress 3.1? Параметр meta_query является новым в версии 3.1, который должен быть выпущен очень скоро, но текущая стабильная версия по-прежнему 3.0.5 без этого параметра.

    • 0
  2. Вы можете использовать запрос для фильтрации контента, как вы предполагали, используя «meta_query» с параметрами фильтрации, а для части заказа просто добавьте/измените следующие параметры:

    • ‘orderby’ => ‘meta_value’
    • ‘meta_key’ => ‘location_level1_value’
    • ‘заказ’ => ‘АСЦ’

      $wp_query = new WP_Query( array (
          'post_type'      => 'listing',
          'posts_per_page' => '9',
          'post_status'    => 'publish',
          'meta_query'     => array(
              array(
                  'key'       => 'gateway_value',
                  'value'     => 'Yes',
                  'compare'   => '!='
              )
          ),
          'orderby'  => 'meta_value',            // this means we will be using a selected 
                                                 // meta field to order
      
          'meta_key' => 'location_level1_value', // this states which meta field 
                                                 // will be used in the ordering, 
                                                 // regardless of the filters
          'order'    => 'ASC',
          'paged'    => $paged
          )
      );
      
    • 0
  3. Как сказал Ян в новой версии WordPress 3.1, которую вы можете использовать meta_query, но до тех пор, пока она не выйдет, вы можете использовать свой первый запрос для упорядочения и фильтрации внутри вашего цикла следующим образом:

     Global $my_query;
    $my_query = new WP_Query( array (
                        'post_type' => 'listing',
                        'post_status' => 'publish',
                        'posts_per_page' => '9',
                        'meta_key' => 'location_level1_value',
                        'orderby' => 'location_level1_value',
                        'order' => 'ASC',
                        'paged' => $paged
                        )
                     );
    while ($my_query->have_posts){
        $my_query->the_post();
                  //do your loop stuff
    } 
    

    и добавьте этот код в свой functions.php

       //join filter
             add_filter('posts_join', 'listing_join_865' );
             function listing_join_865($join){
    Global$ my_query;            
    if ('listing' = $my_query->query['post_type']){
                    $restriction1 = 'gateway_value';
                    return $join .="
                    LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                    $wpdb->posts.ID = $restriction1.post_id
                    AND $restriction1.meta_key = '$restriction1'
                    )";
                 }else {
                    return $join;
                }
             }
             //where filter
             add_filter('posts_where', 'listing_where_865' );
             function listing_where_865($where){
                 global $my_query;
                if ('listing' = $my_query->query['post_type']){
                    return $where.= " AND $restriction1.meta_value != 'yes'";
                }else{
                    return $where;
                }
             }
    

    теперь это должно работать.

    • 0
  4. Извиняюсь за ответ на свой вопрос:

    Глядя на [http://core.trac.wordpress.org/ticket/15031][1], кажется, что это известная проблема. Я исправил (взломал?) его для работы post_filter, например, так (только для справки, кто может искать тот же ответ):

    В functions.php###

    add_filter('posts_orderby', 'EV_locationl1' );
    function EV_locationl1 ($orderby) {
        global $EV_locationl1_orderby;
        if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
        return $orderby;
    }
    

    Исправлен wp_query в файле шаблона###

    $EV_locationl1_orderby = " mt1.meta_value ASC";
    
    $wp_query = new WP_Query( array (
        'post_type' => 'listing',
        'posts_per_page' => '9',
        'post_status' => 'publish',
        'meta_query' => array(
                array(
                        'key' => 'gateway_value',
                        'value' => 'Yes',
                        'compare' => '!='
                        ),
                array(
                        'key' => 'location_level1_value'
                )
            ),
        'order' => $EV_locationl1_orderby,
        'paged' => $paged
        ));
    
    • 0

Оставить ответ

You must login to add an answer.