web-dev-qa-db-fra.com

N'importe quel nombre dans la clé méta (wp_query)

J'ai une telle requête. Le module de terrain _% _ texte est un champ flexible de champs personnalisés avancés où% doit correspondre à N'IMPORTE QUEL nombre, mais il ne sert à rien. Qu'est-ce que je fais mal? Peut-être que% ne représente aucun chiffre ou? Si j'entre dans modules_0_text, le champ est correct.

...

'meta_query' => array(
    'relation' => 'OR',
array(
'key' => 'price',
'value' => $_GET['searchword'],
'compare' => 'LIKE'
),
array(
'key' => 'modules_%_text',
'value' => $_GET['searchword'],
'compare' => 'LIKE'
)

...

UPDATE:

Here is my args:

$args = array(
  'post_type'=> 'custompost',
  'meta_query' => array(
  'relation' => 'AND',
    array('key' => 'modules_%_text','value' => $_GET['from'],'compare' => 'LIKE'),
    array('key' => 'modules_%_images','value' => $_GET['to'],'compare' => 'LIKE')
   )    
);
1
MIC

Vous devez utiliser LIKE sur le meta_key pour prendre en charge le modèle SQL %. L'attribut compare s'applique uniquement à la méta-valeur.

Au lieu de cela, vous pouvez essayer de le filtrer avec:

/**
 * Match any numbers in given a meta-key for WP_Query
 *
 * @see https://wordpress.stackexchange.com/a/177331/26350
 */

! is_admin() && add_filter( 'posts_where', function( $where )
{
    global $wpdb;

    // Replace the following meta key search:
    $find = $wpdb->postmeta . ".meta_key = 'modules_%_text'";

    // with a LIKE search:
    //$to = $wpdb->postmeta . ".meta_key LIKE 'modules_%_text'";

    // or a REGEXP search:
    $to   = $wpdb->postmeta . ".meta_key REGEXP '^modules_[0-9]+_text$'";

    // Replace:
    if( false !== stripos( $where, $find ) )    
        $where = str_ireplace( $find, $to, $where );

    return $where;
} );

Cela devrait modifier votre recherche de clé méta à partir de:

wp_postmeta.meta_key = 'modules_%_text'

à

wp_postmeta.meta_key  LIKE 'modules_%_text'

ou si vous ne devez faire correspondre que des chiffres dans la clé méta:

wp_postmeta.meta_key  REGEXP '^modules_[0-9]+_text$'

PS: Voici une autre question similaire qui a été postée récemment.

Mettre à jour:

Répondant au commentaire concernant les remplacements multiples:

/**
 * Match any numbers in given array of meta-keys for WP_Query
 *
 * @see https://wordpress.stackexchange.com/a/177331/26350
 */

! is_admin() && add_filter( 'posts_where', function( $where )
{
    global $wpdb;

    // Replace the following meta keys:
    $a_find = [ 
        $wpdb->postmeta . ".meta_key = 'modules_%_text'",
        $wpdb->postmeta . ".meta_key = 'modules_%_images'"
    ];

    // with a LIKE search:
    //$a_to = [
    //    $wpdb->postmeta . ".meta_key LIKE 'modules_%_text'",
    //    $wpdb->postmeta . ".meta_key LIKE 'modules_%_images'"
    //];

    // or a REGEXP search:
    $a_to   = [
        $wpdb->postmeta . ".meta_key REGEXP '^modules_[0-9]+_text$'",
        $wpdb->postmeta . ".meta_key REGEXP '^modules_[0-9]+_images$'"
    ];

    // Replace:
    return str_ireplace( $a_find, $a_to, $where );

} );

$a_find et $a_to sont des tableaux de taille égale.

1
birgire