Replies: 0
Hi all,
I created an advanced search form that retrieves custom posts by their meta tags. The search works, except for two issues I cannot manage to solve.
The first is the search page’s template: wordpress lists all post in an archive page (with its template), while I would like to show them in a page that has a template of my choice.
The second issue is related to empty query: if none of the fields is selected, the search page returns me 10 posts chosen by criteria I cannot understand. I’d like it to show me a page with all posts of the given post type. Is it possible?
Thanks for any help.
This is the code for the advanced search form:
<?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;
}
- This topic was modified 13 minutes ago by luizbriganti.