简体   繁体   English

添加 ACF 字段到搜索结果页面 WordPress

[英]Add ACF fields to search results page WordPress

I have a file named search.php, where all the search results are added.我有一个名为 search.php 的文件,其中添加了所有搜索结果。 The search form is located on the homepage.搜索表单位于主页上。 The problem is, I have no special page for the search results, but I want to add ACF fields to this page.问题是,我没有专门的搜索结果页面,但我想在这个页面上添加 ACF 字段。 I have searched in the dropdown menu 'location' in the ACF plugin, but I can't find the search.php file to add groups to.我在 ACF 插件的下拉菜单“位置”中进行了搜索,但找不到要将组添加到的 search.php 文件。 I am sorry if my explaination is a bit vague, but I don't know how to explain this exactly.如果我的解释有点含糊,我很抱歉,但我不知道如何准确解释。

Summary, I want to add ACF fields to my search.php search results page.总结一下,我想将ACF字段添加到我的search.php搜索结果页面。

Terminology: ACF stand for the Advanced Custom Fields plugin in WordPress.术语:ACF 代表 WordPress 中的 Advanced Custom Fields 插件。

You can also do it using plugin but use below code to avoide plugin. 你也可以使用插件来做,但使用下面的代码来避免插件。

You need to add this code in you function.php file 您需要在function.php文件中添加此代码

<?php
/**
 * [list_searcheable_acf list all the custom fields we want to include in our search query]
 * @return [array] [list of custom fields]
 */
function list_searcheable_acf(){
  $list_searcheable_acf = array("title", "sub_title", "excerpt_short", "excerpt_long", "xyz", "myACF");
  return $list_searcheable_acf;
}
/**
 * [advanced_custom_search search that encompasses ACF/advanced custom fields and taxonomies and split expression before request]
 * @param  [query-part/string]      $where    [the initial "where" part of the search query]
 * @param  [object]                 $wp_query []
 * @return [query-part/string]      $where    [the "where" part of the search query as we customized]
 * see https://vzurczak.wordpress.com/2013/06/15/extend-the-default-wordpress-search/
 * credits to Vincent Zurczak for the base query structure/spliting tags section
 */
function advanced_custom_search( $where, &$wp_query ) {
    global $wpdb;

    if ( empty( $where ))
        return $where;

    // get search expression
    $terms = $wp_query->query_vars[ 's' ];

    // explode search expression to get search terms
    $exploded = explode( ' ', $terms );
    if( $exploded === FALSE || count( $exploded ) == 0 )
        $exploded = array( 0 => $terms );

    // reset search in order to rebuilt it as we whish
    $where = '';

    // get searcheable_acf, a list of advanced custom fields you want to search content in
    $list_searcheable_acf = list_searcheable_acf();
    foreach( $exploded as $tag ) :
        $where .= " 
          AND (
            (wp_posts.post_title LIKE '%$tag%')
            OR (wp_posts.post_content LIKE '%$tag%')
            OR EXISTS (
              SELECT * FROM wp_postmeta
                  WHERE post_id = wp_posts.ID
                    AND (";
        foreach ($list_searcheable_acf as $searcheable_acf) :
          if ($searcheable_acf == $list_searcheable_acf[0]):
            $where .= " (meta_key LIKE '%" . $searcheable_acf . "%' AND meta_value LIKE '%$tag%') ";
          else :
            $where .= " OR (meta_key LIKE '%" . $searcheable_acf . "%' AND meta_value LIKE '%$tag%') ";
          endif;
        endforeach;
            $where .= ")
            )
            OR EXISTS (
              SELECT * FROM wp_comments
              WHERE comment_post_ID = wp_posts.ID
                AND comment_content LIKE '%$tag%'
            )
            OR EXISTS (
              SELECT * FROM wp_terms
              INNER JOIN wp_term_taxonomy
                ON wp_term_taxonomy.term_id = wp_terms.term_id
              INNER JOIN wp_term_relationships
                ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
              WHERE (
                taxonomy = 'post_tag'
                    OR taxonomy = 'category'                
                    OR taxonomy = 'myCustomTax'
                )
                AND object_id = wp_posts.ID
                AND wp_terms.name LIKE '%$tag%'
            )
        )";
    endforeach;
    return $where;
}

add_filter( 'posts_search', 'advanced_custom_search', 500, 2 );

for reference - https://gist.github.com/charleslouis/5924863 供参考 - https://gist.github.com/charleslouis/5924863

Try This solution if first is not working. 如果首先不起作用,请尝试此解决方案。

https://support.advancedcustomfields.com/forums/topic/making-customfields-searchable/ https://support.advancedcustomfields.com/forums/topic/making-customfields-searchable/

it works for me这个对我有用

function custom_search_query( $query ) {
    if ( !is_admin() && $query->is_search ) {
        $result = $query->query_vars['s'];
        $query->query_vars['s'] = '';
        $query->set('meta_query', array('relation' => 'OR',
            array(
                'key'     => 'acf_name', // ACF FIELD NAME OR POST META
                'value'   => $result,
                'compare' => 'LIKE',
            )
        ));
        $query->set('post_type', 'post'); // optional POST TYPE
    }
}
add_filter( 'pre_get_posts', 'custom_search_query');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM