Meta_query kullanarak, özel bir alana ve başka bir alana göre nasıl filtre uygulayabilirim?


10

Aşağıdaki kodla (function.php dosyasında) yayınlarım (CPT olayının) _start_date yerine _end_date tarafından sıralanır. WP 3.1.3 itibariyle bunun için doğru çözüm nedir? Tabii ki kullanımdan kaldırılmaktan kaçınmak istiyorum meta_key.

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
                                   array(
                                         'key' => '_end_date',
                                         'value' => time(),
                                         'compare' => '>=',
                                         'type' => 'numeric'
                                        )
                                   )
                              );
  }
  return $query;
}

Yanıtlar:


15

Bu Wordpress'te bir hata gibi görünüyor. Sorgu değişkeni olarak orderby ve meta_key belirtirseniz, Wordpress meta_query'yi değiştirir. Normalde bu değişiklik yeni meta_key'i meta_query dizisindeki ilk dizi olarak ekler ve bu nedenle orderby meta_query'de belirtilen ilk meta anahtara uygulanır.

Ancak pre_get_posts filtresindeki orderby, meta_key ve meta_value query_vars değerlerini değiştirdiğinizde, Wordpress'teki (bana öyle geliyor) hatası nedeniyle yeni meta dizisini yeni meta sorgusuna ekler, ancak yeni dizi ilk dizi olarak eklenmez, eklenir mevcut meta_query'ye. Ve orderby her zaman meta_query'deki ilk meta_key'e uygulanır.

Hata giderilene kadar bir geçici çözüm olarak meta_key'de meta_query'de aşağıdaki örnekte olduğu gibi ilk dizi olarak yeniden belirtebilirsiniz:

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
        array(
              'key' => '_start_date'
        ),
        array(
              'key' => '_end_date',
              'value' => time(),
              'compare' => '>=',
              'type' => 'numeric'
        )
  ));
  }
  return $query;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.