在搜索中包括链接帖子的帖子内容

时间:2017-07-12 作者:cfx

我的所有帖子都有一个ACF关系字段,允许管理员选择任意数量的FAQ,这是一种自定义帖子类型,faq. 在前端,这些FAQ显示在帖子内容之后,因此如果FAQ内容与搜索查询匹配,我希望我的搜索结果包括帖子。

因此,当管理员在ACF关系字段中为“帖子1”选择“FAQ 1”,并且“FAQ 1”包含“foo”一词时,使用本机搜索功能搜索“foo”的网站应显示“帖子1”。

目前,我正在安装save_postpublish_postpublish_faq 要运行多个循环,以便在保存帖子或FAQ时,WP将链接的FAQ内容输出到相应帖子元数据中的新关键字,然后通过此处的挂钩将其包括在本机搜索中:https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin

然而,这似乎有点老套,我希望能够更好地处理SQL语法的人能够提供一种更干净的方法来实现这一点,可能需要一些智能JOIN 声明。

3 个回复
SO网友:Chris Cox

不幸的是,没有一种真正简单的方法来实现您的目标,因为您使用ACF来管理关系。ACF将其数据作为序列化数组存储在wp\\U Posteta中,因此不能使用SQL。管理帖子和FAQ之间关系的一种更有效的方法是使用分类法。

SO网友:Andrew M

我最近遇到了完全相同的问题,并设法提出了一个可行的解决方案。巧合的是,我使用了上面相同的链接文章来修改搜索查询,但这并没有完成工作。我不得不修改我的search.php 模板以正确列出结果

在我的例子中,我有许多与每个页面相关的常见问题,如果满足任何内容,我只想在搜索数据时列出该页面。上面的教程很好地指导了您,但您需要修改搜索查询本身。如果您要修改自己的搜索模板以删除当前循环,并将其更改为以下内容,则应该以相对高效和全面的方式返回结果,而无需存储额外数据。

  $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();
        }
      }
    }
  }
希望这能帮到你

SO网友:cfx

这就是我最终设计的解决方案。如果任何人有任何改进,我们将不胜感激:

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);

结束

相关推荐

WordPress+JavaScipt+AJAX+MySQL:插入表单查询

我正试图在WordPress管理网站上制作带有表单的预订插件,在那里我可以在日历中添加新事件(用JavaScript制作)。我必须提交包含所有数据的表单,并将数据插入MySQL数据库。我的ajax.js 文件:function ajaxSubmit(e){ var nazwa_szkolenia = document.getElementById("nazwa_szkolenia").value; var Data_szkolenia = document.getEle

在搜索中包括链接帖子的帖子内容 - 小码农CODE - 行之有效找到问题解决它

在搜索中包括链接帖子的帖子内容

时间:2017-07-12 作者:cfx

我的所有帖子都有一个ACF关系字段,允许管理员选择任意数量的FAQ,这是一种自定义帖子类型,faq. 在前端,这些FAQ显示在帖子内容之后,因此如果FAQ内容与搜索查询匹配,我希望我的搜索结果包括帖子。

因此,当管理员在ACF关系字段中为“帖子1”选择“FAQ 1”,并且“FAQ 1”包含“foo”一词时,使用本机搜索功能搜索“foo”的网站应显示“帖子1”。

目前,我正在安装save_postpublish_postpublish_faq 要运行多个循环,以便在保存帖子或FAQ时,WP将链接的FAQ内容输出到相应帖子元数据中的新关键字,然后通过此处的挂钩将其包括在本机搜索中:https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin

然而,这似乎有点老套,我希望能够更好地处理SQL语法的人能够提供一种更干净的方法来实现这一点,可能需要一些智能JOIN 声明。

3 个回复
SO网友:Chris Cox

不幸的是,没有一种真正简单的方法来实现您的目标,因为您使用ACF来管理关系。ACF将其数据作为序列化数组存储在wp\\U Posteta中,因此不能使用SQL。管理帖子和FAQ之间关系的一种更有效的方法是使用分类法。

SO网友:Andrew M

我最近遇到了完全相同的问题,并设法提出了一个可行的解决方案。巧合的是,我使用了上面相同的链接文章来修改搜索查询,但这并没有完成工作。我不得不修改我的search.php 模板以正确列出结果

在我的例子中,我有许多与每个页面相关的常见问题,如果满足任何内容,我只想在搜索数据时列出该页面。上面的教程很好地指导了您,但您需要修改搜索查询本身。如果您要修改自己的搜索模板以删除当前循环,并将其更改为以下内容,则应该以相对高效和全面的方式返回结果,而无需存储额外数据。

  $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();
        }
      }
    }
  }
希望这能帮到你

SO网友:cfx

这就是我最终设计的解决方案。如果任何人有任何改进,我们将不胜感激:

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);

相关推荐

高级WP查询占用了SQL服务器

我最近为一位房地产经纪人的客户开发了一个网站。项目中包含一个名为listing. 此帖子类型用于他们的所有列表,其他信息存储在postmeta 表通过使用Advanced Custom Fields Pro.在网站的前端,我开发了一个过滤栏,用户可以通过几个过滤器进行选择并提交表单,然后生成一个复杂的WP\\u查询以返回匹配的列表。很简单!虽然大多数搜索都工作得很好,但一些更复杂的搜索将生成占用线程的SQL查询。当数据库需要刷新堆积的所有内容时,服务器基本上会冻结,直到有人终止进程。这在所有环境中都会发生