| 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 | |