web-dev-qa-db-fra.com

Comment comparer deux champs méta

Considérons deux champs méta balance et monthly_price. Comment vous obtiendrez tous les articles qui ont balance < monthly_price

Vous envisagez de créer une méta-requête mais nos deux champs sont arbitraires ou n’ont pas de valeur spécifique.

5
Sisir

Une méthode convenable consisterait à définir la valeur balance sur 'mt1.meta_value', puis à utiliser un filtre 'posts_request' pour supprimer les guillemets d'échappement:

$args = array(
  'post_type' => 'post', // maybe not
  'meta_query' => array(
    array(
      'key' => 'balance',
      'compare' => '>=',
      'value' => 'mt1.meta_value', // this will be treated as a string
      'type' => 'NUMERIC'
    ),
    // this is to force adding the needed JOIN clause
    array(
      'key' => 'monthly_price', 
      'compare' => 'EXISTS' 
    ),
    'relation' => 'AND'
  )
);

$closure = function( $sql ) {
  // remove single quotes around 'mt1.meta_value'
  return str_replace( "'mt1.meta_value'", "mt1.meta_value", $sql );
};

add_filter( 'posts_request', $closure );

$query = new \WP_Query( $args ); // this is your query :)

remove_filter( 'posts_request', spl_object_hash( $closure ) );

Je devrais ajouter que j’ai utilisé 'mt1.meta_value' parce que WordPress, lorsque plusieurs méta-requêtes sont dans les arguments, utilise des alias de table tels que "mt{$n}", où $n est incrémenté pour chaque requête supplémentaire.

6
gmazzap