web-dev-qa-db-fra.com

Comment rendre orderby 'meta_value_num' FACULTATIF?

$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 );

Avec le code ci-dessus, je peux trier mes articles avec l'ordre de valeur de mon champ personnalisé, croissant. Mais si j'ai oublié d'attribuer la clé et la valeur du champ personnalisé à la publication, la requête ne trouve pas l'intégralité de la publication à cause de la custom_sort_order meta_key - car elle n'existe pas avec cette publication.

Mais je dois y mettre le 'meta_key' => 'custom_sort_order' car le Codex dit:

'meta_value_num' - Trié par valeur méta numérique (disponible avec la version 2.8). Notez également qu'un 'meta_key=keyname' doit également être présent dans la requête.

Y a-t-il un moyen, je peux le contourner et définir un ordre de tri par défaut avec la requête, mais je peux les manipuler avec ma custom_sort_order meta_key avec des nombres croissants? Ainsi, même si j'oublie de mentionner le custom_sort_order post_meta, le message sera interrogé comme d'habitude.

MODIFIER

Après la réponse de @ heathenJesus et le commentaire de @ engelen, il semble que nous traitions le sujet de manière difficile. Pouvons-nous penser à un filtre permettant de modifier un WP_Query () personnalisé avec notre custom custom_sort_order meta_key?

Supposons que nos arguments WP_Query sont:

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

$custom_query = new WP_Query( $args );

Nous avons exclu le 'orderby' => 'meta_value_num' et filtré notre requête avec une autre méta_key et une valeur respective. Mais custom_sort_order meta_key n'est pas là. Nous allons implémenter une sorte de filtre et modifier l'ordre extérieur en utilisant notre valeur personnalisée custom_sort_order.

Peut-on penser comme ça?

Peut-on en fait se demander: "Comment le plugin Post Type Re-Order a-t-il fonctionné ainsi?"

2
Mayeenul Islam

Réponse courte: vous ne pouvez pas. Pas comme ça, en tout cas.

Cependant, vous pouvez récupérer tous les résultats de votre requête, qu'ils soient totalement non triés, indépendamment de la présence de ce champ personnalisé, puis les trier à l'aide de la fonction PHP, uksorthttp : //us1.php.net/manual/en/function.uksort.php

Quelque chose comme:

$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;      
}

C'est certainement beaucoup plus cher que de passer un seul appel à une base de données, mais c'est le prix à payer pour des données incohérentes.

1
heathenJesus