사용자 정의 필드에 대한 검색 양식 작성


11

나는 자동차 대리점에 대한 테마를 만들었습니다. 각 차량은 커스텀 포스트 타입 ( "차량")이며, 제조사, 모델, 마일리지, 연료 유형 등과 같은 항목이있는 약 12 ​​개의 커스텀 필드가 있습니다.

기본적으로 홈페이지에는 Make & Model에 대한 드롭 다운 목록이 있고 사용 가능한 Makes 또는 Models가 포함 된 검색 양식이 필요합니다.

또한 Year에는 2 개의 옵션이 있기를 원하므로 최종 사용자는 "2006"과 "2012"를 선택할 수 있으며 검색 결과에는 해당 두 숫자 사이에 연도가있는 모든 차량이 포함됩니다.

이것을 할 수있는 플러그인이 있습니까?

도움을 주셔서 감사합니다 .. 이것은 몇 시간 동안 나를 미치게했습니다!



감사합니다 .. 그러나 실제로 검색 양식을 만드는 방법을 설명하지는 않습니다. HTML로 양식을 프로그래밍 할 수는 있지만 실제로 어떻게 작동하게합니까?!
absdigital

답변:


16

______UPDATE_______
점점 더 많은 표를 얻었지만 해결책이 효과가 있지만 cybmeta의 답변 은 실제로 좋은 답변이며 WordPress의 방법입니다. 꼭 시도해야합니다.

1 단계

당신은 사용자가 웹 사이트와 상호 작용하고, 이름으로 저장됩니다 할 함께 고급 검색 양식을함으로써 시작 (즉, 내가로 저장 advanced-searchform.php-하지만 그것을 저장하지 않습니다 searchform.php다음은 워드 프레스 '기본 검색 양식을 대체 할 수 있습니다 ) :

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 1', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

그런 다음 양식을 다음과 같이 템플릿으로 호출하십시오.

<?php get_template_part( 'advanced', 'searchform' ); ?>

이제 검색 양식이 준비되었으므로 검색 양식을 사용하고 사용자 입력을 URL로 가져올 수 있습니다.

2 단계

필요한 것은 데이터베이스를 쿼리하고 검색 쿼리에 따라 게시물 유형과 해당 사용자 정의 필드 를 쿼리하는 것 입니다. 검색어는 양식 제출 후 얻은 URL임을 기억하십시오. 이제 양식을 제출할 때 WordPress에 사용자 정의 검색 결과 페이지를로드하도록 요청하십시오. 다음 기능을 functions.php기본 설정 대신 사용자 정의 검색 템플릿을 사용하도록 설정하십시오 search.php.

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['search']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

WPSE에서 어딘가에 코드를 가져 왔습니다 (루트를 잊어 버렸습니다). 그러나 위의 코드를 사용하여 논란이 있습니다. 그러나 실제로 작동합니다 ( 물론 변명 ).

@GM이 제안한 다른 방법을 확인하십시오 .

3 단계

새 파일을 만들어 저장하십시오 advanced-search-result.php(이 이름은에서 사용 functions.php되었으므로). 이제 무료입니다. 컨셉은 :

  • URL에서 데이터를 가져와
  • 간단한 것을 사용하십시오 WP_Query()(쿼리가 복잡하면 $wpdb쿼리 를 사용하십시오 )
  • 쿼리 내에서 명령을 전달하고 db에서 데이터를 가져옵니다.
  • 결과 표시

샘플은 다음과 같습니다.

<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';

// Start the Query
$v_args = array(
        'post_type'     =>  'vehicle', // your CPT
        's'             =>  $_name, // looks into everything with the keyword from your 'name field'
        'meta_query'    =>  array(
                                array(
                                    'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                    'value'   => $_model,
                                    'compare' => 'LIKE', // finds models that matches 'model' from the select field
                                ),
                            )
    );
$vehicleSearchQuery = new WP_Query( $v_args );

// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);

// Show the results
if( $vehicleSearchQuery->have_posts() ) :
    while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
        the_title(); // Assumed your cars' names are stored as a CPT post title
    endwhile;
else :
    _e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>

마지막으로 여기 있습니다. 그러나 여전히 많은 도전이 있습니다 :

  • 대체 값 - 모든 필드 또는 모든 필드를 사용하여 고급 검색을 수행 할 수 있으므로 쿼리가 검색 및 데이터에 따라 모든 결과를 가져와야합니다. $wpdb복잡한 검색 결과에 사용자 정의 SQL 쿼리를 사용할 수 있으며 이는 순수한 MySQL입니다. WordPress에는 아무것도 없습니다.
  • 위생 및 유효성 검사 -텍스트 필드와 텍스트 영역이 너무 취약하여 사이트에 악영향을 줄 수 있습니다. 따라서 원시 데이터를 전달하는 것이 안전하지 않으므로 db 쿼리로 전달하기 전에 데이터를 삭제하고 유효성을 검사해야합니다. ( WordPress -TutsPlus를 사용한 데이터 삭제 및 유효성 검사 )
  • 디자인 - page.php(또는 search.php) 템플릿을 선택하고 이를 기반으로이 페이지를 만들 수 있습니다 .

그래서, 당신은 지금이 탐구하고 발견 할 수있는 네 차례 야, 생각이있어 길을 . 모든 사람의 길은 다르다는 것을 기억하십시오. 내가 당신을 따를 수 있도록 당신을 만드십시오. :)


시간 내 주셔서 감사합니다. 매우 친절합니다. "메이크"드롭 다운 메뉴에 차량 포스트 중 하나에 입력 된 모든 메이커가 자동으로 표시되도록하는 방법을 알고 있습니까?
absdigital

그것이 당신을 위해 일하면 기쁠 것입니다. :)
Mayeenul Islam 2016

"메이크"드롭 다운 메뉴에 차량 포스트 중 하나에 입력 된 모든 메이커가 자동으로 표시되도록하는 방법을 알고 있습니까?
absdigital

용도 WP_Query()표시하기 위해 사용하는 사용자 정의 필드 매개 변수 및 루프 결과를 <option>들.
Mayeenul Islam

이 "고급 검색" pre_get_posts이 보조 루프가 아닌 후크를 사용하여 수행되고 싶습니다 .
cybmeta

23

@MayeenulIslam의 답변이 효과가 있지만 고급 검색을 수행하는 올바른 방법은 pre_get_posts작업 후크를 사용하는 것 입니다.

1 단계 : 검색 양식

이 단계는 다른 답의 1 단계에 동일, 단지 변화 idname필드 ( <input type="text" ...>검색에 사용되는 "들" 이 검색 필드로 직접 사용할 수 있도록. 저장이 코드에 advanced-searchform.php테마 폴더 아래에. 그런 다음, 사용 get_template_part( 'advanced', 'searchform' );에 테마에 표시 할 위치에로드하십시오.

<?php /**`advanced-searchform.php`*/ ?>
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

2 단계 : 검색어에 필터 추가

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

3 단계 : 템플릿 (선택 사항)

이 방법을 사용하면 WordPress의 기본 검색 템플릿이 보조 쿼리없이 결과를 필터링하는 데 사용됩니다. 고급 검색에 다른 템플릿을 사용하려는 경우 template_include필터를 사용할 수 있습니다 . 예를 들어, advanced-search-template.php고급 검색 양식의 결과에 대한 템플리트로 파일 을 사용하려는 경우 :

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}

3
WordPress의 방법에 대해 대단히 감사합니다. 이 작업으로 방금 작업했으며 훌륭합니다. :)
Mayeenul Islam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.