Wie kann ich mit meta_query nach einem benutzerdefinierten Feld filtern und nach einem anderen sortieren?


10

Mit dem folgenden Code (in functions.php) werden meine Beiträge (des CPT-Ereignisses) nach _end_date anstelle von _start_date sortiert. Was ist die richtige Lösung für dieses Problem ab WP 3.1.3? Natürlich möchte ich die Verwendung von veraltet vermeiden 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;
}

Antworten:


15

Dies scheint ein Fehler in Wordpress zu sein. Wordpress ändert die meta_query tatsächlich, wenn Sie orderby und meta_key als Abfragevariablen angeben. Normalerweise fügt diese Änderung den neuen meta_key als erstes Array im meta_query-Array hinzu, und daher wird die Reihenfolge auf den ersten in meta_query angegebenen Meta-Schlüssel angewendet.

Wenn Sie jedoch orderby, meta_key und meta_value query_vars im Filter pre_get_posts ändern, wird aufgrund des (meiner Meinung nach) Fehlers in Wordpress das neue Array in die vorhandene Metaabfrage eingefügt, das neue Array wird jedoch nicht als erstes Array eingefügt, sondern angehängt zur vorhandenen meta_query. Und orderby wird immer auf den ersten meta_key in meta_query angewendet.

Um dieses Problem zu umgehen, bis der Fehler behoben ist, können Sie den meta_key in der meta_query erneut als erstes Array angeben, wie im folgenden Beispiel:

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.