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')
)
);
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.
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 );
} );
où $a_find
et $a_to
sont des tableaux de taille égale.