WordPress.org

Make WordPress Core

Ticket #12891: eager.2.php

File eager.2.php, 1.7 KB (added by scribu, 4 years ago)

corrected SQL

Line 
1<?php
2
3function wp_tax_and() {
4        $args = func_get_args();
5
6        return wp_tax_group('AND', $args);
7}
8
9function wp_tax_or() {
10        $args = func_get_args();
11
12        return wp_tax_group('OR', $args);
13}
14
15function wp_tax_group($op, $args) {
16        return "(" . implode(" $op ", $args) . ")";
17}
18
19function wp_tax($taxonomy, $terms, $field = 'term_id') {
20        return _wp_tax($taxonomy, $terms, $field, true);
21}
22
23function wp_tax_not($taxonomy, $terms, $field = 'term_id') {
24        return _wp_tax($taxonomy, $terms, $field, false);
25}
26
27function _wp_tax($taxonomy, $terms, $field, $in) {
28        global $wpdb;
29
30        $terms = (array) $terms;
31
32        switch ( $field ) {
33                case 'term_taxonomy_id':
34                        $terms = implode( ',', array_map('intval', $terms) );
35                break;
36
37                case 'term_id':
38                        $terms = implode( ',', array_map('intval', $terms) );
39                        $terms = $wpdb->prepare("
40                                SELECT term_taxonomy_id
41                                FROM $wpdb->term_taxonomy
42                                WHERE taxonomy = %s
43                                AND term_id IN ($terms)
44                        ", $taxonomy);
45                break;
46
47                case 'slug':
48                case 'name':
49                        $terms = "'" . implode( "','", esc_sql($terms) ) . "'";
50                        $terms = $wpdb->prepare("
51                                SELECT term_taxonomy_id
52                                FROM $wpdb->term_taxonomy
53                                INNER JOIN $wpdb->terms USING (term_id)
54                                WHERE taxonomy = %s
55                                AND $field IN ($terms)
56                        ", $taxonomy);
57        }
58
59        $operator = $in ? 'IN' : 'NOT IN';
60
61        return "object_id IN (
62                SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id $operator ($terms)
63        )";
64}
65
66function wp_tax_query($query) {
67        global $wpdb;
68        return "SELECT DISTINCT object_id FROM $wpdb->term_relationships WHERE " . $query;
69}
70
71
72// Example
73$query = wp_tax_query(wp_tax_and(
74        wp_tax_or(
75                wp_tax( 'post_category', 59 ),
76                wp_tax( 'post_tag', 'web', 'slug' )
77        ),
78        wp_tax_not( 'post_category', 24 ),
79        wp_tax_not( 'post_tag', 'wordpress', 'slug' )
80));
81
82var_dump($query);
83