Verwenden der Metaabfrage ('meta_query') mit einer Suchabfrage ('s')
-
-
Was Sietunmöchten,istnichtmit nureiner Suchabfragemöglich.Siemüsstenbeide Abfragen separat ausführen und dann zusammenführen.Dies wurdebei dieser anderen Antwortbeschrieben.Es sollte Ihnen helfen,wieesgeht.http://wordpress.stackexchange.com/questions/55519/can-i-merge-2-new-wp-queryvariable-sWhat you are wanting to do isn't possible using just one search query. You would need to run both queries separately and then merge them together. This has been described at this other answer. It should give you a hand with how to do it. http://wordpress.stackexchange.com/questions/55519/can-i-merge-2-new-wp-queryvariable-s
- 0
- 2013-01-08
- Nick Perkins
-
11 Antworten
- Stimmen
-
- 2013-01-08
Gemäß dem Vorschlag von Nick Perkins mussteich zwei Abfragen wiefolgt zusammenführen:
$q1 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 's' => $query )); $q2 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 'meta_query' => array( array( 'key' => 'speel', 'value' => $query, 'compare' => 'LIKE' ) ) )); $unique = array_unique( array_merge( $q1, $q2 ) ); $posts = get_posts(array( 'post_type' => 'posts', 'post__in' => $unique, 'post_status' => 'publish', 'posts_per_page' => -1 )); if( $posts ) : foreach( $posts as $post ) : setup_postdata($post); // now use standard loop functions like the_title() etc. enforeach; endif;
As per Nick Perkins' suggestion, I had to merge two queries like so:
$q1 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 's' => $query )); $q2 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 'meta_query' => array( array( 'key' => 'speel', 'value' => $query, 'compare' => 'LIKE' ) ) )); $unique = array_unique( array_merge( $q1, $q2 ) ); $posts = get_posts(array( 'post_type' => 'posts', 'post__in' => $unique, 'post_status' => 'publish', 'posts_per_page' => -1 )); if( $posts ) : foreach( $posts as $post ) : setup_postdata($post); // now use standard loop functions like the_title() etc. enforeach; endif;
-
Ist dies ohne Zusammenschlussim Jahr 2016nochnichtmöglich?Ichbearbeite die Suchabfrage überpre_get_posts,daherist dies wirklich keine Option ...Is this still not possible without merging in 2016? I'm editing search query via pre_get_posts, so this is really not an option ...
- 1
- 2016-02-09
- trainoasis
-
@trainoasis Ichglaubenicht.Ich habees seit 2 Stunden versucht undeine Google-Suche hatmich hierhergebracht.@trainoasis I don't think so. I have been trying it since last 2 hours and a google search got me here.
- 0
- 2016-11-05
- Umair Khan Jadoon
-
- 2015-11-17
Ich habe stundenlangnacheiner Lösungfür dieses Problemgesucht. Das Zusammenführen von Arraysistnicht der richtige Weg,insbesondere wenn die Abfragen komplex sind und Siein Zukunftin der Lage seinmüssen,Metaabfragen hinzuzufügen. Die Lösung,die einfach schön ist,besteht darin,'s' zu ändern. zueinem,der sowohl die Suchenach Titeln als auchnach Metafeldernermöglicht.
add_action( 'pre_get_posts', function( $q ) { if( $title = $q->get( '_meta_or_title' ) ) { add_filter( 'get_meta_sql', function( $sql ) use ( $title ) { global $wpdb; // Only run once: static $nr = 0; if( 0 != $nr++ ) return $sql; // Modified WHERE $sql['where'] = sprintf( " AND ( %s OR %s ) ", $wpdb->prepare( "{$wpdb->posts}.post_title like '%%%s%%'", $title), mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) ) ); return $sql; }); } });
Verwendung:
$meta_query = array(); $args = array(); $search_string = "test"; $meta_query[] = array( 'key' => 'staff_name', 'value' => $search_string, 'compare' => 'LIKE' ); $meta_query[] = array( 'key' => 'staff_email', 'value' => $search_string, 'compare' => 'LIKE' ); //if there is more than one meta query 'or' them if(count($meta_query) > 1) { $meta_query['relation'] = 'OR'; } // The Query $args['post_type'] = "staff"; $args['_meta_or_title'] = $search_string; //not using 's' anymore $args['meta_query'] = $meta_query; $the_query = new WP_Query($args)
I have been searching for hours for a solution to this problem. Array merging is not the way to go, especially when the queries are complex and you must be able to add to meta queries in the future. The solution which is simplistically beautiful is to change 's' to one which allows both searching titles and meta fields.
add_action( 'pre_get_posts', function( $q ) { if( $title = $q->get( '_meta_or_title' ) ) { add_filter( 'get_meta_sql', function( $sql ) use ( $title ) { global $wpdb; // Only run once: static $nr = 0; if( 0 != $nr++ ) return $sql; // Modified WHERE $sql['where'] = sprintf( " AND ( %s OR %s ) ", $wpdb->prepare( "{$wpdb->posts}.post_title like '%%%s%%'", $title), mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) ) ); return $sql; }); } });
Usage:
$meta_query = array(); $args = array(); $search_string = "test"; $meta_query[] = array( 'key' => 'staff_name', 'value' => $search_string, 'compare' => 'LIKE' ); $meta_query[] = array( 'key' => 'staff_email', 'value' => $search_string, 'compare' => 'LIKE' ); //if there is more than one meta query 'or' them if(count($meta_query) > 1) { $meta_query['relation'] = 'OR'; } // The Query $args['post_type'] = "staff"; $args['_meta_or_title'] = $search_string; //not using 's' anymore $args['meta_query'] = $meta_query; $the_query = new WP_Query($args)
-
dasist der richtige Weg,this is the right way,
- 0
- 2016-08-12
- Zorox
-
Fantastisch,das hatbei mir sehrgutfunktioniert.Tolle Lösung!Vielen Dank!Fantastic, this worked very well for me. Great solution! Thanks!
- 0
- 2017-09-23
- Fabiano
-
Diesisteine Abfrage,keine Suche.Wenn Sie Plugins haben,diebei der Suchefunktionieren,funktioniert diesnicht.Liegeichfalsch?This is a query, not a search. If you have plugins that work on search, it doesn't work. Am I wrong?
- 0
- 2017-10-30
- marek.m
-
@marek.m Siemüssten das Plugin anpassen (möglicherweisemithilfeeines Filters,falls verfügbar),um die Metaabfrage hinzuzufügen.@marek.m you would need to customize the plugin (perhaps using a filter if its available) to add the meta query.
- 1
- 2020-01-21
- FooBar
-
- 2014-03-04
Miteinermodifizierten Version von diese Antwort .
$q1 = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => -1, 's' => $query )); $q2 = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'speel', 'value' => $query, 'compare' => 'LIKE' ) ) )); $result = new WP_Query(); $result->posts = array_unique( array_merge( $q1->posts, $q2->posts ), SORT_REGULAR ); $result->post_count = count( $result->posts );
A lot of code can be reduced by using a modified version of this answer.
$q1 = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => -1, 's' => $query )); $q2 = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'speel', 'value' => $query, 'compare' => 'LIKE' ) ) )); $result = new WP_Query(); $result->posts = array_unique( array_merge( $q1->posts, $q2->posts ), SORT_REGULAR ); $result->post_count = count( $result->posts );
-
Diesfunktionierte hervorragendfürmich (insbesondere,daich WP_Query anstelle vonget_posts verwendenmusste).Ichmusste Ihrepost_count-Zeile so ändern,dass sie lautet: `` `$ result->post_count=count ($ result->posts);` ``,weilich sonstnur 1 Ergebniserhalten habe.This worked great for me (especially since I needed to use WP_Query instead of get_posts). I did have to modify your post_count line to be: ```$result->post_count = count( $result->posts );``` because I was only getting 1 result otherwise.
- 0
- 2015-05-27
- GreatBlakes
-
- 2016-08-22
Ich hatte dasgleiche Problem. Fürmeine neue Website habeichgeradeeinen neuen Meta-Titel hinzugefügt.:
functions.php
add_action('save_post', 'title_to_meta'); function title_to_meta($post_id) { update_post_meta($post_id, 'title', get_the_title($post_id)); }
Und dann ...fügen Sieeinfach soetwas hinzu:
$sub = array('relation' => 'OR'); $sub[] = array( 'key' => 'tags', 'value' => $_POST['q'], 'compare' => 'LIKE', ); $sub[] = array( 'key' => 'description', 'value' => $_POST['q'], 'compare' => 'LIKE', ); $sub[] = array( 'key' => 'title', 'value' => $_POST['q'], 'compare' => 'LIKE', ); $params['meta_query'] = $sub;
Was halten Sie von dieser Problemumgehung?
i had the same problem, for my new site i just added a new meta "title" :
functions.php
add_action('save_post', 'title_to_meta'); function title_to_meta($post_id) { update_post_meta($post_id, 'title', get_the_title($post_id)); }
And then.. just add something like that :
$sub = array('relation' => 'OR'); $sub[] = array( 'key' => 'tags', 'value' => $_POST['q'], 'compare' => 'LIKE', ); $sub[] = array( 'key' => 'description', 'value' => $_POST['q'], 'compare' => 'LIKE', ); $sub[] = array( 'key' => 'title', 'value' => $_POST['q'], 'compare' => 'LIKE', ); $params['meta_query'] = $sub;
What do you think about this workaround ?
-
Dasisteigentlichnicht schlecht,erfordertjedoch,dass Sieentweder alle vorhandenen Beiträgeerneut speichern oder verwenden,bevor Siemit dem Hinzufügen von Inhaltenbeginnen.That's actually not bad, but requires you to either re-save all existing posts or start using it before you start adding content.
- 1
- 2016-12-06
- Berend
-
@Berend Sie könnten wahrscheinlicheine Funktion schreiben,die alle Beiträge abruft und diese durchläuft und diepost_metafürjeden aktualisiert.Fügen Sieesin einebenutzerdefinierte Vorlage oder Funktionein,führen Sieeseinmal aus und verwerfen Siees dann.@Berend you could probably write a function that gets all posts and loops through them updating the post_meta for each. Include it in a custom template or function, run it once, then discard it.
- 0
- 2018-05-23
- Slam
-
- 2016-10-12
Ich habe die Antwort von @Stabir Kiraein wenig optimiert
function wp78649_extend_search( $query ) { $search_term = filter_input( INPUT_GET, 's', FILTER_SANITIZE_NUMBER_INT) ?: 0; if ( $query->is_search && !is_admin() && $query->is_main_query() && //your extra condition ) { $query->set('meta_query', [ [ 'key' => 'meta_key', 'value' => $search_term, 'compare' => '=' ] ]); add_filter( 'get_meta_sql', function( $sql ) { global $wpdb; static $nr = 0; if( 0 != $nr++ ) return $sql; $sql['where'] = mb_eregi_replace( '^ AND', ' OR', $sql['where']); return $sql; }); } return $query; } add_action( 'pre_get_posts', 'wp78649_extend_search');
Jetzt können Sienach (Titel,Inhalt,Auszug) oder (Metafeld) oder (beide) suchen.
I have optimized @Stabir Kira answer a bit
function wp78649_extend_search( $query ) { $search_term = filter_input( INPUT_GET, 's', FILTER_SANITIZE_NUMBER_INT) ?: 0; if ( $query->is_search && !is_admin() && $query->is_main_query() && //your extra condition ) { $query->set('meta_query', [ [ 'key' => 'meta_key', 'value' => $search_term, 'compare' => '=' ] ]); add_filter( 'get_meta_sql', function( $sql ) { global $wpdb; static $nr = 0; if( 0 != $nr++ ) return $sql; $sql['where'] = mb_eregi_replace( '^ AND', ' OR', $sql['where']); return $sql; }); } return $query; } add_action( 'pre_get_posts', 'wp78649_extend_search');
Now you can search by (title, content, excrept) or (meta field) or (both of them).
-
- 2013-01-08
Nun,esisteine Art Hack,aberesfunktioniert. Siemüssen den Filterposts_clauses hinzufügen. Diese Filterfunktionsprüfungfür das Abfragewortistim benutzerdefinierten Feld "speel" vorhanden,und die verbleibende Abfragebleibterhalten.
function custom_search_where($pieces) { // filter for your query if (is_search() && !is_admin()) { global $wpdb; $keywords = explode(' ', get_query_var('s')); $query = ""; foreach ($keywords as $word) { // skip possible adverbs and numbers if (is_numeric($word) || strlen($word) <= 2) continue; $query .= "((mypm1.meta_key = 'speel')"; $query .= " AND (mypm1.meta_value LIKE '%{$word}%')) OR "; } if (!empty($query)) { // add to where clause $pieces['where'] = str_replace("(((wp_posts.post_title LIKE '%", "( {$query} ((wp_posts.post_title LIKE '%", $pieces['where']); $pieces['join'] = $pieces['join'] . " INNER JOIN {$wpdb->postmeta} AS mypm1 ON ({$wpdb->posts}.ID = mypm1.post_id)"; } } return ($pieces); } add_filter('posts_clauses', 'custom_search_where', 20, 1);
Well its kind of a hack but it works. You need to add posts_clauses filter. This filter function check for the any of the query word exists in the custom field "speel" and the remaining query stays intact.
function custom_search_where($pieces) { // filter for your query if (is_search() && !is_admin()) { global $wpdb; $keywords = explode(' ', get_query_var('s')); $query = ""; foreach ($keywords as $word) { // skip possible adverbs and numbers if (is_numeric($word) || strlen($word) <= 2) continue; $query .= "((mypm1.meta_key = 'speel')"; $query .= " AND (mypm1.meta_value LIKE '%{$word}%')) OR "; } if (!empty($query)) { // add to where clause $pieces['where'] = str_replace("(((wp_posts.post_title LIKE '%", "( {$query} ((wp_posts.post_title LIKE '%", $pieces['where']); $pieces['join'] = $pieces['join'] . " INNER JOIN {$wpdb->postmeta} AS mypm1 ON ({$wpdb->posts}.ID = mypm1.post_id)"; } } return ($pieces); } add_filter('posts_clauses', 'custom_search_where', 20, 1);
-
- 2018-05-30
Alle obengenannten Lösungengeben nur Ergebnisse zurück,wenneine Übereinstimmungim Speel-Metaschlüssel vorhandenist.Wenn Sie anderswo Ergebnisse haben,abernichtin diesem Bereich,erhalten Sienichts.Niemand will das.
Eine linke Verknüpfungisterforderlich.Im Folgenden wirdeine erstellt.
$meta_query_args = array( 'relation' => 'OR', array( 'key' => 'speel', 'value' => $search_term, 'compare' => 'LIKE', ), array( 'key' => 'speel', 'compare' => 'NOT EXISTS', ), ); $query->set('meta_query', $meta_query_args);
All of the above solutions only return results if a match exists in the speel meta key. If you have results elsewhere but not in this field you'll get nothing. Nobody wants that.
A left join is needed. The following will create one.
$meta_query_args = array( 'relation' => 'OR', array( 'key' => 'speel', 'value' => $search_term, 'compare' => 'LIKE', ), array( 'key' => 'speel', 'compare' => 'NOT EXISTS', ), ); $query->set('meta_query', $meta_query_args);
-
- 2020-03-19
Fürmichfunktioniert dernächste Codeperfekt:
$search_word = $_GET['id']; $data['words'] = trim(urldecode($search_word)); $q1 = new WP_Query( array( 'post_type' => array('notas', 'productos'), 'posts_per_page' => -1, 's' => $search_word )); $q2 = new WP_Query( array( 'post_type' => array('notas', 'productos'), 'posts_per_page' => -1, 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'subtitulo', 'value' => $search_word, 'compare' => 'LIKE' ), array( 'key' => 'thumbnail_bajada', 'value' => $search_word, 'compare' => 'LIKE' ) ) )); $result = new WP_Query(); $result->posts = array_unique( array_merge( $q1->posts, $q2->posts ), SORT_REGULAR ); $result->post_count = count( $result->posts );
for me works perfect the next code:
$search_word = $_GET['id']; $data['words'] = trim(urldecode($search_word)); $q1 = new WP_Query( array( 'post_type' => array('notas', 'productos'), 'posts_per_page' => -1, 's' => $search_word )); $q2 = new WP_Query( array( 'post_type' => array('notas', 'productos'), 'posts_per_page' => -1, 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'subtitulo', 'value' => $search_word, 'compare' => 'LIKE' ), array( 'key' => 'thumbnail_bajada', 'value' => $search_word, 'compare' => 'LIKE' ) ) )); $result = new WP_Query(); $result->posts = array_unique( array_merge( $q1->posts, $q2->posts ), SORT_REGULAR ); $result->post_count = count( $result->posts );
-
- 2018-12-11
Diesisteine großartige Lösung,aber Siemüsseneine Sachebeheben. Wenn Sie 'post__in' aufrufen,müssen Sieein Array von IDsfestlegen,und $ uniqueistein Array von Posts.
Beispiel:
$q1 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 's' => $query )); $q2 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 'meta_query' => array( array( 'key' => 'speel', 'value' => $query, 'compare' => 'LIKE' ) ) )); $unique = array_unique( array_merge( $q1->posts, $q2->posts ) ); $array = array(); //here you initialize your array foreach($posts as $post) { $array[] = $post->ID; //fill the array with post ID } $posts = get_posts(array( 'post_type' => 'posts', 'post__in' => $array, 'post_status' => 'publish', 'posts_per_page' => -1 ));
This is a great solution but you need to fix one thing. When you call 'post__in' you need to set an array of ids and $unique is an array of posts.
example:
$q1 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 's' => $query )); $q2 = get_posts(array( 'fields' => 'ids', 'post_type' => 'post', 'meta_query' => array( array( 'key' => 'speel', 'value' => $query, 'compare' => 'LIKE' ) ) )); $unique = array_unique( array_merge( $q1->posts, $q2->posts ) ); $array = array(); //here you initialize your array foreach($posts as $post) { $array[] = $post->ID; //fill the array with post ID } $posts = get_posts(array( 'post_type' => 'posts', 'post__in' => $array, 'post_status' => 'publish', 'posts_per_page' => -1 ));
-
- 2019-01-16
@ satbir-kira Die Antwortfunktioniert hervorragend,durchsuchtjedochnur den Meta- und Post-Titel. Wenn Siemöchten,dass Meta,Titel und Inhalt durchsucht werden,finden Sie hier diegeänderte Version.
add_action( 'pre_get_posts', function( $q ) { if( $title = $q->get( '_meta_or_title' ) ) { add_filter( 'get_meta_sql', function( $sql ) use ( $title ) { global $wpdb; // Only run once: static $nr = 0; if( 0 != $nr++ ) return $sql; // Modified WHERE $sql['where'] = sprintf( " AND ( (%s OR %s) OR %s ) ", $wpdb->prepare( "{$wpdb->posts}.post_title like '%%%s%%'", $title), $wpdb->prepare( "{$wpdb->posts}.post_content like '%%%s%%'", $title), mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) ) ); return $sql; }); } });
Und hierist die Verwendung:
$args['_meta_or_title'] = $get['search']; //not using 's' anymore $args['meta_query'] = array( 'relation' => 'OR', array( 'key' => '_ltc_org_name', 'value' => $get['search'], 'compare' => 'LIKE' ), array( 'key' => '_ltc_org_school', 'value' => $get['search'], 'compare' => 'LIKE' ), array( 'key' => '_ltc_district_address', 'value' => $get['search'], 'compare' => 'LIKE' ) );
Ersetzen Sie
$get['search']
durch Ihren Suchwert@satbir-kira answer works great but it will only search through the meta and post title. If you want it to search through meta, title and content, here is the modified version.
add_action( 'pre_get_posts', function( $q ) { if( $title = $q->get( '_meta_or_title' ) ) { add_filter( 'get_meta_sql', function( $sql ) use ( $title ) { global $wpdb; // Only run once: static $nr = 0; if( 0 != $nr++ ) return $sql; // Modified WHERE $sql['where'] = sprintf( " AND ( (%s OR %s) OR %s ) ", $wpdb->prepare( "{$wpdb->posts}.post_title like '%%%s%%'", $title), $wpdb->prepare( "{$wpdb->posts}.post_content like '%%%s%%'", $title), mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) ) ); return $sql; }); } });
And here is it's usage:
$args['_meta_or_title'] = $get['search']; //not using 's' anymore $args['meta_query'] = array( 'relation' => 'OR', array( 'key' => '_ltc_org_name', 'value' => $get['search'], 'compare' => 'LIKE' ), array( 'key' => '_ltc_org_school', 'value' => $get['search'], 'compare' => 'LIKE' ), array( 'key' => '_ltc_district_address', 'value' => $get['search'], 'compare' => 'LIKE' ) );
Replace
$get['search']
with your search value -
- 2020-02-19
Hieristeine andere Möglichkeit: Ändern Sie die Anforderungeinfachmit dem Filter 'posts_where_request'. Alles wird weiterhin die Standardeinstellung sein,außer ('s' UND 'meta_query')=> ('s' ODER 'meta_query').
AND ( ((posts.post_title LIKE 'Lily') OR (posts.post_excerpt LIKE 'Lily') OR (posts.post_content LIKE 'Lily')) ) AND ( ( postmeta.meta_key = 'author' AND postmeta.meta_value LIKE 'Lily' ) ) => AND ( ( ( postmeta.meta_key = 'author' AND postmeta.meta_value LIKE 'Lily' ) ) OR ((posts.post_title LIKE 'Lily') OR (posts.post_excerpt LIKE 'Lily') OR (posts.post_content LIKE 'Lily')) )
Diesist der Code
function edit_request_wp_query( $where ) { global $wpdb; if ( strpos($where, $wpdb->postmeta.'.meta_key') && strpos($where, $wpdb->posts.'.post_title') ) { $string = $where; $index_meta = index_argument_in_request($string, $wpdb->postmeta.'.meta_key', $wpdb->postmeta.'.meta_value'); $meta_query = substr($string, $index_meta['start'], $index_meta['end']-$index_meta['start']); $string = str_replace( $meta_query, '', $string ); $meta_query = ltrim($meta_query, 'AND').' OR '; $index_s = index_argument_in_request($string, $wpdb->posts.'.post_title'); $insert_to = strpos($string, '(', $index_s['start'])+1; $string = substr_replace($string, $meta_query, $insert_to, 0); $where = $string; } return $where; } add_filter('posts_where_request', 'edit_request_wp_query'); function index_argument_in_request($string, $key_start, $key_end = '') { if (!$key_end) $key_end = $key_start; $index_key_start = strpos($string, $key_start); $string_before = substr($string, 0, $index_key_start); $index_start = strrpos($string_before, 'AND'); $last_index_key = strrpos($string, $key_end); $index_end = strpos($string, 'AND', $last_index_key); return ['start' => $index_start, 'end' => $index_end]; }
Here's another way, just change the request with the 'posts_where_request' filter. Everything will still be the default except ('s' AND 'meta_query') => ('s' OR 'meta_query').
AND ( ((posts.post_title LIKE 'Lily') OR (posts.post_excerpt LIKE 'Lily') OR (posts.post_content LIKE 'Lily')) ) AND ( ( postmeta.meta_key = 'author' AND postmeta.meta_value LIKE 'Lily' ) ) => AND ( ( ( postmeta.meta_key = 'author' AND postmeta.meta_value LIKE 'Lily' ) ) OR ((posts.post_title LIKE 'Lily') OR (posts.post_excerpt LIKE 'Lily') OR (posts.post_content LIKE 'Lily')) )
this is the code
function edit_request_wp_query( $where ) { global $wpdb; if ( strpos($where, $wpdb->postmeta.'.meta_key') && strpos($where, $wpdb->posts.'.post_title') ) { $string = $where; $index_meta = index_argument_in_request($string, $wpdb->postmeta.'.meta_key', $wpdb->postmeta.'.meta_value'); $meta_query = substr($string, $index_meta['start'], $index_meta['end']-$index_meta['start']); $string = str_replace( $meta_query, '', $string ); $meta_query = ltrim($meta_query, 'AND').' OR '; $index_s = index_argument_in_request($string, $wpdb->posts.'.post_title'); $insert_to = strpos($string, '(', $index_s['start'])+1; $string = substr_replace($string, $meta_query, $insert_to, 0); $where = $string; } return $where; } add_filter('posts_where_request', 'edit_request_wp_query'); function index_argument_in_request($string, $key_start, $key_end = '') { if (!$key_end) $key_end = $key_start; $index_key_start = strpos($string, $key_start); $string_before = substr($string, 0, $index_key_start); $index_start = strrpos($string_before, 'AND'); $last_index_key = strrpos($string, $key_end); $index_end = strpos($string, 'AND', $last_index_key); return ['start' => $index_start, 'end' => $index_end]; }
Es wird versucht,eine Suche zuerstellen,dienichtnur die Standardeinstellungen (Titel,Inhalt usw.),sondern auchein bestimmtesbenutzerdefiniertes Feld durchsucht.
Meine aktuelle Anfrage:
Diesgibt Beiträge zurück,die sowohlmit der Suchabfrage als auchmit der Metaabfrage übereinstimmen. Ichmöchtejedoch auch,dass Beiträge zurückgegeben werden,bei denen sieeinfachmit einem derbeiden übereinstimmen.
Irgendwelche Ideen?