WordPress.org

Make WordPress Core

Changeset 39598


Ignore:
Timestamp:
12/13/16 14:08:24 (5 months ago)
Author:
jnylen0
Message:

REST API: Add support for filename search in media endpoint.

In [38625], the functionality to search for attachments by filename was added
via the posts_clauses filter and the _filter_query_attachment_filenames()
function. This moves _filter_query_attachment_filenames() from
wp-admin/includes/post.php to wp-includes/post.php so that it can be
applied in the same manner in the REST API media endpoint.

Props jblz, tyxla.
Fixes #39092.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/post.php

    r39390 r39598  
    11531153 
    11541154    return $q; 
    1155 } 
    1156  
    1157 /** 
    1158  * Filter the SQL clauses of an attachment query to include filenames. 
    1159  * 
    1160  * @since 4.7.0 
    1161  * @access private 
    1162  * 
    1163  * @global wpdb $wpdb WordPress database abstraction object. 
    1164  * 
    1165  * @param array $clauses An array including WHERE, GROUP BY, JOIN, ORDER BY, 
    1166  *                       DISTINCT, fields (SELECT), and LIMITS clauses. 
    1167  * @return array The modified clauses. 
    1168  */ 
    1169 function _filter_query_attachment_filenames( $clauses ) { 
    1170     global $wpdb; 
    1171     remove_filter( 'posts_clauses', __FUNCTION__ ); 
    1172  
    1173     // Add a LEFT JOIN of the postmeta table so we don't trample existing JOINs. 
    1174     $clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} AS sq1 ON ( {$wpdb->posts}.ID = sq1.post_id AND sq1.meta_key = '_wp_attached_file' )"; 
    1175  
    1176     $clauses['groupby'] = "{$wpdb->posts}.ID"; 
    1177  
    1178     $clauses['where'] = preg_replace( 
    1179         "/\({$wpdb->posts}.post_content (NOT LIKE|LIKE) (\'[^']+\')\)/", 
    1180         "$0 OR ( sq1.meta_value $1 $2 )", 
    1181         $clauses['where'] ); 
    1182  
    1183     return $clauses; 
    11841155} 
    11851156 
  • trunk/src/wp-includes/post.php

    r39506 r39598  
    61896189    return $post_name; 
    61906190} 
     6191 
     6192/** 
     6193 * Filter the SQL clauses of an attachment query to include filenames. 
     6194 * 
     6195 * @since 4.7.0 
     6196 * @access private 
     6197 * 
     6198 * @global wpdb $wpdb WordPress database abstraction object. 
     6199 * 
     6200 * @param array $clauses An array including WHERE, GROUP BY, JOIN, ORDER BY, 
     6201 *                       DISTINCT, fields (SELECT), and LIMITS clauses. 
     6202 * @return array The modified clauses. 
     6203 */ 
     6204function _filter_query_attachment_filenames( $clauses ) { 
     6205    global $wpdb; 
     6206    remove_filter( 'posts_clauses', __FUNCTION__ ); 
     6207 
     6208    // Add a LEFT JOIN of the postmeta table so we don't trample existing JOINs. 
     6209    $clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} AS sq1 ON ( {$wpdb->posts}.ID = sq1.post_id AND sq1.meta_key = '_wp_attached_file' )"; 
     6210 
     6211    $clauses['groupby'] = "{$wpdb->posts}.ID"; 
     6212 
     6213    $clauses['where'] = preg_replace( 
     6214        "/\({$wpdb->posts}.post_content (NOT LIKE|LIKE) (\'[^']+\')\)/", 
     6215        "$0 OR ( sq1.meta_value $1 $2 )", 
     6216        $clauses['where'] ); 
     6217 
     6218    return $clauses; 
     6219} 
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    r39348 r39598  
    4646                $query_args['post_mime_type'] = $request['mime_type']; 
    4747            } 
     48        } 
     49 
     50        // Filter query clauses to include filenames. 
     51        if ( isset( $query_args['s'] ) ) { 
     52            add_filter( 'posts_clauses', '_filter_query_attachment_filenames' ); 
    4853        } 
    4954 
  • trunk/tests/phpunit/tests/rest-api/rest-attachments-controller.php

    r39595 r39598  
    11571157    } 
    11581158 
     1159    public function test_search_item_by_filename() { 
     1160        $id = $this->factory->attachment->create_object( $this->test_file, 0, array( 
     1161            'post_mime_type' => 'image/jpeg', 
     1162        ) ); 
     1163        $id2 = $this->factory->attachment->create_object( $this->test_file2, 0, array( 
     1164            'post_mime_type' => 'image/png', 
     1165        ) ); 
     1166 
     1167        $filename = basename( $this->test_file2 ); 
     1168 
     1169        $request = new WP_REST_Request( 'GET', '/wp/v2/media' ); 
     1170        $request->set_param( 'search', $filename ); 
     1171        $response = $this->server->dispatch( $request ); 
     1172        $data = $response->get_data(); 
     1173 
     1174        $this->assertCount( 1, $data ); 
     1175        $this->assertEquals( $id2, $data[0]['id'] ); 
     1176        $this->assertEquals( 'image/png', $data[0]['mime_type'] ); 
     1177    } 
     1178 
    11591179    public function additional_field_get_callback( $object, $request ) { 
    11601180        return 123; 
Note: See TracChangeset for help on using the changeset viewer.