Aquí hay una idea experimental:
Supongamos que tenemos:
publicar A con el campo personalizado location1como Reino Unido - Londres
publicar B con el campo personalizado location2como Francia - París
publicar C con el campo personalizado location3como EE. UU. - Nueva York
Entonces podríamos usar, por ejemplo:
$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'
]
]
];
donde admitimos el _key_compareargumento personalizado con el siguiente complemento:
<?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;
});
});
donde agregamos marcadores únicos en cada meta clave para los reemplazos de cadena.
Tenga en cuenta que esto no admite el escape de caracteres regex , como \(y \\.
$count++en una construcción de cadena cuando olvidé que tenía que usar$countdos veces ;-) No recomendaría usar caracteres especiales en los nombres de las teclas, aparte del guión bajo . Estás usando paréntesis en tu clave. Tienen un significado especial con expresiones regulares. Por lo tanto, tendría que escapar de ellos con\(y\)dentroREGEXPoRLIKE, pero escapar no es compatible con mi complemento. Podrías intentarloLIKEconcustom_field_language(%)language. @ PhilippKühnSu respuesta es perfecta trabajando en la primera matriz lvl, por ejemplo:
Necesito hacer algunas modificaciones para trabajar en el segundo nivel de la matriz:
Ahora,
}); Solo por si alguno necesita una respuesta similar,
THK OTRA VEZ
fuente