Fügen Sie den Post-Inhalt verknüpfter Posts in die Suche ein

Alle meine Posts haben ein ACF-Beziehungsfeld, das es Admins erlaubt, eine beliebige Anzahl von FAQs zu wählen, die ein benutzerdefinierter Beitragstyp, FAQ, sind. Im Frontend werden diese FAQs nach dem Inhalt der Post angezeigt. Daher sollten meine Suchergebnisse einen Post enthalten, wenn der Inhalt der FAQ mit der Suchanfrage übereinstimmt.

Wenn ein Administrator “FAQ 1” im Feld ACF-Beziehung für “Post 1” auswählt und “FAQ 1” das Wort “foo” enthält, sollte eine Site-Suche nach “foo” mit der nativen Suchfunktion “Post 1 “als Ergebnis.

Momentan habe ich save_post und publish_post und publish_faq , um mehrere Loops laufen zu lassen. Wenn ein Post oder FAQ gespeichert wird, gibt WP den verlinkten FAQ-Inhalt an einen neuen Schlüssel in den Metadaten des entsprechenden Posts aus, der dann in die native Suche einbezogen wird die Haken hier: https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin

Allerdings scheint dies ein wenig hacky und ich hatte gehofft, jemand mit einem besseren Umgang mit SQL-Syntax kann in der Lage sein, mit einer saubereren Weg dies zu tun, möglicherweise mit einigen intelligenten JOIN statementen.

Solutions Collecting From Web of "Fügen Sie den Post-Inhalt verknüpfter Posts in die Suche ein"

Leider gibt es nicht wirklich einen einfachen Weg, um das zu erreichen, wonach Sie suchen, denn Sie verwenden ACF, um die Beziehungen zu verwalten. ACF speichert seine Daten als serialisierte Arrays in wp_postmeta, sodass Sie SQL nicht verwenden können. Eine performantere Möglichkeit, die Beziehungen zwischen Posts und FAQs zu verwalten, wäre die Verwendung einer Taxonomie.

Ich stieß kürzlich auf genau dieses Problem und schaffte es, eine funktionierende Lösung zu produzieren. Zufälligerweise habe ich den gleichen verknüpften Artikel oben verwendet, um die Suchanfrage zu ändern, aber der Auftrag wurde nicht abgeschlossen. Ich musste meine search.php Vorlage ändern, um die Ergebnisse korrekt aufzulisten

In meinem Fall hatte ich eine Reihe von FAQs zu jeder Seite und wollte bei der Suche nach den Daten nur die Seite auflisten, wenn ein Inhalt gefunden wurde. Das obige Tutorial bringt Sie auf dem richtigen Weg, aber Sie müssen die Suchabfrage selbst ändern. Wenn Sie Ihre eigene Suchvorlage so ändern, dass die aktuelle Schleife entfernt und stattdessen wie folgt geändert wird, sollten die Ergebnisse in relativ effizienter und umfassender Weise zurückgegeben werden, ohne dass zusätzliche Daten gespeichert werden müssen.

  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; //Change your search query here to include the FAQ post type $query_args = [ 'post_type' => ['post','page','faq'], 's' => strip_tags($_GET['s']), 'post_status' => 'publish', 'paged' => $paged ]; $post_query = new WP_Query($query_args); if($post_query->have_posts()) { //You'll have to keep track of duplicates here as some text will be matched in several FAQs and will possibly result in //certain pages being listed twice $listed_pages = []; while($post_query->have_posts()) { $post_query->the_post(); //Have you matched against an FAQ - if so, then you want to get the related page and list that in the results if('faq' == get_post_type()) { //Check the ACF relationship field - in my case the field was called display_page $linked_page = get_field('display_page', get_the_ID()); //Prevent Duplicates if(!in_array($linked_page[0], $listed_pages)) { //Output the search result and make a note that this page has been listed in results $listed_pages[] = $linked_page[0]; } } else { //Prevent Duplicates if(!in_array(get_the_ID(), $listed_pages)) { //Output the search result and make a note that this page has been listed in results $listed_pages[] = get_the_ID(); } } } } 

Hoffentlich hilft dir das weiter

Das ist die Lösung, die ich mir letztendlich ausgedacht habe. Wenn jemand irgendwelche Verbesserungen hat, dann würden sie sehr geschätzt werden:

 function add_acf_fields_to_postmeta_field($post_id, $post) { if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } $post_faqs = get_field('questions_answers', $post_id); $post_faq_content = ''; if(('post' == get_post_type($post_id) || 'press' == get_post_type($post_id)) && !$post_faqs) { return; } if('faq' == get_post_type($post_id)) { // when a faq gets saved // we find every posts/press that uses this faq // then loop through and re-save all that post/press's faq contents to the meta field $all_posts = new \WP_Query(array( 'post_type' => array('post', 'press'), 'meta_query' => array(array( 'key' => 'questions_answers', 'value' => $post_id, 'compare' => 'LIKE' )), 'fields' => 'ids' )); if($all_posts->have_posts()) { foreach($all_posts->posts as $a) { $post_faqs = get_field('questions_answers', $a); foreach($post_faqs as $p) { $post_faq_content .= strip_tags(get_the_title($p).' '.get_field('answer', $p)); } update_post_meta($a, 'post_faq_content', $post_faq_content); } } } elseif(('post' == get_post_type($post_id) || 'press' == get_post_type($post_id)) && $post_faqs) { // when a post/press gets saved and it has faqs // loop through them all and save contents to meta field foreach($post_faqs as $p) { $post_faq_content .= strip_tags(get_the_title($p).' '.get_field('answer', $p)); } update_post_meta($post_id, 'post_faq_content', $post_faq_content); } } add_action('save_post', __NAMESPACE__.'\\add_acf_fields_to_postmeta_field', 10, 2); add_action('publish_post', __NAMESPACE__.'\\add_acf_fields_to_postmeta_field', 10, 2); add_action('publish_press', __NAMESPACE__.'\\add_acf_fields_to_postmeta_field', 10, 2); add_action('publish_faq', __NAMESPACE__.'\\add_acf_fields_to_postmeta_field', 10, 2);