programing

검색 결과에 ACF 필드 추가 페이지 WordPress

powerit 2023. 9. 25. 23:09
반응형

검색 결과에 ACF 필드 추가 페이지 WordPress

검색 결과가 모두 추가되는 search.php라는 파일이 있습니다.검색 양식은 홈페이지에 있습니다.문제는 제가 검색 결과에 대한 특별한 페이지가 없는데, 이 페이지에 ACF 필드를 추가하고 있습니다.ACF 플러그인에서 드롭다운 메뉴 'location'을 검색했지만 그룹을 추가할 search.php 파일을 찾을 수 없습니다.제 설명이 좀 애매하다면 죄송하지만, 정확히 어떻게 설명해야 할지 모르겠습니다.

요약, search.php search results 페이지에 ACF 필드를 추가합니다.

용어: ACF는 워드프레스의 Advanced Custom Fields 플러그인을 의미합니다.

플러그인을 사용해서 할 수도 있지만 아래 코드를 사용해서 플러그인을 피할 수 있습니다.

당신의 기능에 이 코드를 추가해야 합니다.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 );

참고용 - https://gist.github.com/charleslouis/5924863

처음에 작동하지 않을 경우 이 솔루션을 사용해 보십시오.

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

그것은 나에게 통합니다.

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

언급URL : https://stackoverflow.com/questions/36787391/add-acf-fields-to-search-results-page-wordpress

반응형