WordPress.org

Make WordPress Core

Ticket #7431: 7431.002.diff

File 7431.002.diff, 2.5 KB (added by AaronCampbell, 10 years ago)

Add ability to specify a comparison operator for meta_value

  • wp-includes/query.php

     
    121121
    122122function is_tax( $slug = '' ) {
    123123        global $wp_query;
    124        
     124
    125125        if ( !$wp_query->is_tax )
    126126                return false;
    127127
     
    12521252                } else {
    12531253                        // Used to filter values
    12541254                        $allowed_keys = array('author', 'date', 'category', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand');
     1255                        if ( !empty($q['meta_key']) ) {
     1256                                $allowed_keys[] = $q['meta_key'];
     1257                                $allowed_keys[] = 'meta_value';
     1258                        }
    12551259                        $q['orderby'] = urldecode($q['orderby']);
    12561260                        $q['orderby'] = addslashes_gpc($q['orderby']);
    12571261                        $orderby_array = explode(' ',$q['orderby']);
     
    12701274                                        case 'rand':
    12711275                                                $orderby = 'RAND()';
    12721276                                                break;
     1277                                        case $q['meta_key']:
     1278                                        case 'meta_value':
     1279                                                $orderby = "$wpdb->postmeta.meta_value";
     1280                                                break;
    12731281                                        default:
    12741282                                                $orderby = "$wpdb->posts.post_" . $orderby;
    12751283                                }
     
    13541362                // postmeta queries
    13551363                if ( ! empty($q['meta_key']) || ! empty($q['meta_value']) )
    13561364                        $join .= " LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) ";
    1357                 if ( ! empty($q['meta_key']) )
    1358                         $where .= $wpdb->prepare("AND $wpdb->postmeta.meta_key = %s ", $q['meta_key']);
    1359                 if ( ! empty($q['meta_value']) )
    1360                         $where .= $wpdb->prepare("AND $wpdb->postmeta.meta_value = %s ", $q['meta_value']);
     1365                if ( ! empty($q['meta_key']) )
     1366                        $where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s ", $q['meta_key']);
     1367                if ( ! empty($q['meta_value']) ) {
     1368                        if (!isset($q['meta_compare']) || empty($q['meta_compare']) || !in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<='))) {
     1369                                $q['meta_compare'] = '=';
     1370                        }
     1371                        $where .= $wpdb->prepare("AND $wpdb->postmeta.meta_value {$q['meta_compare']} %s ", $q['meta_value']);
     1372                }
    13611373
    13621374                // Apply filters on where and join prior to paging so that any
    13631375                // manipulations to them are reflected in the paging by day queries.
     
    14221434                $join = apply_filters('posts_join_paged', $join);
    14231435                $orderby = apply_filters('posts_orderby', $q['orderby']);
    14241436                $distinct = apply_filters('posts_distinct', $distinct);
    1425                 $fields = apply_filters('posts_fields', "$wpdb->posts.*");
     1437                $fields = apply_filters('posts_fields', ( empty($q['meta_key']) )? "$wpdb->posts.*":"$wpdb->posts.*, $wpdb->postmeta.meta_value");
    14261438                $limits = apply_filters( 'post_limits', $limits );
    14271439
    14281440                // Announce current selection parameters.  For use by caching plugins.