it-swarm.com.de

Wie mache ich orderby 'meta_value_num' OPTIONAL?

$args = array(
          'cat' => 5,
          'posts_per_page' => 8,
          'meta_key' => 'custom_sort_order',
          'order' => 'ASC',
          'orderby' => 'meta_value_num'
        );

$custom_query = new WP_Query( $args );

Mit dem obigen Code kann ich meine Posts in aufsteigender Reihenfolge der Werte in meinem benutzerdefinierten Feld sortieren. Wenn ich jedoch vergessen habe, den Benutzerdefinierten Feldschlüssel und den Wert für den Beitrag zuzuweisen, findet die Abfrage aufgrund des custom_sort_order-Metaschlüssels nicht den gesamten Beitrag - da er für diesen bestimmten Beitrag nicht vorhanden ist.

Aber ich muss den 'meta_key' => 'custom_sort_order' dort ablegen, weil der Codex sagt:

'meta_value_num' - Reihenfolge nach numerischem Metawert (verfügbar ab Version 2.8). Beachten Sie auch, dass ein 'meta_key=keyname' muss auch in der Abfrage vorhanden sein.

Gibt es eine Möglichkeit, die ich umgehen und eine Standardsortierreihenfolge für die Abfrage festlegen kann, diese jedoch mit meinem custom_sort_order-Metaschlüssel mit aufsteigenden Zahlen bearbeiten kann? Selbst wenn ich vergesse, den custom_sort_order post_meta zu erwähnen, wird der Beitrag wie gewohnt abgefragt.

BEARBEITEN

Nach der Antwort von @ heathenJesus und @ engelens Kommentar scheint es, als würden wir das Thema auf harte Weise behandeln. Können wir uns einen Filter überlegen, mit dem wir eine benutzerdefinierte WP_Query () mit unserem benutzerdefinierten Metaschlüssel custom_sort_order ändern können?

Angenommen, unsere WP_Query-Argumente lauten:

 $args = array(
          'cat' => 5,
          'posts_per_page' => 8,
          'meta_key' => 'other_post_meta',
          'meta_value' => 'yes',
          'order' => 'ASC'
        );

$custom_query = new WP_Query( $args );

Wir haben den 'orderby' => 'meta_value_num' ausgeschlossen und unsere Abfrage mit einem anderen meta_key und dem entsprechenden Wert gefiltert. Aber custom_sort_order meta_key ist nicht da. Wir werden eine Art Filter implementieren und die Reihenfolge mithilfe unseres benutzerdefinierten Werts custom_sort_order extern ändern.

Können wir so denken?

Können wir tatsächlich fragen: "Wie hat es das Plugin zur Nachbestellung von Posts gemacht?"

2
Mayeenul Islam

Kurze Antwort: Das kannst du nicht. Jedenfalls nicht so.

Sie können jedoch alle Ergebnisse Ihrer Abfrage abrufen, unabhängig vom Vorhandensein dieses benutzerdefinierten Felds, und sie vollständig unsortieren und dann mit der Funktion PHP uksorthttp: // us1 sortieren. php.net/manual/en/function.uksort.php

So etwas wie:

$args = array(
      'cat' => 5,
      'numberposts' => 8
    );
$posts = get_posts($args);
uksort($posts,"sort_posts_by_custom_order");

function sort_posts_by_custom_order($a,$b)
{
  $custom_a = get_post_meta($a->ID,'custom_sort_order',true);
  $custom_b = get_post_meta($b->ID,'custom_sort_order',true);
  $custom_a = isset($custom_a) ? $custom_a : -1;
  $custom_b = isset($custom_b) ? $custom_b : -1;
  if ($custom_a == $custom_b) { return 0; }
  return ($custom_a < $custom_b) ? -1 : 1;      
}

Auf jeden Fall viel teurer als ein DB-Anruf, aber das ist der Preis, den Sie für inkonsistente Daten zahlen.

1
heathenJesus