it-swarm.com.de

WP_query: meta_key mit benutzerdefinierter Regel für einen bestimmten Wert

Ich bin ein bisschen mit einem WP_Query-Code fest. 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 Posts mit Karma = 100 gibt, zeige nur 3 davon + den Rest der Posts.

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).

Haben Sie eine Idee, wie Sie dies erreichen können? Möglicherweise eine add_filter('posts_where');?

UPDATE: Okay, ich habe es zum Laufen gebracht, basierend auf der Antwort von @s_ha_dum. Es ist ein bisschen knifflig, 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);
2
hawkidoki

Ein meta_query ist ein Array von Arrays. Schauen Sie sich 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 Sie tun möchten, ist Folgendes:

$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 auf die Frage selbst zu kommen, können Sie nicht so kompliziert logisch vorgehen, wie Sie es brauchen ...

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

... mit einem einzigen WP_Query. Das hört sich so an, als ob Sie 3 und nur 3 Beiträge mit einem Karma von mehr als 100 ziehen und den Rest mit irgendetwas anderem ausfüllen möchten. Das wäre mit reinem SQL schwierig. Ich denke, es ist in SQL möglich, aber ich müsste ein lot denken, um sicher zu sein, viel weniger, damit es funktioniert.

Ich würde zwei Fragen vorschlagen - eine, um die "größer als 100" und eine zweite, 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 Ihre karma Daten nicht auf meinem Server habe, aber ich bin ziemlich sicher, dass das korrekt ist. Zumindest sollte es dir den größten Teil des Weges bringen.

3
s_ha_dum