On my blogI tried sucessfully to make a research for articles titles and content, but after I tried to make a research for custom taxonomy of articles 'categories' with meta_query() and REGEXP, didn't work.
My form :
<div class="zone_filters">
<form action="" method="GET">
<input type="hidden" name="page_id" value="249" />
<input type="text" name="search_input" />
<select name="type">
<option value="title">titre et texte</option>
<option value="category">catégorie</option>
</select>
<select name="orderby">
<option value="DESC">plus récent</option>
<option value="ASC">plus ancien</option>
</select>
<button type="submit">OK</button>
</form>
</div>
My arguments :
<?php
$orderby = 'DESC';
if($_GET['orderby']) {
$orderby = $_GET['orderby'];
}
$args = array(
'post_type' => 'article',
'posts_per_page' => 3,
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
'orderby' => array('date' => $orderby)
);
if($_GET['type'] == 'title') {
$args['s'] = $_GET['search_input'];
}
elseif($_GET['type'] == 'category') {
$value = '^[a-zA-Z|\s]*(' . strtoupper( $_GET['search_input']) . '|' . strtolower( $_GET['search_input']) . ')[a-zA-Z|\s]*$';
$args['meta_query'] = array(array('key' => 'categories', 'value' => $value, 'compare' => 'REGEXP'));
}
$query = new WP_Query($args);?>
I learned it from the Codex
and I can't found the differences between my code and the doc.
Use tax query for category.
$args['tax_query'] = array(array('taxonomy' => 'categories', 'field' => 'slug', 'terms' => $value));
as per your html
<div class="zone_filters">
<form action="" method="GET">
<input type="hidden" name="page_id" value="249" />
<input type="text" name="search_input" />
<select name="type">
<option value="">titre et texte</option>
<option value="category-1">Category 1</option>
<option value="category-2">Category 2</option>
<option value="category-3">Category 3</option>
</select>
<select name="orderby">
<option value="DESC">plus récent</option>
<option value="ASC">plus ancien</option>
</select>
<button type="submit">OK</button>
</form>
</div>
<?php
$orderby = 'DESC';
if($_GET['orderby']) {
$orderby = $_GET['orderby'];
}
$args = array(
'post_type' => 'article',
'posts_per_page' => 3,
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
'orderby' => array('date' => $orderby)
);
if($_GET['type'] == 'title') {
$args['s'] = $_GET['search_input'];
}
elseif($_GET['type'] == 'category') {
$value = '^[a-zA-Z|\s]*(' . strtoupper( $_GET['search_input']) . '|' . strtolower( $_GET['search_input']) . ')[a-zA-Z|\s]*$';
$args['tax_query'] = array(array('taxonomy' => 'categories', 'field' => 'slug', 'terms' => $value));
}
$query = new WP_Query($args);?>
It's working this way :
Form :
<div class="zone_filters">
<form action="" method="GET">
<input type="hidden" name="page_id" value="249" />
<input type="text" name="search_input" />
<select name="categories">
<?php $allterms = get_terms('categories');
foreach($allterms as $term) : ?>
<option value="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
<?php endforeach ?>
</select>
<select name="orderby">
<option value="DESC">plus récent</option>
<option value="ASC">plus ancien</option>
</select>
<button type="submit">OK</button>
</form>
</div>
The arguments :
<?php
$orderby = 'DESC';
if($_GET['orderby']) {
$orderby = $_GET['orderby'];
}
$args = array(
'post_type' => 'article',
'posts_per_page' => 3,
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
'orderby' => array('date' => $orderby)
);
if($_GET['search_input'] != '') {
$args['s'] = $_GET['search_input'];
}
elseif($_GET['categories']) {
$args['categories'] = $_GET['categories'];
}
$query = new WP_Query($args);?>
Related
Just started learning about filtering custom queries in Wordpress. I want to be able to filter through products (custom post types) by their taxonomies. I am able to get this working sort of. The problem is that when I apply more than one filter, only the last on works. I'm assuming the last one cancels the others out? How can I make all filters work simultaneously? Any help would be much appreciated!
sidebar.php:
<aside data-css-sidebar="sidebar">
<form data-js-form="filter">
<h3>Filter <?php echo ucfirst($type); ?></h3>
<fieldset style='display:none'>
<label name='product-category' for="product-category"><input id='product-category' name='product-category' value=<?php echo $cat_id; ?>></label>
</fieldset>
<fieldset>
<label for="product-prices">Prices</label>
<?php
$prices = get_terms(array(
'taxonomy' => 'price',
'hide_empty' => false,
));
?>
<select id="product-price" name="product-price">
<option>Search by Price</option>
<?php foreach ($prices as $price) : ?>
<option value="<?= $price->term_id; ?>"><?= $price->name; ?></option>
<?php endforeach; ?>
</select>
</fieldset>
<fieldset>
<label for="product-brand">Brands</label>
<?php
$prices = get_terms(array(
'taxonomy' => 'brands',
'hide_empty' => false,
));
?>
<select id="product-brand" name="product-brand">
<option>Search by Brand</option>
<?php foreach ($prices as $price) :
?>
<option value="<?= $price->term_id; ?>"><?= $price->name; ?></option>
<?php endforeach; ?>
</select>
</fieldset>
<fieldset>
<label>Colors</label>
<?php
$colors = get_terms(array(
'taxonomy' => 'color',
'hide_empty' => false,
));
foreach ($colors as $color) :
?>
<div>
<input type="checkbox" id="<?= $color->slug; ?>" name="product-colors[]" value="<?= $color->term_id; ?>"><label for="<?= $color->slug; ?>"><?= $color->name; ?></label>
</div>
<?php endforeach; ?>
</fieldset>
<fieldset>
<button>Filter</button>
<input type="hidden" name="action" value="filter">
</fieldset>
</form>
</aside>
filter.php:
<?php
add_action('wp_ajax_nopriv_filter', 'filter_ajax');
add_action('wp_ajax_filter', 'filter_ajax');
function filter_ajax()
{
$product_cat = $_POST['product-category'];
$product_color = $_POST['product-colors'];
$product_price = $_POST['product-price'];
$product_brand = $_POST['product-brand'];;
$args = array(
'post_type' => 'products',
'posts_per_page' => -1,
'cat' => $product_cat,
);
if (isset($product_price) && !empty($product_price)) {
$args['tax_query'] = array(
array(
'taxonomy' => 'price',
'field' => 'term_id',
'terms' => array($product_price)
),
);
}
if (isset($product_brand) && !empty($product_brand)) {
$args['tax_query'] = array(
array(
'taxonomy' => 'brands',
'field' => 'term_id',
'terms' => array($product_brand)
)
);
}
if (isset($product_color) && !empty($product_color)) {
$args['tax_query'] = array(
array(
'taxonomy' => 'color',
'field' => 'term_id',
'terms' => $product_color
)
);
}
$query = new WP_Query($args);
// start the loop
if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
$no_img = get_field('no_image', 'options')['url'];
?>
<div class="card mx-4 mx-md-2 mx-xl-4">
<div class="card__inner">
<?php if (has_post_thumbnail()) { ?>
<img src="<?php the_post_thumbnail_url(); ?>" alt="" />
<?php } else {
?>
<img src="<?php echo $no_img ?>" alt="no-image" />
<?php } ?>
<h6 class="mt-3"><?php the_title(); ?></h6>
<p>$ <?php echo get_field('price'); ?></p>
</div>
</div>
<?php endwhile;
else : ?>
<div>
<p>No items found</p>
</div><?php
endif; ?>
<?php wp_reset_query();
die();
}
script.js
$.noConflict();
$(document).ready(function () {
//ajax filtering
$(document).on("submit", "[data-js-form=filter]", function (e) {
e.preventDefault();
let data = $(this).serialize();
$.ajax({
url: "/wp-admin/admin-ajax.php",
data: data,
type: "post",
success: function (result) {
console.log(result);
$("#target").html(result);
},
error: function (result) {
console.warn("error :" + result);
},
});
});
})
Try changing to something like the following
if (isset($product_color) && !empty($product_color)) {
$args['tax_query'][] = array(
'taxonomy' => 'color',
'field' => 'term_id',
'terms' => $product_color
);
}
And the same for the others
You might also need to change this (adding the tax_query)
$args = array(
'post_type' => 'products',
'posts_per_page' => -1,
'cat' => $product_cat,
'tax_query' => ['relation' => 'or']
);
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..
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');
I'm trying to allow users to filter wordpress posts based on the values in an ACF checkbox field. So I have an options form:
<form name="SelectDigit" method="post">
<select name="Digit">
<option></option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<input type="submit" value="Filter posts" />
</form>
Which passes through a value:
<?php $SelectedDigit = $_POST["Digit"]; ?>
To my WP Query:
if (isset($_POST["Digit"]) && !empty($_POST["Digit"])){
//args
$args = array(
'numberposts' => -1,
'post_type' => 'post',
'meta_key' => 'checkbox',
'meta_value' => $SelectedDigit,
'compare' => 'IN',
);
$wp_query = new WP_Query($args);
if( $wp_query->have_posts() ):
while( $wp_query->have_posts() ) : $wp_query->the_post();
the_field('title');
endwhile;
endif;
}?>
It doesn't work. However, I also have a radio button ACF field. When I change my args to:
$args = array(
'numberposts' => -1,
'post_type' => 'post',
'meta_key' => 'radio',
'meta_value' => $SelectedDigit,
'compare' => '=',
);
It works fine for radio fields. What's the difference? How can I get it work on checkboxes? I've asked ACF support, but they're not being very helpful... Thanks!
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
);
}