1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
<?php
class Search {
function init() {
add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ), 1 );
add_filter( 'query_vars', array( $this, 'register_query_vars' ) );
}
static $tax_vars = array( // tax_name (what is in the request) => tax_key (what is in the database, only hierarchical taxonomies are different from tax_name )
'brand' => 'vehicle-type',
'category' => 'vehicle-category',
'color' => 'vehicle-color',
'conditoin' => 'vehicle-condition',
'fuel' => 'vehicle-fuel',
'gearbox' => 'vehicle-gearbox',
'location' => 'vehicle-location',
'model' => 'vehicle-type',
'type' => 'vehicle-category',
);
static $meta_vars = array( // meta_name (name of post meta, stored in the database) => meta_keys (what is in the request)
'vehicle-horsepower' => array(
'start_horsepower', 'end_horsepower'
),
'vehicle-price' => array(
'start_price', 'end_price'
),
'vehicle-range' => array(
'start_range', 'end_range'
),
'vehicle-year' => array(
'start_year', 'end_year'
),
);
function register_query_vars( $vars ) { // didn't use array_merge because it caused some problems
$vars[] = 'search';
foreach( $this::$tax_vars as $key => $value ) {
$vars[] = $key;
}
foreach( $this::$meta_vars as $key => $value ) {
foreach( $value as $name ) {
$vars[] = $name;
}
}
return $vars;
}
function get_slug_taxonomy_array( $name, $terms ) {
$taxonomy_arr = array(
'taxonomy' => $name,
'field' => 'slug',
'terms' => $terms,
);
return $taxonomy_arr;
}
function get_num_meta_array( $key, $value1, $value2 ) {
$result;
if( ! empty( $value1 ) && ! empty( $value2 ) ) {
$result = array(
'key' => $key,
'value' => array( $value1, $value2 ),
'type' => 'NUMERIC',
'compare' => 'BETWEEN',
);
} else if( ! empty( $value1 ) ) {
$result = array(
'key' => $key,
'value' => $value1,
'type' => 'NUMERIC',
'compare' => '>=',
);
} else {
$result = array(
'key' => $key,
'value' => $value2,
'type' => 'NUMERIC',
'compare' => '<=',
);
}
return $result;
}
function pre_get_posts( $query ) {
if ( get_query_var( 'search' ) != 'vehicles' ) {
return;
}
$query->set( 'post_type', 'vehicles' );
$tax_query = array();
foreach( $this::$tax_vars as $tax_name => $tax_key ) {
if ( ! empty( get_query_var( $tax_name ) ) ) {
$tax_query[] = $this->get_slug_taxonomy_array( $tax_key, get_query_var( $tax_name ) );
}
}
$meta_query = array();
foreach( $this::$meta_vars as $meta_name => $meta_keys ) {
if ( ! empty( get_query_var( $meta_keys[0] ) ) || ! empty( get_query_var( $meta_keys[1] ) ) ) {
$meta_query[] = $this->get_num_meta_array( $meta_name, get_query_var( $meta_keys[0] ), get_query_var( $meta_keys[1] ) );
}
}
$query->set( 'meta_query', $meta_query );
$query->set( 'tax_query', $tax_query );
}
}
|