Products
GG网络技术分享 2025-03-18 16:12 3
I have a form that essentially filters a query for courses. The form has multiple options but lets take 2 of those, whether the course is open and its location. The query fully programmed looks like this:
$query = array(\'post_type\' => \'courses\',
\'meta_query\' => array(
\'relation\' => \'AND\',
array(
\'key\' => \'course_location\',
\'compare\' => \'=\',
\'value\' => \'Birmingham\',
),
array(
\'key\' => \'course_open\',
\'compare\' => \'=\',
\'value\' => 1,
),
),
);
Now when I use the form this is the code I have...
Basic Start of query
$query = array(\'post_type\' => \'courses\',
);
Adding in location from form:
if(isset($_GET[\'location\']) && $_GET[\'location\'] != \'\') { $query[\'meta_query\'] = array(
\'relation\' => \'AND\',
array(
\'key\' => \'course_location\',
\'compare\' => \'=\',
\'value\' => $_GET[\'location\'],
),
);
}
Adding in if the course is open:
if(isset($_GET[\'open\']) && $_GET[\'open\'] != \'\') { $query[\'meta_query\'] = array(
\'relation\' => \'AND\',
array(
\'key\' => \'course_open\',
\'compare\' => \'=\',
\'value\' => $_GET[\'open\'],
),
);
}
The problem I have is the course open will replace the course locations in the query. If I just set one of the options it works perfectly I just need to keep adding to the query if its set in the form. Any idea how I would do this?
Solved it!
So I changed the Open code to:
if(isset($_GET[\'open\']) && $_GET[\'open\'] != \'\') { $open =
array(
\'key\' => \'course_open\',
\'compare\' => \'=\',
\'value\' => $_GET[\'open\'],
);
}
The Location to:
if(isset($_GET[\'location\']) && $_GET[\'location\'] != \'\') { $location = array(
\'key\' => \'course_location\',
\'compare\' => \'=\',
\'value\' => $_GET[\'location\'],
);
}
And the main query:
$query = array(\'post_type\' => \'courses\',
\'meta_query\' => array(
\'relation\' => \'AND\',
$open,
$location,
),
);
###
Try below code :
$meta_query=array();$meta_query[\'relation\'] = \'AND\';
if(isset($_GET[\'location\']) && $_GET[\'location\'] != \'\') {
$temp_arr = array();
$temp_arr[\'key\'] = \'course_location\';
$temp_arr[\'value\'] = $_GET[\'location\'];
$temp_arr[\'compare\'] = \'=\';
$meta_query[] = $temp_arr;
}
if(isset($_GET[\'open\']) && $_GET[\'open\'] != \'\') {
$temp_arr = array();
$temp_arr[\'key\'] = \'course_open\';
$temp_arr[\'value\'] = $_GET[\'open\'];
$temp_arr[\'compare\'] = \'=\';
$meta_query[] = $temp_arr;
}
$args = array(
\'post_type\' => \'post_type\',
\'meta_query\' => $meta_query
);
In your code, the mistake was when both the parameters passed one would overwrite the other one.
Hope this will help!
Demand feedback