Вот одна экспериментальная идея:
Предположим, мы получили:
сообщение A с пользовательским полем location1
как Великобритания - Лондон
сообщение B с пользовательским полем location2
как Франция - Париж
сообщение C с пользовательским полем location3
как США - Нью-Йорк
Тогда мы могли бы использовать, например:
$args = [
'meta_query' => [
'relation' => 'OR',
[
'key' => "^location[0-9]",
'_key_compare' => 'REGEXP',
'value' => 'London',
'compare' => 'LIKE',
],
[
'key' => 'location%',
'_key_compare' => 'LIKE',
'value' => 'Paris',
'compare' => 'LIKE'
],
[
'key' => 'location3',
'value' => 'New York',
'compare' => 'LIKE'
]
]
];
где мы поддерживаем пользовательский _key_compare
аргумент с помощью следующего плагина:
<?php
/**
* Plugin Name: Extended Meta Key Search In WP_Query
* Description: Custom '_key_compare' argument as REGEXP, RLIKE or LIKE
* Plugin URI: http://wordpress.stackexchange.com/a/193841/26350
* Plugin Author: Birgir Erlendsson (birgire)
* Version: 0.0.3
*/
add_action( 'pre_get_posts', function( $q )
{
// Check the meta query:
$mq = $q->get( 'meta_query' );
if( empty( $mq ) )
return;
// Init:
$marker = '___tmp_marker___';
$rx = [];
// Collect all the sub meta queries, that use REGEXP, RLIKE or LIKE:
foreach( $mq as $k => $m )
{
if( isset( $m['_key_compare'] )
&& in_array( strtoupper( $m['_key_compare'] ), [ 'REGEXP', 'RLIKE', 'LIKE' ] )
&& isset( $m['key'] )
) {
// Mark the key with a unique string to secure the later replacements:
$m['key'] .= $marker . $k; // Make the appended tmp marker unique
// Modify the corresponding original query variable:
$q->query_vars['meta_query'][$k]['key'] = $m['key'];
// Collect it:
$rx[$k] = $m;
}
}
// Nothing to do:
if( empty( $rx ) )
return;
// Get access the generated SQL of the meta query:
add_filter( 'get_meta_sql', function( $sql ) use ( $rx, $marker )
{
// Only run once:
static $nr = 0;
if( 0 != $nr++ )
return $sql;
// Modify WHERE part where we replace the temporary markers:
foreach( $rx as $k => $r )
{
$sql['where'] = str_replace(
sprintf(
".meta_key = '%s' ",
$r['key']
),
sprintf(
".meta_key %s '%s' ",
$r['_key_compare'],
str_replace(
$marker . $k,
'',
$r['key']
)
),
$sql['where']
);
}
return $sql;
});
});
где мы добавляем уникальные маркеры в каждый мета-ключ для замены строк.
Обратите внимание, что это не поддерживает экранирование символов регулярного выражения , как \(
и \\
.
$count++
в строковой конструкции, когда я забыл, что я должен использовать$count
дважды ;-) Я бы не рекомендовал использовать специальные символы в именах ключей, кроме подчеркивания . Вы используете скобки в своем ключе. Они имеют особое значение с помощью регулярных выражений. Таким образом, вам придется избегать их с помощью\(
и\)
вREGEXP
илиRLIKE
, но экранирование не поддерживается в моем плагине. Вы можете попробоватьLIKE
вместо этого сcustom_field_language(%)language
. @ PhilippKühnВаш ответ отлично работает в первом массиве lvl, например:
Мне нужно сделать некоторые изменения для работы во втором уровне в массиве:
Теперь,
}); Просто, если любой нужен аналогичный ответ,
THK СНОВА
источник