| | 1363 | |
| | 1364 | // extract clauses |
| | 1365 | $meta_clauses = $mquery->get_clauses(); |
| | 1366 | if ( ! empty( $meta_clauses ) ) { |
| | 1367 | $allowed_keys = array(); |
| | 1368 | $primary_meta_query = reset( $meta_clauses ); |
| | 1369 | if ( ! empty( $primary_meta_query['key'] ) ) { |
| | 1370 | $primary_meta_key = $primary_meta_query['key']; |
| | 1371 | $allowed_keys[] = $primary_meta_key; |
| | 1372 | } |
| | 1373 | $allowed_keys[] = 'meta_value'; |
| | 1374 | $allowed_keys[] = 'meta_value_num'; |
| | 1375 | $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); |
| | 1376 | $orderby = ( isset( $args['orderby'] ) ) ? $args['orderby'] : ''; |
| | 1377 | if( in_array( $orderby, $allowed_keys ) ) { |
| | 1378 | $join .= " INNER JOIN $wpdb->termmeta AS term_meta ON t.term_id = term_meta.term_id"; |
| | 1379 | switch( $orderby ) { |
| | 1380 | default: |
| | 1381 | case $primary_meta_key: |
| | 1382 | case 'meta_value': |
| | 1383 | if ( ! empty( $primary_meta_query['type'] ) ) { |
| | 1384 | $orderby = "ORDER BY CAST(term_meta.meta_value AS term_meta)"; |
| | 1385 | } else { |
| | 1386 | $orderby = "ORDER BY term_meta.meta_value"; |
| | 1387 | } |
| | 1388 | break; |
| | 1389 | case 'meta_value_num': |
| | 1390 | $orderby = "ORDER BY term_meta.meta_value+0"; |
| | 1391 | break; |
| | 1392 | } |
| | 1393 | } |
| | 1394 | } |
| | 1395 | |