web-dev-qa-db-de.com

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

Mit dem folgenden Code (in functions.php) werden meine Posts (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 veraltetem meta_key vermeiden.

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;
}
10
user6254

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. Daher wird orderby auf den ersten in meta_query angegebenen Metaschlüssel angewendet.

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

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

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;
}
15