Wie können Sie Daten aus wp_postmeta durchsuchen?

Ich habe eine Website, die erweiterte benutzerdefinierte Felder verwendet , um verschiedene relevante Informationen zu erstellen und zu speichern. Diese müssen in die allgemeine Hauptsuche aufgenommen werden, die standardmäßig nur Titel und Hauptinhalt durchsucht.

Ich habe viele Informationen über das Abrufen von Suchergebnissen basierend auf bestimmten Teilen von postmeta gefunden, aber ich habe ein Problem damit. Es gibt eine potentiell unbegrenzte Menge von potentiellen Feldern, die nach der Suche gesucht werden.

Die Lösung könnte entweder alles in postmeta suchen oder irgendetwas mit einem meta_key, das dieser Regex entspricht: content_section_[0-9]{1,4}_content_.{2,8}

Beispiel meta_keys zum übereinstimmen sind:

 content_section_0_content_title content_section_0_content_title content_section_4_content_subtitle content_section_8_content_text 

Jede Art und Weise, in der ich die gesuchten Felder ändern kann, um die Post-Metas einzuschließen, würde sehr geschätzt werden.

Solutions Collecting From Web of "Wie können Sie Daten aus wp_postmeta durchsuchen?"

Wenn Sie ein Plug-in verwenden möchten , kann Relevanssi – A Better Search einen Versuch wert sein.

Die Standardversion (kostenlos) unterstützt die Suche nach Post-Meta.

Fügen Sie dies Ihrem Plugin oder Ihrer functions.php Datei Ihres Themes hinzu. Das folgende Beispiel enthält “your_key” in der Suche. Sie können alle Ihre Schlüssel einschließen, indem Sie das Array wiederholen.

 function me_search_query ($ query) {
   if ($ query-> is_search) {
     $ meta_query_args = Array (
       Array (
         'Schlüssel' => 'your_key',
         'wert' => $ query-> query_vars ['s'] = '',
         'vergleichen' => 'WIE',
       ),
     );
     $ query-> set ('meta_query', $ meta_query_args);
   };
 }
 add_filter ('pre_get_posts', 'me_search_query');

Ich bin nicht 100% sicher, aber um alle benutzerdefinierten Feldschlüssel / Werte für die Standardsuche zu erfassen, würde einen databaseaufruf mit wpdb erfordern .

Das alternative Plugin neben den genannten goto10 ist eine viel einfachere Lösung. Alles durchsuchen , WP Benutzerdefinierte Felder suchen

Diese function sollte auch nach dem WP 4.8.3 Sicherheitsupdate funktionieren.

Verwendung:

 // Do this in functions.php add_meta_field_to_search_query('right_data'); add_meta_field_to_search_query('extra_search_terms'); 

Implementierung:

 /* ADD META FIELD TO SEARCH QUERY */ function add_meta_field_to_search_query($field){ if(isset($GLOBALS['added_meta_field_to_search_query'])){ $GLOBALS['added_meta_field_to_search_query'][] = '\'' . $field . '\''; return; } $GLOBALS['added_meta_field_to_search_query'] = array(); $GLOBALS['added_meta_field_to_search_query'][] = '\'' . $field . '\''; add_filter('posts_join', function($join){ global $wpdb; if (is_search()){ $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id "; } return $join; }); add_filter('posts_groupby', function($groupby){ global $wpdb; if (is_search()) { $groupby = "$wpdb->posts.ID"; } return $groupby; }); add_filter('posts_search', function($search_sql){ global $wpdb; $search_terms = get_query_var('search_terms'); if(!empty($search_terms)){ foreach ($search_terms as $search_term){ $old_or = "OR ({$wpdb->posts}.post_content LIKE '{$wpdb->placeholder_escape()}{$search_term}{$wpdb->placeholder_escape()}')"; $new_or = $old_or . " OR ({$wpdb->postmeta}.meta_value LIKE '{$wpdb->placeholder_escape()}{$search_term}{$wpdb->placeholder_escape()}' AND {$wpdb->postmeta}.meta_key IN (" . implode(', ', $GLOBALS['added_meta_field_to_search_query']) . "))"; $search_sql = str_replace($old_or, $new_or, $search_sql); } } $search_sql = str_replace( " ORDER BY ", " GROUP BY $wpdb->posts.ID ORDER BY ", $search_sql ); return $search_sql; }); } 

Mehrere Leute haben das auf verschiedene Arten getan:

http://websmartdesign.nz/searching-structured-post-data-with-wordpress/ https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin/