Verwenden von orderby mit 2 Metaschlüsseln

Ich kann orderby mit einem WP_Query in WP_Query indem WP_Query Folgendes benutze:

 'orderby' => 'meta_value_num', 'meta_key' => 'my_key_1', 

Ist es jedoch möglich, orderby basierend auf der Berechnung von 2 Meta-Feldern zu verwenden?

Zum Beispiel habe ich zwei Meta-Felder my_key_1 und my_key_2 . Ich möchte den Wertschlüssel 1 durch 2 teilen und durch dieses Ergebnis sortieren. Etwas wie

 meta_key = my_key_1/my_key_2 

Solutions Collecting From Web of "Verwenden von orderby mit 2 Metaschlüsseln"

Eine der Optionen wäre, auf databaseebene nach einer dynamisch berechneten Spalte zu sortieren. Das ist zu komplex für mich.

Wenn Sie Ihre Aufgabe in der Produktion haben, würde ich wahrscheinlich einen dritten Metaschlüssel erstellen: “Abteilung”, die von den beiden abgeleitet ist, und ihren Wert bei jeder Postspeicherung aktualisieren. Dann würde ich nach diesem Schlüssel in WP_Query () sortieren.

Die dritte Option für eine kleine Anzahl von Posts wäre das Sortieren eines Arrays.

Definieren Sie die Helferfunktion:

 function sort_by_division( $posts ) { foreach ( $posts as $i => $post ) : $my_key_1 = (float)get_post_meta( $post->ID, 'my_key_1', true ); $my_key_2 = (float)get_post_meta( $post->ID, 'my_key_2', true ); $division = $my_key_1 / $my_key_2; $divisions[$i] = $division; endforeach; array_multisort( $divisions, SORT_DESC, $posts ); return $posts; } 

Und wenden Sie es für die Ergebnisse der Abfrage an:

 < ?php $myposts = sort_by_division( get_posts() ); ?> 
    < ?php foreach ( $myposts as $post ) : setup_postdata( $post ); $my_key_1 = (float)get_post_meta( $post->ID, 'my_key_1', true ); $my_key_2 = (float)get_post_meta( $post->ID, 'my_key_2', true ); $division = $my_key_1 / $my_key_2; ?>
  • < ?php the_title(); ?>
    my_key_1: < ?php echo $my_key_1; ?>
    my_key_2: < ?php echo $my_key_2; ?>
    division: < ?php echo $division; ?>
  • < ?php endforeach; wp_reset_postdata();?>

Wie gesagt, wegen Speicherverbrauch nicht für große Anzahl von Posts verwendbar. Eine Option mit einem dritten Metaschlüssel ist am effizientesten.