'key' meta_query not working custom advanced search (WordPress) - php

Been trying for hours now and have almost got to breaking point. Tried so many different things but can't seem to get my custom search bar to query results by a pre-defined select price range. I am using Advanced Custom Fields to add the meta tag 'investmentprice' to my custom post type called 'investments'. I feel like it's to do with WordPress not picking up the correct 'key' in my meta_query, even though I have changed this numerous times now.
Here's the code for the config bar:
<div class="config_bar cf">
<form method="get" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<input type="hidden" name="s" value="">
<input type="hidden" name="post_type" value="investments" />
<div class="col">
<?php
$taxonomy = 'type';
$args = array( 'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => true,
);
$tax_terms = get_terms($taxonomy, $args);
?>
<span class="label_inner">Investment Type</span>
<select name="type" id="type" class="postform standard">
<option value="" selected="selected">All Investment Types </option>
<?php if($tax_terms): ?>
<?php foreach ($tax_terms as $tax_term): ?>
<?php $title = $tax_term->name;
?>
<option value="<?php echo $tax_term->slug; ?>"><?php echo $title; ?></option>
<?php endforeach; ?>
<?php endif; ?>
</select>
</div><!-- col -->
<div class="col">
<span class="label_inner"><?php _e('Select Country','opencloud');?></span>
<select class="postform standard country " name="country" id="country">
<option value=""><?php _e('All Countries','opencloud');?></option>
<?php
// Display only parents here .
$terms = get_terms( array(
// Put your taxonomy name here.
'taxonomy' => 'location',
'parent' => 0,
'hide_empty' => false
) );
foreach ($terms as $term){?>
<!-- We are going to send value for $_POST and data-makeId's TERM_ID for ajax request -->
<option value="<?php echo $term->slug;?>" data-countryId="<?php echo $term->term_id ?>"><?php echo $term->name;?></option>
<?php
wp_reset_query(); // if you're not in your main loop! otherwise you can skip this
} ?>
</select>
</div><!-- col -->
<script type="text/javascript">
$( document ).ready(function() {
$('#country').change(function(){
var $mainCat= $(this).find(':selected').attr('data-countryId');
if ($mainCat != '0' ){
// call ajax
$("#city").empty();
$.ajax
(
{
url:"<?php bloginfo('wpurl'); ?>/wp-admin/admin-ajax.php",
type:'POST',
data:'action=get_city_lists_ajax&main_catid=' + $mainCat,
beforeSend:function()
{
},
success:function(results)
{
$("#loading_bar").hide();
$("#city").removeAttr("disabled").trigger('change.select2');
$("#city").append(results).trigger('change.select2');
}
}
);
}
});
});
</script>
<div class="col">
<span class="label_inner"><?php _e('Select City','opencloud');?></span>
<select class="postform standard city " name="city" id="city" disabled>
<option value="<?php echo $term->slug;?>"><?php _e('All Cities','opencloud');?></option>
</select>
</div><!-- col -->
<div class="col">
<span class="label_inner">Select Price</span>
<select class="postform standard price" name="price" id="price">
<option value="">All Prices</option>
<option value="500-1000">£500-£1000</option>
<option value="1000-1500">£1000-£1500</option>
<option value="1500-2000">£1500-£2000</option>
<option value="2000-5000">£1500-£2000</option>
<option value="5000-10000">£5000-£10,000</option>
</select>
</div><!-- col -->
<div class="col">
<button class="search_submit" type="submit">Search</button>
</div><!-- col -->
</form>
And here's my advanced search query function:
function advanced_search_query( $query ) {
if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && !is_admin() && $query->is_search && $query->is_main_query() ) {
// limit query for custom post type
$query->set( 'post_type', 'investments' );
// Get query strings from URL and store the min a variable
$_type = $_GET['type'] != '' ? $_GET['type'] : '';
$_country = $_GET['country'] != '' ? $_GET['country'] : '';
$_city = $_GET['city'] != '' ? $_GET['city'] : '';
$_price = $_GET['price'] != '' ? $_GET['price'] : '';
if( $_price != '' ) {
$metaquery = array(
array(
'key' => 'investmentprice',
'terms' => $_price,
'compare' => 'BETWEEN'
)
);
$query->set( 'meta_query', $metaquery );
}
// if type is not empty limit the taxonomy to the specified
if( $_type != '' ) {
$taxquery = array(
array(
'taxonomy' => 'type',
'field' => 'slug',
'terms' => $_type,
'operator'=> 'IN'
)
);
$query->set( 'tax_query', $taxquery );
}
// if country is not empty limit the taxonomy to the specified
if( $_country != '' ) {
$taxquery = array(
array(
'taxonomy' => 'country',
'field' => 'slug',
'terms' => $_country,
'operator'=> 'IN'
)
);
$query->set( 'tax_query', $taxquery );
}
// if city is not empty limit the taxonomy to the specified
if( $_city != '' ) {
$taxquery = array(
array(
'taxonomy' => 'city',
'field' => 'slug',
'terms' => $_city,
'operator'=> 'IN'
)
);
$query->set( 'tax_query', $taxquery );
}
return; // always return
}
}
Also, here's a screenshot of the Advanced Custom Field:

Unless there are any other issues, this should be a small fix. You are using the array key 'terms' instead of 'value' in your meta query. According to the WordPress Codex, a nested array of args for a meta query should use value, like this:
$metaquery = array(
array(
'key' => 'investmentprice',
'value' => $_price,
'compare' => 'BETWEEN'
)
);
$query->set( 'meta_query', $metaquery );
Hope that helps..

Related

Custom taxonomy archive showing all posts

I have a custom post type 'vacatures' with two custom taxonomies 'type' and 'locatie'. I created an archive page to display all the posts, but now when I view the link for all the posts belonging to a specific 'type', it just shows all the posts like the archive page.
How can I solve this, making sure I can still make the filters work?
archive-vacatures.php:
<?php get_header(); ?>
<div class="jobs__banner">
<h1><?php _e( 'VACATURES', 'ago' ) ?></h1>
</div>
<div class="vacatures__archief">
<?php
$types = get_terms([ 'taxonomy' => 'type' ]);
$locations = get_terms([ 'taxonomy' => 'locatie']);
$postsQuery = [
'order' => 'DESC',
'post_type' => 'vacatures',
'posts_per_page' => -1,
'tax_query' => []
];
if(array_key_exists('type_id', $_GET) && $_GET['type_id']) {
$postsQuery['tax_query'][] = [
'taxonomy' => 'type',
'field' => 'term_id',
'terms' => [$_GET['type_id']]
];
}
if(array_key_exists('locatie_id', $_GET) && $_GET['locatie_id']) {
$postsQuery['tax_query'][] = [
'taxonomy' => 'locatie',
'field' => 'term_id',
'terms' => [$_GET['locatie_id']]
];
}
if(array_key_exists('query', $_GET) && $_GET['query']) {
$postsQuery['s'] = $_GET['query'];
}
query_posts($postsQuery); ?>
<form class="vacature__filter">
<input type="text" name="query" placeholder="Search.." />
<select name="type_id">
<option value="">-- <?php _e( 'Alle types', 'ago' ) ?> --</option>
<?php foreach($types as $type) {
$selected = array_key_exists('type_id', $_GET) && $_GET['type_id'] == $type->term_id ? 'selected' : '';
echo "<option value='{$type->term_id}' {$selected}>{$type->name}</option>";
} ?>
</select>
<select name="locatie_id">
<option value="">-- <?php _e( 'Alle locaties', 'ago' ) ?> --</option>
<?php foreach($locations as $locatie) {
$selected = array_key_exists('locatie_id', $_GET) && $_GET['locatie_id'] == $locatie->term_id ? 'selected' : '';
echo "<option value='{$locatie->term_id}' {$selected}>{$locatie->name}</option>";
} ?>
</select>
<button type="submit">Zoek</button>
</form>
<?php if ( have_posts() ) { ?>
<?php
while ( have_posts() ) {
the_post();
?>
<article id="vacature-<?php the_ID(); ?>" <?php post_class(); ?>>
<a class="vacature__item" href="<?php the_permalink(); ?>">
<h2 class="vacature__title"><?php the_title(); ?></h2>
<h4 class="vacature__company"><?php echo get_field('vacature_bedrijf') ?> - <?php $terms = get_the_terms( $post->ID , 'type' ); $i = 1; foreach ( $terms as $term ) { $term_link = get_term_link( $term, 'type' ); if( is_wp_error( $term_link ) ) continue; echo $term->name; echo ($i < count($terms))? ", " : ""; $i++; } ?></h4>
<h6 class="vacature__location"><?php $terms = get_the_terms( $post->ID , 'locatie' ); foreach ( $terms as $term ) { echo $term->name; } ?></h6>
</a>
</article>
<?php
}
}
?>

How do I POST values to a taxonomy archive using pre_get_posts()

I have a form (a search form) on a single page. The code is below.
I wish to post the values of the form fields over to a pre_get_posts() function and then use the "properties" post type archive template (archive_properties.php) to then show the results.
I have posted my pre_get_post function below the form and I was hoping that would be sufficient.
Im getting the following error:
Warning: Invalid argument supplied for foreach() in /var/www/address/wp-admin/includes/plugin.php on line 1432
Ive got
function knoppys_search_form() { ?>
<form action="" id="propertySearch" name="propertySearch" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post" enctype="multipart/form-data" >
<div class="form-unit">
<select name="type">
<option value="">All</option>
<option value="Apartment">Apartments</option>
<option value="Villa">Villa</option>
</select>
</div>
<div class="form-unit">
<select name="location">
<?php $termsArgs = array( 'taxonomy' => 'locations' );
$terms = get_terms($termsArgs);
?>
<option value="">Location</option>
<?php foreach ($terms as $term) { ?>
<option value="<?php echo $term->term_id; ?>"><?php echo $term->name; ?></option>
<?php } ?>
</select>
</div>
<div class="form-unit">
<input type="number" min="0" name="bedfrom" placeholder="Bed From">
</div>
<div class="form-unit">
<input type="number" min="0" name="bedto" placeholder="Bed To">
</div>
<input type="hidden" name="action" value="">
<button class="btn btn-primary" type="submit"><i class="fa fa-search"></i> Submit</button>
function knoppys_pre_get_filter() {
if (!is_admin() && is_archive('properties')) {
$location = $_POST['location'];
$type = $_POST['type'];
$bedfrom = $_POST['bedfrom'];
$bedto = $_POST['bedto'];
//Get the correct location
$tax_query = array(
'taxonomy' => 'locations',
'field' => 'id',
'terms' => $location
);
$query->set( 'tax_query', $tax_query );
//Get the correct type
$meta_query = array(
'relation' => 'AND',
array(
'meta_key' => 'type_name',
'value' => $type
),
array(
'meta_key' => 'number_of_beds',
'value' => array($bedfrom, $bedto),
'type' => 'numeric',
'compare' => 'BETWEEN',
)
);
$query->set( 'meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'knoppys_pre_get_filter');

WP Job manager Location dropdown

Im using the WP Job Manager plug on my website. On the home page im using the Hero search filter that has the location search input, that is a text input at the moment but I would like to change it to a dropdown with set options. I've been able to easily change the location text input to a dropdown with the chosen options.
I hit search, nothing changes in the job listings below.
I've tried to change the way the input is handled in the source files but with no luck. When i output the result of the 'Location' input on the job listing page but it keeps coming back as an empty field.
I have no idea what els to try to accomplish the desired result any more so any help or input would be appreciated.
The code below is how my part-job-filters.php code.
<?php
if ( ! class_exists( 'WP_Job_Manager' ) ) {
return;
}
$keywords = '';
$location = array();
$selected_category = array();
if ( ! empty( $_GET['search_keywords'] ) ) {
$keywords = sanitize_text_field( $_GET['search_keywords'] );
}
// Old Location input field
// if ( ! empty( $_GET['search_location'] ) ) {
// $location = sanitize_text_field( $_GET['search_location'] );
// }
if ( ! empty( $_GET['search_location'] ) ) {
$location = absint( $_GET['search_location'] );
}
if ( ! empty( $_GET['search_category'] ) ) {
if ( is_array( $_GET['search_category'] ) ) {
$selected_category = absint( reset( $_GET['search_category'] ) );
} else {
$selected_category = absint( $_GET['search_category'] );
}
$_GET['search_category'] = $selected_category;
}
if ( is_tax( 'job_listing_category' ) ) {
$term = get_queried_object();
$_GET['search_category'] = $selected_category = array( $term->term_id );
}
?>
<div class="form-filter">
<div class="form-filter-header">
×<span class="sr-only"> <?php esc_html_e( 'Dismiss filters', 'specialty' ); ?></span>
</div>
<?php
$has_categories = true;
$count = wp_count_terms( 'job_listing_category', array(
'hide_empty' => 1, // Hide empty, as they are not displayed by the dropdown anyway.
) );
if ( is_wp_error( $count ) || 0 === intval( $count ) || is_tax( 'job_listing_category' ) ) {
$has_categories = false;
}
$col_classes = array(
'keywords' => 'col-lg-3 col-xs-12',
'location' => 'col-lg-3 col-xs-12',
'category' => 'col-lg-3 col-xs-12',
'button' => 'col-lg-3 col-xs-12',
);
if ( ! get_option( 'job_manager_enable_categories' ) || ! $has_categories ) {
$col_classes = array(
'keywords' => 'col-lg-4 col-xs-12',
'location' => 'col-lg-4 col-xs-12',
'category' => '',
'button' => 'col-lg-3 push-lg-1 col-xs-12',
);
}
?>
<div class="container">
<div class="row">
<div class="<?php echo esc_attr( $col_classes['keywords'] ); ?>">
<label for="job-keywords" class="sr-only"><?php esc_html_e( 'Job Keywords', 'specialty' ); ?></label>
<input type="text" id="job-keywords" name="search_keywords" placeholder="<?php esc_attr_e( 'Keywords', 'specialty' ); ?>" value="<?php echo esc_attr( $keywords ); ?>">
</div>
<div class="<?php echo esc_attr( $col_classes['location'] ); ?>">
<label for="job-location" class="sr-only"><?php esc_html_e( 'Job Location', 'specialty' ); ?></label>
<div class="ci-select">
<select name="search_location" id="job-location" data-no_results_text="No results match" data-multiple_text="Select Some Options">
<option value="0">Select a location</option>
<option value="Eastern Cape">Eastern Cape</option>
<option value="Free State">Free State</option>
<option value="Gauteng">Gauteng</option>
<option value="kwazulu natal">kwazulu natal</option>
<option value="Limpopo">Limpopo</option>
<option value="Mpumalanga">Mpumalanga</option>
<option value="North West">North West</option>
<option value="Northern Cape">Northern Cape</option>
<option value="Western Cape">Western Cape</option>
<option value="Africa">Africa</option>
<option value="International">International</option>
<option value="All locations">All locations</option>
</select>
</div>
</div>
<?php if ( get_option( 'job_manager_enable_categories' ) && $has_categories ) : ?>
<div class="<?php echo esc_attr( $col_classes['category'] ); ?>">
<label for="job-category" class="sr-only"><?php esc_html_e( 'Job Category', 'specialty' ); ?></label>
<div class="ci-select">
<?php
$multiple = get_option( 'job_manager_enable_default_category_multiselect' );
job_manager_dropdown_categories( array(
'taxonomy' => 'job_listing_category',
'hierarchical' => 1,
'show_option_all' => $multiple ? false : esc_html__( 'Any category', 'specialty' ),
'name' => 'search_category',
'orderby' => 'name',
'selected' => $selected_category,
'multiple' => $multiple,
) );
?>
</div>
</div>
<?php endif; ?>
<div class="<?php echo esc_attr( $col_classes['button'] ); ?>">
<button class="btn btn-block btn-jobs-filter" type="submit"><?php esc_html_e( 'Search', 'specialty' ); ?></button>
</div>
</div>
</div>
</div>
I might be approaching this the wrong way, if so please could someone advise what the right way is of approaching this.
Replace id in select element, id="job-location" to id="search_location".

Woocommerce Product Search with Taxonomy

Hi have a search form that is allows the user to input a keyword then select a taxonomy via dropdown list. This is my form:
<form name="myCity" id="myCity" action="http://mywebsite.com/" method="post">
<div class="search-area">
<div class="container">
<div class="row-fluid">
<div class="span4">
<label><i class="icon-search"></i></label>
<div class="search-area-division search-area-division-input">
<input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" placeholder="I am searching for..."/>
</div>
</div>
<div class="span3">
<label><i class="icon-map-marker"></i></label>
<?php
$args = array('taxonomy' => 'pa_city');
wp_dropdown_categories( $args );
?>
</div>
</div>
<noscript><input type="hidden" onclick="WriteCookie()" class="btn btn-block btn-white search-btn" value="<?php echo esc_attr__( 'Search' ); ?>"/></noscript>
<input type="hidden" name="post_type" value="product" />
</div>
</div>
If I search mini-golf in Bullhead City,
it returns the URL:
http://mywebsite.com/?s=mini-golf&cat=14&post_type=product
While it returns products with the tag mini-golf, it returns all products regardless of city that match mini-golf. I have tried many ways to filter the results and am just spinning my wheels at this point.
The taxonomy I am using is pa_city. Even if the url is
http://mywebsite.com/?s=mini-golf&pa_city=bullhead-city&post_type=product
it does the same thing.
No matter which way I write this, it will NOT exclude the other cities in the search. Should I try a NOTIN? I can't figure out why it brings all products regardless of city...
I needed to filter the query further in my functions.php using pre_get_posts
Whew, that was a frustrating one.
function my_location( $q ){
if (!$q->is_main_query() )
return;
if ($q->is_search()) {
$city = isset( $_COOKIE['city'] ) ? $_COOKIE['city'] : 'not set';
$q->set( 'tax_query', array(array( 'taxonomy' => 'pa_city', 'field' => 'slug', 'terms' => array( $city ), 'operator' => 'IN' )));
return;
}
if ($q->is_archive() ){
if ( ! is_admin() ) {
if (empty($_COOKIE['city'] )) {
echo "<script>window.location.href = 'http://mywebsite.com/select-city/';</script>";
exit();
}
$city = isset( $_COOKIE['city'] ) ? $_COOKIE['city'] : 'not set';
$q->set( 'tax_query', array(array( 'taxonomy' => 'pa_city', 'field' => 'slug', 'terms' => array( $city ), 'operator' => 'IN' )));
}}
}
add_action( 'pre_get_posts', 'my_location' );

Search custom post type by year

I've created a more advanced search for the standard Wordpress search. To go along with the keyword text input I've added two drop downs that are searching my custom taxonomies.
This is working great.
The only dropdown I've yet to create the functionality for is the year dropdown. I'd like to be able to filter the results to show posts within that specific year.
How can I search through all the posts and only output the custom posts that were published for that year?
It's important that the posts are searched for by their publish date (ie. no custom fields!).
<form action="<?php echo home_url( '/' ); ?>" method="get" id="advanced-search">
<div id="search-nudge">
<h1 id="search-title">Search Policy's</h1>
<p id="search-strap">Search by some or all of the following criteria</p>
<div class="clear"></div>
<div id="search-left">
<p class="search-label">Keyword</p>
<input type="text" name="s" id="s" class="keyword" value="<?php the_search_query(); ?>" />
<input type="hidden" value="policies" name="post_type" id="post_type" /><br /><br />
</div>
<div id="search-right">
<p class="search-label">Year of publication</p>
<select class="work-list search-dropdown" name="year">
<option value="">All</option>
</select>
<div class="clear"></div>
</div>
<div class="clear"></div>
<div class="search-element">
<?php // List all event subjects
$subjectList = get_terms('topics', array( 'taxonomy' => 'topics' ));
if(!empty($subjectList)) { ?>
<p class="search-label">Category</p>
<select class="work-list search-dropdown" name="subject">
<option value="">All</option>
<?php foreach($subjectList as $subject){
if(isset($_GET['subject'])) {
$selected = ($subject->slug == $_GET['subject']) ? ' selected="selected"' : '';
}
echo '<option value="' . $subject->slug . '"'. $selected.'> ' . $subject->name . '</option>';
}
echo '</select><br /><br />';
} ?>
</div>
<div class="search-element">
<?php // list all event types
$document = get_terms('document_type', array( 'taxonomy' => 'document_type' ));
if(!empty($subjectList)) { ?>
<p class="search-label">Document Type</p>
<select class="work-list search-dropdown search-dropdown-right" name="type">
<option value="">All</option>
<?php foreach($document as $type){
if(isset($_GET['type'])) {
$selected = ($type->slug == $_GET['type']) ? ' selected="selected"' : '';
}
echo '<option value="' . $type->slug . '"'. $selected.'> ' . $type->name . '</option>';
}
echo '</select><br /><br />';
} ?>
</div>
<input type="radio" name="sort" class="search-input" value="date" checked> <p class="search-label radio radio-nudge">Order by date</p>
<input type="radio" name="sort" class="search-input" value="title"> <p class="search-label radio">Order by title</p>
<input type="submit" id="searchsubmit2" class="search-submit" value="Search" />
<div class="clear"></div>
</div>
</form>
<?php if(isset($_GET['sort']) && $_GET['sort'] === "date") {
$sort = $_GET['sort'];
$order = "DESC";
} else {
$sort = $_GET['sort'];
$order = "ASC";
}
// default args to search by custom post type and search term
$args = array(
'post_type' => 'policies',
'posts_per_page' => 10,
'orderby' => $sort,
'order' => $order,
's' => $s
);
// add the subject to args if there is one
if(isset($_GET['subject']) && $_GET['subject'] != "") {
$args['tax_query'][1] = array(
'taxonomy' => 'topics',
'field' => 'slug',
'terms' => array($_GET['subject'])
);
}
// add the subject to args if there is one
if(isset($_GET['type']) && $_GET['type'] != "") {
$args['tax_query'][1] = array(
'taxonomy' => 'document_type',
'field' => 'slug',
'terms' => array($_GET['type'])
);
}
// Run the query
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
the_title();
the_content();
}
} else {
echo "No results";
}
/* Restore original Post Data */
wp_reset_postdata(); ?>
Update:
I've tried the following but no luck displaying any posts.
if(isset($_GET['year']) && $_GET['year'] != "") {
$args = array(
'date_query' => array(
array(
'year' => array($_GET['year'])
),
),
);
}
Solved with:
if(isset($_GET['year']) && $_GET['year'] != "") {
$args = array(
'post_type' => 'policies',
'posts_per_page' => 10,
'orderby' => $sort,
'order' => $order,
's' => $s,
'date_query' => array(
array(
'year' => ($_GET['year'])
),
),
);
} else {
// default args to search by custom post type and search term
$args = array(
'post_type' => 'policies',
'posts_per_page' => 10,
'orderby' => $sort,
'order' => $order,
's' => $s
);
}

Categories