We have set up custom post types for real estate properties and a search form to search through these custom post types using price, city, newest, etc. We are using query variable strings/if statements to display the results, but we are having trouble with the sort options. We have three sort options in place : Newest, Price Low-High, and Price High-Low.
When the default results are displayed, the sort does not work correctly, but when a city is set in the search dropdown, the sort works perfectly.
For the city search, we have this code in place:
if (isset($_POST['city'])) {
$qs_city = get_query_var('city');
}
else {
$qs_city = " ";
I believe that this is due to the else portion of the code above. We need some sort of wildcard that allows all cities listed to be listed if a city is not set. We have tried several different things, but nothing seems to work. I'm fairly new to this, so I can better clarify any of the above, if necessary.
This is the code used to sort:
if (isset($_POST['sort'])) {
$qs_sort = get_query_var('sort');
switch ($qs_sort) {
case 'newest':
$args = array(
'post_type' => 'residential',
'posts_per_page' => 10,
'paged' => $paged,
'orderby' => 'L_StatusDate',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'L_City',
'value' => $qs_city,
'compare' => 'LIKE'
),
array(
'key' => 'L_SystemPrice',
'value' => array( $qs_price_min, $qs_price_max ),
'type' => 'numeric',
'compare' => 'BETWEEN'
),
array(
'key' => 'LM_Int1_2',
'value' => $qs_beds,
'compare' => '>='
),
array(
'key' => 'LM_Int1_3',
'value' => $qs_baths,
'compare' => '>='
)
)
);
break;
case 'price-low':
$args = array(
'post_type' => 'residential',
'posts_per_page' => 10,
'paged' => $paged,
'orderby' => 'L_SystemPrice',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'L_City',
'value' => $qs_city,
'compare' => 'LIKE'
),
array(
'key' => 'L_SystemPrice',
'value' => array( $qs_price_min, $qs_price_max ),
'type' => 'numeric',
'compare' => 'BETWEEN'
),
array(
'key' => 'LM_Int1_2',
'value' => $qs_beds,
'compare' => '>='
),
array(
'key' => 'LM_Int1_3',
'value' => $qs_baths,
'compare' => '>='
)
)
);
break;
case 'price-high':
$args = array(
'post_type' => 'residential',
'posts_per_page' => 10,
'paged' => $paged,
'orderby' => 'L_SystemPrice',
'order' => 'DESC',
'meta_query' => array(
//'relation' => 'AND',
array(
'key' => 'L_City',
'value' => $qs_city,
'compare' => 'LIKE'
),
array(
'key' => 'L_SystemPrice',
'value' => array( $qs_price_min, $qs_price_max ),
'type' => 'numeric',
'compare' => 'BETWEEN'
),
array(
'key' => 'LM_Int1_2',
'value' => $qs_beds,
'compare' => '>='
),
array(
'key' => 'LM_Int1_3',
'value' => $qs_baths,
'compare' => '>='
)
)
);
break;
}
}
else {
$args = array(
'post_type' => 'residential',
'posts_per_page' => 10,
'paged' => $paged,
'meta_query' => array(
//'relation' => 'AND',
array(
'key' => 'L_StatusDate',
'orderby' => 'DESC'
//set default to sort by newest
),
array(
'key' => 'L_City',
'value' => $qs_city,
'compare' => 'LIKE'
),
array(
'key' => 'L_SystemPrice',
'value' => array( $qs_price_min, $qs_price_max ),
'type' => 'numeric',
'compare' => 'BETWEEN'
),
array(
'key' => 'LM_Int1_2',
'value' => $qs_beds,
'compare' => '>='
),
array(
'key' => 'LM_Int1_3',
'value' => $qs_baths,
'compare' => '>='
)
)
);
}
?>
The main question for your situation is "what kind of application will sort the results?". It looks like you use some kind on database. But which one? If it's SQL-like database, - just replace $qs_city = " " with $qs_city = "%";
Related
$tax_query = array(
array(
'taxonomy' => 'category',
'field' => 'id',
'terms' => $ajs_cat,
)
);
$args = array(
'post_type' => 'post',
'orderby' => 'menu_order',
'posts_per_page' => $per_page,
'paged' => $paged,
'tax_query' => $tax_query,
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'price_min',
'value' => array($min_price, $max_price),
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
),
array(
'key' => 'price_max',
'value' => array($min_price, $max_price),
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
),
)
);
I am trying to return acts based on a searched budget minimum (price_min) and maximum (price_max).
So if act 'X' has a minimum fee of 3000 (price_min) and a maximum fee of 6000 (price_max)
Search A: ('X' is in results)
I search with a budget of minimum of 3000 ($min_price) and a maximum of 5500 ($max_price) i get 'X' returned in the results.
Search B: ('X' is not in results)
I search with a budget of minimum of 3500 ($min_price) and a maximum of 5500 ($max_price) i would expect to see 'X' returned in the results as i could still afford him given my budget.
I need 'X' to return in both instances
Could someone help point me in the right direction?
shouldn't it be
array(
'key' => 'price_min',
'value' => $min_price,
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
),
array(
'key' => 'price_max',
'value' => $max_price,
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
If you selected both minimum and maximum price than your query like ::
array(
'key' => 'meta_key_min_price',
'value' => array( $min_p, $max_p ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
array(
'key' => 'meta_key_max_price',
'value' => array( $min_p, $max_p ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
If you select only one of them than your query look like this ::
For Minimum
array(
'key' => 'meta_key_min_price',
'value' => $min_p,
'type' => 'numeric',
'compare' => '>=',
),
For Maximum
array(
'key' => 'meta_key_max_price',
'value' => $min_p,
'type' => 'numeric',
'compare' => '<=',
),
$tax_query = array(
array(
'taxonomy' => 'category',
'field' => 'id',
'terms' => $ajs_cat,
)
);
$args = array(
'post_type' => 'post',
'orderby' => 'menu_order',
'posts_per_page' => $per_page,
'paged' => $paged,
'tax_query' => $tax_query,
'meta_query' => array(
array(
'key' => 'price_min',
'value' => $min_price,
'compare' => '>='
),
array(
'key' => 'price_max',
'value' => $max_price,
'compare' => '<='
),
)
);
I want to display popular post in custom page , I have added post views and post like option in wordpress and I want to show popular posts based views and likes,
I tried this code but it's ranking only for views counter ;
$args = array(
'posts_per_page'=>5,
'orderby' => 'meta_value',
'order' => 'DESC',
'meta_query' => array(
'relation' => 'AND',
'_post_views' => array(
'key' => '_post_views',
'type' => 'NUMERIC',
'compare' => 'LIKE'
),
'_post_like_count' => array(
'key' => '_post_like_count',
'type' => 'NUMERIC',
'compare' => 'LIKE'
),
),
);
thanks for answers
Try new orderby feature:
$args = array(
'posts_per_page' => 5,
'meta_query' => array(
'relation' => 'AND',
'_post_views' => array(
'key' => '_post_views',
'type' => 'NUMERIC',
'compare' => 'LIKE'
),
'_post_like_count' => array(
'key' => '_post_like_count',
'type' => 'NUMERIC',
'compare' => 'LIKE'
),
),
'orderby' => array(
'_post_views' => 'DESC',
'_post_like_count' => 'DESC'
)
);
I have the below PHP:-
$args = array(
'posts_per_page'=> -1,
'post_type' => 'jobs',
'order' => 'ASC',
's' => $search_field,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'job_salary_from',
'value' => $job_salary_from,
'compare' => '>=',
),
array(
'key' => 'job_salary_from',
'value' => $job_salary_to,
'compare' => '<=',
),
array(
'relation' => 'OR',
array(
'key' => 'job_salary_to',
'value' => $job_salary_from,
'compare' => '>=',
),
array(
'key' => 'job_salary_to',
'value' => $job_salary_to,
'compare' => '<=',
),
))
);
Lets say there is a job that is from 19000 to 22000 called 'ABC', so
job_salary_from = 19000
and job_salary_to = 22000.
Now lets say I search a job that is between 10000 and 19000, so $job_salary_from = 10000 and $job_salary_to = 19999.
This shows up when I do a search which is correct. However, if I search for a job that is between 20000 and 29999, so $job_salary_from = 19999 and $job_salary_to = 29999 nothing is showing up.
Where as the job 'ABC' should show up because $job_salary_to is within the search bracket.
Any help would be much appreciated.
I think the meta_query syntax is not quite right. Try this:
$args = array(
'posts_per_page'=> -1,
'post_type' => 'jobs',
'order' => 'ASC',
's' => $search_field,
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'key' => 'job_salary_to',
'value' => $job_salary_from,
'type' => 'numeric', //for each case
'compare' => '>=',
),
array(
'key' => 'job_salary_to',
'value' => $job_salary_to,
'type' => 'numeric',
'compare' => '<=',
),
),
array(
'relation' => 'AND',
array(
'key' => 'job_salary_from',
'value' => $job_salary_from,
'type' => 'numeric',
'compare' => '>=',
),
array(
'key' => 'job_salary_from',
'value' => $job_salary_to,
'type' => 'numeric',
'compare' => '<=',
),
)
)
);
Also you can try to use BETWEEN, even I am not sure if this is inclusive or exclusive compare.
that is because there is a different function to fetch results in between a range.
Try the following example to fetch results in between a range
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
);
$query = new WP_Query( $args );
More resources here https://codex.wordpress.org/Class_Reference/WP_Query
In wordpress I have only publish_date(not meta_key) and meta_key "end_date"
Example: event from 2015-06-22(publish_date) to 2015-08-24(meta_ket = "end_date")
now I want search all events
(from 2015-07-05 to 2015-07-24)
or
(from 2015-08-05 to 2015-09-25)
and must show event in example
This code not work:
$opt = array(
'post_type' => 'event_info',
'posts_per_page' => '40',
'paged' => $page_num,
'orderby' => 'post_date ID',
'order' => 'DESC',
'relation' => 'OR',
'meta_query' => array(
'key' => 'end_date',
'value' => array('$date_start','$date_end'),
'compare' => 'BETWEEN',
'type' => 'numeric'),
'date_query' => array(
array(
......
'compare' => 'BETWEEN',
),
),
)
);
relation between meta key and data_query not work,
current idea is create 2 query but I dont want do this
try this : here I added timestamp in startdate and enadate meta key
$chkdt = current_time('timestamp');
$args = array('post_type'=>'event_info', 'post_status' => 'publish','posts_per_page'=>-1,'orderby' => 'ID','order' => 'DESC', 'meta_query' =>
array(
'relation' => 'AND',
/******filter start date and End date****************/
array(
'key' => 'end_date',
'value' => $chkdt,
'compare' => '>=',
'type' => 'NUMERIC',
),
array(
'key' => 'start_date',
'value' => $chkdt,
'compare' => 'NUMERIC',
),
/******END filter start date and End date****************/
),
);
I have this code:
$args3 = array(
'post_type' => 'imoveis_a_venda',
'cat' => $categoria,
'meta_query' => array(
array(
'key' => 'valor',
'value' => array($amount1,$amount2),
'compare' => 'BETWEEN',
'type' => 'NUMERICAL'
),
)
);
to values between 0 and 999.999,00 works perfectly.
But when passes 1 million does not work.
Set type in meta_query to SIGNED.
$args3 = array(
'post_type' => 'imoveis_a_venda',
'cat' => $categoria,
'meta_query' => array(
array(
'key' => 'valor',
'value' => array($amount1,$amount2),
'compare' => 'BETWEEN',
'type' => 'SIGNED'
),
)
);