您必须使用LIKE
在meta_key
支持SQL%
图案这个compare
属性仅应用于元值。
相反,您可以尝试使用以下内容对其进行过滤:
/**
* 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;
} );
这将从以下位置修改元键搜索:
wp_postmeta.meta_key = \'modules_%_text\'
至
wp_postmeta.meta_key LIKE \'modules_%_text\'
或者,如果您必须只匹配元键中的数字:
wp_postmeta.meta_key REGEXP \'^modules_[0-9]+_text$\'
PS:
Here\'s 最近发布的另一个类似问题。
更新:
回答关于多次替换的评论:
/**
* 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
和
$a_to
是大小相等的数组。