Hier ist eine experimentelle Idee:
Angenommen, wir haben:
Post A mit dem benutzerdefinierten Feld location1
als UK - London
Post B mit dem benutzerdefinierten Feld location2
als Frankreich - Paris
Post C mit dem benutzerdefinierten Feld location3
als USA - New York
Dann könnten wir zum Beispiel verwenden:
$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'
]
]
];
wo wir das benutzerdefinierte _key_compare
Argument mit dem folgenden Plugin unterstützen:
<?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;
});
});
Hier fügen wir jedem Meta-Schlüssel eindeutige Markierungen für die Zeichenfolgenersetzung hinzu.
Beachten Sie, dass dies das Entweichen von Regex-Zeichen wie \(
und nicht unterstützt \\
.
$count++
in einer String-Konstruktion verwendet, als ich vergaß, dass ich$count
zweimal verwenden musste ;-) Ich würde nicht empfehlen, spezielle Zeichen in Schlüsselnamen außer dem Unterstrich zu verwenden . Sie verwenden Klammern in Ihrem Schlüssel. Sie haben eine besondere Bedeutung mit regulären Ausdrücken. Sie müssten ihnen also mit\(
und\)
inREGEXP
oderRLIKE
entkommen, aber das Entkommen wird in meinem Plugin nicht unterstützt. Sie könnten esLIKE
stattdessen mit versuchencustom_field_language(%)language
. @ PhilippKühnIhre Antwort ist perfekt, wenn Sie im ersten Array-Level arbeiten, zum Beispiel:
Ich muss einige Änderungen für die Arbeit in der zweiten Ebene des Arrays vornehmen:
Jetzt,
}); Nur für diejenigen, die eine ähnliche Antwort benötigen,
THK WIEDER
quelle