WP_query: meta_key mit einer benutzerdefinierten Regel für einen bestimmten Wert

Ich bin ein bisschen mit einem WP_Query-Code festgefahren. Hier ist es :

$args = array( 'post_type' => 'post', 'meta_query'=> array( 'key' => 'karma', 'compare' => '>=', 'value' => 0, 'type' => 'numeric'), 'posts_per_page' => 9, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); 

Was ich machen will; was ich vorhabe zu tun :

Zeige alle Beiträge mit Karma> = 0 (es funktioniert gut mit diesem Code). ABER wenn es Beiträge mit Karma = 100 gibt, dann zeige nur 3 von ihnen + den Rest von Beiträgen.

Beispiele: 9 Beiträge mit Karma = 150, 133, 100, 100, 100, 100, 100, 33, 11.

Ich möchte zeigen: 150, 133, 100, 100, 100, 33, 11. (Nur 3 Beiträge mit Karma = 100 sind erlaubt).

Hast du eine Idee, wie du das erreichen kannst? Vielleicht ein add_filter('posts_where'); ?

UPDATE: Okay, ich habe es funktioniert, basierend auf @s_ha_dum Antwort. Es ist ein bisschen schwierig, aber das Ergebnis funktioniert;)

 $args = array( // Check for 9 last posts with karma = 100 'post_type' => 'post', 'meta_query'=> array( array( 'key' => 'karma', 'compare' => '=', 'value' => 100, 'type' => 'numeric' ) ), 'posts_per_page' => 9, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); $karma_qry = new WP_Query($args); if (!empty($karma_qry->posts)) { $i = 0; foreach ($karma_qry->posts as $p) { $i++; // Check for more than 3 posts with karma = 100 // Add them in the $dont_show_me array if($i > 3){ $dont_show_me[] = $p->ID; } } } // Setup the final query that excluded addional posts with karma = 100 $args['meta_query'][0]['compare'] = '>='; $args['meta_query'][0]['value'] = 0; $args['post__not_in'] = $dont_show_me; $wp_query = new WP_Query($args); 

Solutions Collecting From Web of "WP_query: meta_key mit einer benutzerdefinierten Regel für einen bestimmten Wert"

Eine meta_query ist ein Array von Arrays. Schau dir die Beispiele im Codex an .

  $args = array( 'post_type' => 'my_custom_post_type', 'meta_key' => 'age', 'orderby' => 'meta_value_num', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'age', 'value' => array(3, 4), 'compare' => 'IN', ) ) ); $query = new WP_Query($args); 

Was Sie haben, ist nur ein Array. Das könnte Ärger verursachen. Was du machen willst ist das:

 $args = array( 'post_type' => 'post', 'meta_query'=> array( array( 'key' => 'karma', 'compare' => '>=', // limit to "karma value = 100" 'value' => 0, // limit to "karma value = 100" 'type' => 'numeric' ) ), 'posts_per_page' => 9, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); 

Um jedoch zu der Frage selbst zu kommen, können Sie Logik nicht so kompliziert wie Sie brauchen …

Zeige alle Beiträge mit Karma> = 0 (es funktioniert gut mit diesem Code). ABER wenn es Beiträge mit Karma = 100 gibt, dann zeige nur 3 von ihnen + den Rest von Beiträgen.

… mit einer einzigen WP_Query . Das hört sich so an, als würdest du 3, und nur 3, Posts mit Karma größer als 100 ziehen und den Rest mit irgendetwas anderem füllen. Das wäre mit reinem SQL schwierig. Ich denke, dass es in SQL möglich ist, aber ich würde viel nachdenken müssen, viel weniger, um es zum Laufen zu bringen.

Ich würde vorschlagen, zwei Fragen – eine, um die “größer als 100” und eine Sekunde, um den Rest zu bekommen.

 $dont_show_me = array(1); $args = array( 'post_type' => 'post', 'meta_query'=> array( array( 'key' => 'karma', 'compare' => '>=', 'value' => 100, 'type' => 'numeric' ) ), 'posts_per_page' => 3, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); $karma_qry = new WP_Query($args); if (!empty($karma_qry->posts)) { $args['posts_per_page'] = 9 - $karma_qry->found_posts; $args['meta_query'][0]['value'] = 0; foreach ($karma_qry->posts as $p) { // assuming $dont_show_me is an array $dont_show_me[] = $p->ID; } $args['post__not_in'] = $dont_show_me; } else { $args['posts_per_page'] = 9; $args['meta_query'][0]['value'] = 0; } $the_rest_qry = new WP_Query($args); 

Ich kann das nicht testen, da ich deine karma Daten nicht auf meinem Server habe, aber ich bin ziemlich sicher, dass das korrekt ist. Es sollte dir zumindest den größten Teil bringen.