Wordpress meta_query multiple fields search NOT working - php

I have this piece of code and it works just fine:
$search = array(
'meta_query' => array(
array(
'key' => 'wpcf-community-city',
'value' => $search_param,
'compare' => 'LIKE'
)
)
);
But when I change to this, it stops working.
$search = array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'wpcf-community-city',
'value' => $search_param,
'compare' => 'LIKE'
),
array(
'key' => 'wpcf-community-state',
'value' => $search_param,
'compare' => 'LIKE'
),
array(
'key' => 'wpcf-community-zip',
'value' => $search_param,
'compare' => 'LIKE'
)
)
);
I'm using Wordpress 3.4.2
PS: This piece of code is a part of the query_posts() parameters.

Why u dont use WP_Query ?
U need use the 'relation' parameter ?
Use this example.. its work:
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'type' => 'CHAR',
'compare' => '=' //'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'
),
array(
'key' => 'price',
'value' => array( 1,200 ),
'compare' => 'NOT LIKE'
)
),

Related

How to build an array for a WP_User_Query

I have an array:
$args = array(
'orderby' => 'meta_value',
'meta_key' => $columnName,
'order' => $columnOrder,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'shipping_company',
'value' => '^'.$prospectSearch,
'compare' => 'REGEXP',
),
array(
'key' => 'shipping_company',
'value' => '---NV',
'compare' => 'NOT LIKE',
),
array(
'key' => 'shipping_company',
'value' => '---DS',
'compare' => 'NOT LIKE',
),
array(
'key' => 'customer_status',
'value' => '1',
'compare' => '=',
),
),
);
Along with that I also need to search the user_meta table for many many zip codes in a loop like this:
$args['meta_query'][]=array(
'relation' => 'OR',
);
foreach($zips as $zip) {
$args['meta_query'][]=array(
array(
'key' => 'shipping_postcode',
'value' => $zip,
'compare' => '=',
),
);
}
The problem is that the 'OR' in the zip code portion always gets changed to an 'AND'. I feed this array to WP_User_Query like this:
$wpUserQuery = new WP_User_Query($args);
I use the following line to get the SQL:
$wpUserQuery->request;
I went a different route. Rather than using WP_User_Query I am going the build the SQL string manually and optimize it.

Slow speed Search Query WordPress

I have this query when I decrease filters its become fast but as I increase filters its become too slow, Please I need to make it fast with all these filters.
As my details are clears but I am writing some lines because its does not allow me to post my Question
$args = array('post_type' => 'property', 'posts_per_page' => 1,'order' => 'asc',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'facilityname',
'value' => $_GET['keyword'],
'compare' => 'LIKE'
),
array(
'key' => 'city',
'value' => $_GET['city'],
'compare' => 'LIKE'
),
array(
'key' => 'facilitytype',
'value' => $_GET['facilitytype'],
'compare' => 'LIKE'
),
array(
'key' => 'hospitaltype',
'value' => $_GET['hospitaltype'],
'compare' => 'LIKE'
),
array(
'key' => 'state',
'value' => $_GET['state'],
'compare' => 'LIKE'
),
array(
'key' => 'idn',
'value' => $_GET['idn'],
'compare' => 'LIKE'
),
array(
'key' => 'gpoaffiliations',
'value' => $_GET['gpoaffiliations'],
'compare' => 'LIKE'
),
array(
'key' => 'bedcounttotal',
'value' => array($_GET['min-bedcounttotal'], $_GET['max-bedcounttotal']),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
),
array(
'key' => 'zipcode',
'value' => array($_GET['minzipcode'], $_GET['maxzipcode']),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
),
array(
'key' => 'operatingroomcount',
'value' => array($_GET['minoperatingroomcount'], $_GET['maxoperatingroomcount']),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
),
)
);
Finally I found a solution, I am sharing it here for other may have same problem Like me
$meta_query = array();
$args = array();
$args = array('posts_per_page' => -1,);
$meta_query[] = array(
'key' => 'facilityname',
'value' => $_GET['keyword'],
'compare' => 'LIKE'
);
$meta_query[] = array(
'key' => 'city',
'value' => $_GET['city'],
'compare' => 'LIKE'
);
$meta_query[] = array(
'key' => 'facilitytype',
'value' => $_GET['facilitytype'],
'compare' => 'LIKE'
);
$meta_query[] = array(
'key' => 'hospitaltype',
'value' => $_GET['hospitaltype'],
'compare' => 'LIKE'
);
$meta_query[] = array(
'key' => 'state',
'value' => $_GET['state'],
'compare' => 'LIKE'
);
$meta_query[] = array(
'key' => 'idn',
'value' => $_GET['idn'],
'compare' => 'LIKE'
);
$meta_query[] = array(
'key' => 'gpoaffiliations',
'value' => $_GET['gpoaffiliations'],
'compare' => 'LIKE'
);
$meta_query[] = array(
'key' => 'bedcounttotal',
'value' => array($_GET['min-bedcounttotal'], $_GET['max-bedcounttotal']),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
);
$meta_query[] = array(
'key' => 'zipcode',
'value' => array($_GET['minzipcode'], $_GET['maxzipcode']),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
);
$meta_query[] = array(
'key' => 'operatingroomcount',
'value' => array($_GET['minoperatingroomcount'], $_GET['maxoperatingroomcount']),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
);
//if there is more than one meta query 'or' them
if(count($meta_query) > 1) {
$meta_query['relation'] = 'AND';
}
// The Query
$args['post_type'] = "property";
$args['meta_query'] = $meta_query;

WP_Query - Using multiple AND / OR

I have the below PHP code:-
$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' => array($job_salary_from,$job_salary_to),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
array(
'relation' => 'AND',
array(
'key' => 'job_salary_from',
'value' => array($job_salary_from,$job_salary_to),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
)
)
);
This will check to see if the search is between the minimum and maximum values which all works perfectly okay.
Now I want to add a further query which will check if it matches up with a Job Sector, e.g. I added the following below 'meta_query':-
'relation' => 'AND',
array(
'key' => 'job_sector',
'value' => 'Finance',
'compare' => 'LIKE',
),
However, it seems it is just ignoring the above and I'm not sure why. Any help would be much appreciated!
So it looks like this now:-
<?php
$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' => array($job_salary_from,$job_salary_to),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
array(
'relation' => 'AND',
array(
'key' => 'job_salary_from',
'value' => array($job_salary_from,$job_salary_to),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
),
'relation' => 'AND',
array(
'key' => 'job_type',
'value' => $job_type,
'compare' => 'LIKE',
),
array(
'key' => 'job_location',
'value' => $job_location,
'compare' => 'LIKE',
)
);
$fetch_jobs = new WP_Query( $args );?>
The job_type / job_location conditions should be put under 'meta_query' I guess:
'meta_query' => array(
'relation' => 'AND',
array(
array(
'key' => 'job_type',
'value' => $job_type,
'compare' => 'LIKE',
),
array(
'key' => 'job_location',
'value' => $job_location,
'compare' => 'LIKE',
),
),
array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'key' => 'job_salary_to',
'value' => array($job_salary_from,$job_salary_to),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
array(
'relation' => 'AND',
array(
'key' => 'job_salary_from',
'value' => array($job_salary_from,$job_salary_to),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
)
)

WP_Query, using AND with OR

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

Wordpress WP_User_Query search

I am trying to write a user search query, i have location and searching keyword (user name)
i need to search all user, with last name or first name matches to searching keyword for a
specified loaction
my code here,
$args = array(
'meta_query' => array(
'relation' => 'AND',
0 => array(
'key' => 'last_name',
'value' => $search_string,
'compare' => 'LIKE'
),
1 => array(
'key' => 'first_name',
'value' => $search_string,
'compare' => 'LIKE'
),
2 => array(
'key' => 'user_city',
'value' => $Location,
'compare' => 'LIKE'
),
),
);
$users = new WP_User_Query( $args);
$users = $users->get_results();
but i want 'relation' OR for first name and last name and relation AND for location, how i can do it ?
please use
$args = array( 'meta_query' =>
array(
array(
'relation' => 'OR',
array( 'key' => 'last_name', 'value' => $search_string, 'compare' => 'LIKE' ),
array( 'key' => 'first_name', 'value' => $search_string, 'compare' => 'LIKE' ),
),
array( 'key' => 'user_city', 'value' => $Location, 'compare' => 'LIKE' ), ),
);
I believe it's not possible to have multiple relation fields in a wp_query. Please reference https://codex.wordpress.org/Class_Reference/WP_User_Query.
As an alternative, you can look into pre_user_query, which is a hook to call a function before the query is called.
add_filter( 'pre_user_query', 'some_function' );
function some_function () {
//do custom query altering here.
}
Try this
$user_ex = explode(' ', $search_string);
if($user_ex[1]) {
$name_array = preg_split("/[\s,]+/", $search_string_user);
$args = new WP_User_Query( array(
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'OR',
array(
'key' => 'user_city',
'value' => $search_string,
'compare' => 'LIKE'
),
),
array(
'relation' => 'AND',
array(
'key' => 'first_name',
'value' => $name_array[0],
'compare' => 'LIKE'
),
array(
'key' => 'last_name',
'value' => $name_array[1],
'compare' => 'LIKE'
),
),
),
}

Categories