View difference between Paste ID: BNgXYAmr and eU5V4ari
SHOW: | | - or go back to the newest paste.
1
function pm_detect_archives($request) {
2
	global $wp, $wpdb;
3
4
	$post_types = array(
5
		'events' => 'events'
6
	);
7
8
	$taxonomies = array(
9
		'solutions'
10
	);
11
12-
	// Parse the URI (name_of_post_type/taxonomy_term)
12+
	$taxonomies_2 = array(
13-
	preg_match('/([^\/]+)\/([^\/]+)(?:\/page\/([\d]+))?/', $wp->request, $parts);
13+
		'event_type',
14
		'category',
15
		'post_tag',
16
		'service_line'
17
	);
18
19-
		// Get term
19+
	// Parse the URI
20
	// URL Format: name_of_post_type/taxonomy_term/taxonomy_2_term
21
	preg_match('/([^\/]+)\/([^\/]+)(?:\/([^\/]+))?(?:\/page\/([\d]+))?/', $wp->request, $parts);
22
23
	if(!empty($parts[1]) && !empty($post_types[$parts[1]])) {
24
		// Get post type
25
		$post_type = $post_types[$parts[1]];
26
27
		// Get term #1
28
		$term = $wpdb->get_row($wpdb->prepare("
29
			SELECT * FROM {$wpdb->terms}
30
			LEFT JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id
31
			WHERE slug = %s",
32
			sanitize_title($parts[2])
33
		));
34
35
		// Get term #2
36-
			// Suport pagination
36+
		if(!empty($parts[3])) {
37-
			if(!empty($parts[2])) {
37+
			$term_2 = $wpdb->get_row($wpdb->prepare("
38-
				$request['paged'] = $parts[2];
38+
				SELECT * FROM {$wpdb->terms}
39
				LEFT JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id
40
				WHERE slug = %s",
41
				sanitize_title($parts[3])
42
			));
43
		}
44
			
45-
add_filter('request', 'pm_detect_archives', 99);
45+
46
		// Filter the query if both post type & term were found
47
		if(!empty($term) && in_array($term->taxonomy, $taxonomies)) {
48
			$request = array(
49
				'post_type' => $post_type,
50
				'taxonomy' => $term->taxonomy,
51
				'term' => $term->slug,
52
				'do_not_redirect' => 1,
53
			);
54
55
			// Add second term
56
			if(!empty($term_2) && in_array($term_2->taxonomy, $taxonomies_2)) {
57
				$request['taxonomy_2'] = $term_2->taxonomy;
58
				$request['term_2'] = $term_2->slug;	
59
			}
60
61
			// Support pagination
62
			if(!empty($parts[4])) {
63
				$request['paged'] = $parts[4];
64
			}
65
		}
66
	}
67
68
	return $request;
69
}
70
add_filter('request', 'pm_detect_archives', 99);
71
72
function pm_pre_get_posts($query) {
73
	if(!empty($query->query['taxonomy_2']) && $query->is_archive) {
74
		$tax_query = array(
75
			'taxonomy' => $query->query['taxonomy_2'],
76
			'terms' => array($query->query['term_2']),
77
			'field' => 'slug',
78
			'operator'=> 'IN'
79
		);
80
81
		$query->tax_query->queries[] = $tax_query;
82
83
		$query->query_vars['tax_query'] = $query->tax_query->queries;
84
		$query->query_vars['tax_query']['relation'] = 'AND';
85
	}
86
}
87
add_action('pre_get_posts', 'pm_pre_get_posts', 99999);