您的答案在第一个数组lvl中是完美的,例如:
$args[\'meta_query\'][] = array(
\'key\' => \'tour_itinerario_ciudades_repeater_%_tour_ciudades_nombre\',
\'_key_compare\' => \'LIKE\',
\'value\' => \'MEXICO\',
\'compare\' => \'LIKE\',
);
我需要对阵列中第二层的工作进行一些修改:
$args[\'meta_query\'][] = array(
\'relation\' => \'OR\',
array(
\'key\' => \'tour_itinerario_ciudades_repeater_%_tour_ciudades_nombre\',
\'_key_compare\' => \'LIKE\',
\'value\' => \'CONDESA\',
\'compare\' => \'LIKE\',
),
array(
\'key\' => \'tour_itinerario_ciudades_repeater_%_tour_ciudades_nombre\',
\'_key_compare\' => \'LIKE\',
\'value\' => \'Ciudad 1\',
\'compare\' => \'LIKE\',
)
);
现在,
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:
// Only works for 1st level in array
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;
}
}
// custom code to make it work with arguments on Multidimensional array
foreach ($mq as $k => $m) {
foreach ($m as $k_i => $m_i) {
if (count($m_i) >= 3) {
if (isset($m_i[\'_key_compare\']) && in_array(strtoupper($m_i[\'_key_compare\']), [ \'REGEXP\', \'RLIKE\', \'LIKE\']) && isset($m_i[\'key\'])
) {
// Mark the key with a unique string to secure the later replacements:
$m_i[\'key\'] .= $marker . $k_i; // Make the appended tmp marker unique
// Modify the corresponding original query variable:
$q->query_vars[\'meta_query\'][$k][$k_i][\'key\'] = $m_i[\'key\'];
// Collect it:
$rx[$k][$k_i] = $m_i;
}
}
}
}
// 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:
//PRIMER NIVEL
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\']
);
}
//SECOND NIVEL
foreach ($rx as $k => $r) {
//TODO: test with several cases since may have bugs
if (!isset($r[\'key\'])) {//FORZO LA ENTRADA
foreach ($r as $k_i => $r_i) {
$sql[\'where\'] = str_replace(
sprintf(
".meta_key = \'%s\' ", $r_i[\'key\']
), sprintf(
".meta_key %s \'%s\' ", $r_i[\'_key_compare\'], str_replace(
$marker . $k_i, \'\', $r_i[\'key\']
)
), $sql[\'where\']
);
}
}
}
var_dump($sql);
return $sql;
});
});如果有人需要类似的答案,
再次使用THK