WordPress 관리 검색: 결과 확장

게시 됨: 2021-01-20

때때로 웹사이트에서 콘텐츠를 찾는 것이 어려울 수 있습니다. WordPress 관리자는 원하는 콘텐츠를 더 쉽게 찾을 수 있습니다. 고맙게도 WordPress는 사용할 대부분의 관리 화면(예: 게시물 화면)에서 검색 기능을 제공합니다. 이 검색 기능은 훌륭하지만 그럼에도 불구하고 여러 면에서 제한적입니다.

예를 들어 게시물 관리 화면에서 게시물을 검색하는 경우 검색 기능은 기본적으로 게시물 제목, 게시물 발췌 및 게시물 콘텐츠에서 검색어 텍스트를 찾은 다음 해당 결과를 반환합니다. 그러나 사용자 정의 필드와 관련된 키워드로 검색하려면 어떻게 해야 합니까? 이 정보는 답답할 수 있는 관리자 게시물 목록 테이블 검색 결과에 포함되지 않습니다.

이전 기사에서 게시물 유형에 사용자 정의 필드를 추가하는 방법을 배웠습니다. 검색 결과에도 사용자 정의 필드를 포함할 수 있는 방법을 살펴보겠습니다.

관리자 화면 검색에서 검색어 확장

사용자 정의 필드에 대한 작업 예제에서는 게시물 중 하나에 '소스'라는 사용자 정의 필드를 만들고 URL 값을 삽입했습니다.

게시물 목록 테이블로 이동하여 검색 창에서 이러한 '소스' 값 중 하나를 사용하면 기본적으로 검색할 때 WordPress가 단순히 사용자 정의 필드를 보지 않기 때문에 결과를 얻지 못할 것입니다.

이를 변경하려면 WordPress가 검색 기능을 위해 제공하는 원래 후크를 확장해야 합니다. 확장해야 하는 후크는 pre_get_posts 함수 내부의 1779번째 줄 주위 wp-includes/class-wp-query.php 파일에 포함된 get_posts 입니다.

워드프레스 쿼리

전면 보기 또는 관리 영역에서 페이지를 방문할 때마다 해당 속성과 함께 요청에 해당하는 WP_Query 개체를 생성하기 위해 일련의 코드 스크립트가 실행됩니다.

모든 경우에 WP_Query 개체에서 어떤 변경 사항이 발생하는지 이해하기 위해 일부 쿼리 속성 출력의 임시 보기를 만들어 보겠습니다.

쿼리가 실행되기 전에 보기 위해 pre_get_posts 작업 후크에 인쇄를 추가합니다. pre_get_posts 필터는 쿼리 변수 개체가 생성된 후 실제 쿼리가 실행되기 전에 실행됩니다.

활성 테마의 functions.php 파일에 다음 코드를 삽입하십시오.

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

이제 Posts admin 화면에 접속하면 queryquery_var 의 출력이 상단에 출력될 것입니다.

코드를 더 쉽게 보려면 무료 온라인 PHP 미화 프로그램에 복사하여 붙여넣을 수 있습니다.

$GLOBALS['wp_query']->query 배열(먼저 출력)은 다음과 같습니다.

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

예를 들어 게시물 관리 화면에서 검색하는 경우 검색 문자열을 포함하여 배열 출력이 변경됩니다. 예를 들어 'wordpress.org'를 검색하면 다음과 같이 표시됩니다.

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

코드 조립

위의 정보를 염두에 두고 우리가 원하는 검색 기능을 달성하기 위해 올바른 코드를 삽입할 것입니다. 이렇게 하려면 활성 테마의 functions.php 로 돌아가서 이전 단계에서 몇 분 전에 삽입한 코드를 삭제하십시오. 그런 다음 아래 코드를 삽입하십시오.

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

다음 단계는 $post_type$custom_fields 변수를 요구 사항에 적용되는 값으로 변경하는 것입니다. 코드에서 무엇을 했는지 봅시다.

  • $post_type = 'post'; – 여기에서 검색하려는 게시물 유형을 정의합니다.
  • $custom_fields = array("source",); – 여기에서 검색하려는 사용자 정의 필드를 정의합니다.

pre_get_posts 후크로 작업하고 있기 때문에 올바른 페이지에 있는 동안 사용자 정의 검색 확장을 적용하도록 코드에서 확인하는 것이 중요합니다. Τo WordPress에 특정 조건에서 코드를 표시하도록 지시하고 일부 조건부 태그를 사용합니다.

  • if ( ! is_admin() ) return; 조건은 관리 영역에 있지 않은 경우 코드가 실행되지 않도록 합니다.
  • if ( $query->query['post_type'] != $post_type ) 우리가 $post_type 변수에 정의한 게시물 유형에 대해 작업하는지 확인합니다. 우리의 경우 post .
  • $search_term = $query->query_vars['s']; 검색 문자열을 변수에 유지한 다음 다시 비어 있도록 설정합니다. $query->query_vars['s'] = ''; 그렇지 않으면 아무것도 찾을 수 없습니다.

이제 이러한 업데이트가 적용된 상태에서 마지막 검색을 새로 고치면 올바른 결과를 얻을 수 있습니다. 우리의 경우 '소스' 사용자 정의 필드 항목이 포함된 '포스트 1' 게시물이 결과에 표시됩니다. 'https://dev. wordpress.org /reference/functions/add_post_meta/'.

WordPress 관리자 검색 개선

전면 보기 검색에서 검색 쿼리 확장

이제 관리 검색을 '고정'하여 웹사이트 사용자가 사용자 정의 필드를 검색할 수 있도록 프런트 엔드 검색 기능을 개선할 수 있습니다.

이전에 관리 검색에서 사용자 정의 필드에 대한 결과가 생성되지 않은 것과 같은 방식으로 프런트 엔드 검색에서도 사용자 정의 필드에 대한 결과를 반환하지 못합니다.

이상적으로는 사용자가 이러한 필드를 검색할 수 있기를 바랍니다. 이 예에서는 현재 URL 'https://dev.wordpress.org/reference/functions/add_post_meta/'가 포함된 게시물 중 하나에 사용자 지정 '소스' 필드가 있습니다. 사용자가 'wordpress.org'를 검색하면 이 게시물이 결과에 표시되어야 합니다. 그 방법을 알아보겠습니다.

필요한 코드

다시 functions.php 파일로 이동하여 이전에 붙여넣은 코드를 복사합니다. 이제 이 코드를 해당 코드 바로 아래에 붙여넣습니다(따라서 functions.php에 이 코드의 복사본이 두 개 있습니다). 이제 이 두 번째 코드에서 functions.php 이름을 extend_front_search 와 같은 이름으로 변경합니다. 다음과 같이 표시되어야 합니다.

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

다음으로 if ( $query->query['post_type'] != $post_type ) return; 상태.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

if( is_admin() ) return; 조건만 유지하면 됩니다. 코드가 프론트 엔드에만 적용되도록 하고 계속 진행할 수 있습니다.

대안 전략

사용자 정의 필드를 포함하도록 WordPress 검색을 확장하는 또 다른 방법은 SQL 쿼리를 변경하는 것입니다.

WP_Query 클래스는 wp-includes/class-wp-query.php 파일의 2897행에 설명된 대로 이를 조각으로 나누어 도움을 줍니다.

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

사용자 정의 필드 기사에서 이전에 언급했듯이 모든 사용자 정의 필드 데이터는 기본적으로 WordPress 검색에 포함되지 않는 'postmeta' 테이블의 데이터베이스에 저장됩니다. 따라서 첫 번째 단계는 아래 코드를 사용하여 이 두 테이블을 조인하는 것입니다.

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

물론 쿼리의 JOIN 절을 필터링할 때 posts_join 후크를 사용했습니다.

다음으로 posts_where 후크를 사용하여 쿼리의 WHERE 부분을 필요에 맞게 변경합니다.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

마지막으로 중복을 방지해야 합니다. 이를 달성하기 위해 쿼리의 DISTINCT 절을 필터링하는 posts_distinct 후크를 사용합니다.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

이제 "wordpress.org" 문자열을 검색하면 프론트엔드에서 어떤 일이 발생하는지 봅시다.

프론트 엔드에서 워드 프레스 검색

예상대로 이번에는 결과가 정확합니다. WordPress 검색은 값이 'https://dev'인 '소스' 필드가 포함되어 있기 때문에 결과로 '게시물 1'을 찾았습니다. wordpress.org /reference/functions/add_post_meta/

WordPress 검색 결과의 사용자 정의 게시물 유형

또 다른 방법은 맞춤 게시물 유형을 검색 가능하게 만드는 것입니다(맞춤 게시물 유형을 만드는 방법을 잘 모르는 경우 여기에서 이에 대한 기사를 확인하세요).

'책'이라는 사용자 정의 게시물 유형을 만들고 이 게시물 유형이 검색 결과에 표시되기를 원한다고 가정해 보겠습니다. 이번에는 SQL 쿼리를 다시 생성할 필요가 없지만 아래에 설명된 대로 pre_get_posts 후크에서 게시물 유형만 재정의합니다. 코드는 functions.php 파일에 다시 한 번 배치되어야 합니다.

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

여기서 우리가 한 것은 post_type 후크에 대한 인수로 검색 결과에 포함할 원하는 게시물 유형을 추가하는 것입니다.

유형을 제외하려면 배열에서 제거하면 됩니다.

결론

WordPress 웹 사이트에서 검색을 개선하면 정말 도움이 되고 시간을 크게 절약할 수 있습니다. 최종 사용자의 경우 사용자 정의 게시물 유형과 사용자 정의 필드를 모두 검색할 수 있는 것도 중요합니다. 위의 지침이 귀하의 웹사이트에서 이를 달성하는 방법에 대한 통찰력을 제공했기를 바랍니다.