I'm desperately trying to make an advanced searchform in order to get posts by their meta fields. I got this:
[UPDATE]: This is the correct code:
/**
*Registering custom query vars
*
*/
function sy_register_query_var( $vars ){
$vars[] = 'type';
$vars[] = 'cabins';
$vars[] = 'base';
return $vars;
}
add_filter( 'query_vars', 'sy_register_query_var' );
<?php
/**
*Registering custom query vars
*
*/
function sy_register_query_var( $vars ){
$vars[] = 'type';
$vars[] = 'people';
$vars[] = 'base';
$vars[] = 'duration';
return $vars;
}
add_filter( 'query_vars', 'sy_register_query_var' );
/**
* Build a custom query based on several conditions
* The pre_get_posts action gives developers access to the $query object by
reference
* any changes you make to $query are made directly to the original object -
no return value is requested
*
*/
function sy_pre_get_posts( $query ){
if( is_admin() || ! $query->is_main_query() ){
return;
}
$query->set( 'type', get_query_var( 'type' ) );
$query->set( 'people', get_query_var( 'people' ) );
$query->set( 'base', get_query_var( 'base' ) );
$query->set( 'duration', get_query_var( 'duration' ) );
if( !is_post_type_archive( 'fleet' ) ){
return;
}
$meta_query = array();
if( !empty( get_query_var( 'type' ) ) ) {
$meta_query[] = array( 'key' => 'type', 'value' => get_query_var( 'type' ), 'compare' => 'LIKE' );
} elseif ( !empty( get_query_var( 'people' ) ) ){
$meta_query[] = array( 'key' => 'people', 'value' => get_query_var( 'people' ), 'compare' => 'LIKE' );
} elseif ( !empty( get_query_var( 'base' ) ) ){
$meta_query[] = array( 'key' => 'base', 'value' => get_query_var( 'base' ), 'compare' => 'LIKE' );
} elseif ( !empty( get_query_var( 'duration' ) ) ){
$meta_query[] = array( 'key' => 'duration', 'value' => get_query_var( 'duration' ), 'compare' => 'LIKE' );
}
if( count( $meta_query ) > 1 ){
$meta_query['relation'] = 'AND';
}
if( count( $meta_query ) > 0 ){
$query->set( 'meta_query', array($meta_query) );
}
}
add_action( 'pre_get_posts', 'sy_pre_get_posts', 1 );
function sy_search_form(){
$select_type = '<select name="type" style="width: 100%">';
$select_type .= '<option value="" selected="selected">' . __( 'Type', 'syacht' ) . '</option>';
$select_type .= '<option value="Motor">' . __( 'Motor', 'syacht' ) . '</option>';
$select_type .= '<option value="Sailing">' . __( 'Sailing', 'syacht' ) . '</option>';
$select_type .= '<option value="Ribs">' . __( 'Ribs', 'syacht' ) . '</option>';
$select_type .= '<option value="Caiques">' . __( 'Caiques', 'syacht' ) . '</option>';
$select_type .= '<option value="Speed Boats">' . __( 'Spead Boats', 'syacht' ) . '</option>';
$select_type .= '</select>' . "\n";
$select_people = '<select name="people" style="width: 100%">';
$select_people .= '<option value="" selected="selected">' . __( 'People', 'syacht' ) . '</option>';
$select_people .= '<option value="3 or less">' . __( '3 or less', 'syacht' ) . '</option>';
$select_people .= '<option value="4-6">' . __( '4-6', 'syacht' ) . '</option>';
$select_people .= '<option value="6 or more">' . __( '6 or more', 'syacht' ) . '</option>';
$select_people .= '</select>' . "\n";
$select_base = '<select name="base" style="width: 100%">';
$select_base .= '<option value="" selected="selected">' . __( 'Base', 'syacht' ) . '</option>';
$select_base .= '<option value="Mykonos">' . __( 'Mykonos', 'syacht' ) . '</option>';
$select_base .= '<option value="Old Port">' . __( 'Old Port', 'syacht' ) . '</option>';
$select_base .= '</select>' . "\n";
$select_duration = '<select name="duration" style="width: 100%">';
$select_duration .= '<option value="" selected="selected">' . __( 'Duration', 'syacht' ) . '</option>';
$select_duration .= '<option value="1 to 3 days">' . __( '1 to 3 days', 'syacht' ) . '</option>';
$select_duration .= '<option value="1 week">' . __( '1 week', 'syacht' ) . '</option>';
$select_duration .= '<option value="2 weeks">' . __( '2 weeks', 'syacht' ) . '</option>';
$select_duration .= '</select>' . "\n";
$output = '<form class="advanced-search" action="' . esc_url( home_url() ) . '" method="get" role="search">';
$output .= '<div class="wrap">';
$output .= '<div>'. $select_type . '</div>';
$output .= '<div>'. $select_people . '</div>';
$output .= '<div>'. $select_base . '</div>';
$output .= '<div>'. $select_duration . '</div>';
$output .= '<input type="hidden" name="post_type" value="fleet" />';
$output .= '<div><input type="submit" id="as-submit" class="button gold full" value="Search yachts" /></div>';
$output .= '<a href="javascript:void(0)" class="search-hide" title="Hide this box">Hide this box</a>';
$output .= '</div></form>';
return $output;
}
Actually this form works, but not at all. In fact, the search page shows all posts belonging to "fleet" custom post type and they are not filtered by the search terms I set. Why this? Where is the error? Please it's been days since I've started trying to solve this. Thanks all.
P.s.: Please, do not suggest any plugin. I've tried already many, and none of them worked.