it-swarm.com.de

Sortieren Sie Beiträge nach mehreren benutzerdefinierten Feldern

Ich habe drei benutzerdefinierte Felder

  • Metaschlüssel → YOUR_PREFIX_newcar_body_type
  • Meta Key → YOUR_PREFIX_newcar_transmission_type
  • Meta Key → YOUR_PREFIX_newcar_variant

und ich muss Posts basierend auf diesen benutzerdefinierten Feldern sortieren und den Titel des Posts drucken ...

Irgendwelche Ideen?

2
Solomon Henry

Leider glaube ich nicht, dass WordPress die Möglichkeit hat, im Rahmen der Abfrage nach mehreren Metaschlüsselkriterien zu sortieren: nur nach einem. Dies liegt wahrscheinlich daran, dass für jeden ausgewählten Metaschlüsselwert ein weiterer JOIN beteiligt ist. Sie können auch feststellen, dass es in SQL in der Klasse WP_Query keine Hooks zum Ändern der ORDER BY-Klausel gibt. Dies ist in wp-includes/query.php Zeile 2322 zu sehen.

Das heißt, es ist sicherlich möglich, die Bestellung in PHP zu machen.

$posts = get_posts( $query );

function prefix_sort_by_meta( $a, $b ) {
   $custom_a = get_post_custom( $a->ID );
   $custom_b = get_post_custom( $b->ID );
   return strcmp(
        $custom_a['YOUR_PREFIX_newcar_body_type'][0] . '-' . $custom_a['YOUR_PREFIX_newcar_transmission_type'][0] . '-' . $custom_a['YOUR_PREFIX_newcar_variant'][0],
        $custom_b['YOUR_PREFIX_newcar_body_type'][0] . '-' . $custom_b['YOUR_PREFIX_newcar_transmission_type'][0] . '-' . $custom_b['YOUR_PREFIX_newcar_variant'][0]);
}
usort( $posts, 'prefix_sort_by_meta' );
global $post;
// Pseudo-loop
foreach( $posts as $post ) {
   setup_postdata( $post );

   // Your item template here...
}

Dies ist nur eine Möglichkeit, eine Sortierung nach Metaschlüsselwerten zu erzielen: Fügen Sie die Metaschlüsselwerte mit '-' zusammen und sortieren Sie sie als Zeichenfolge. Sie können mit der Funktion prefix_sort_by_meta spielen, um verschiedene Sortiermethoden zu erreichen. Bitte beachten Sie, dass der obige Code PHP Hinweise auslöst, wenn die verschiedenen Metaschlüssel für keinen der Posts vorhanden sind und defensiver codiert werden sollten.

1
Bendoh