WordPress.org

Make WordPress Core

Changeset 38733


Ignore:
Timestamp:
10/05/2016 07:50:02 PM (4 years ago)
Author:
joemcgill
Message:

Media: Better handling of JOINs when searching filenames.

Following [38625], any media searches that already included JOINs,
e.g., tax_queries, would get trampled when we joined the post meta
table to search for filenames. This preserves existing JOINs and
also only applies the _filter_query_attachment_filenames() filter
when a search query is being performed.

Props flixos90, joemcgill.
Fixes #22744.

Location:
trunk
Files:
3 edited

Legend:

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

    r38710 r38733  
    24022402
    24032403    // Filter query clauses to include filenames.
    2404     add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     2404    if ( isset( $query['s'] ) ) {
     2405        add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     2406    }
    24052407
    24062408    /**
  • trunk/src/wp-admin/includes/post.php

    r38625 r38733  
    11461146
    11471147    // Filter query clauses to include filenames.
    1148     add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     1148    if ( isset( $q['s'] ) ) {
     1149        add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     1150    }
    11491151
    11501152    return $q;
     
    11651167    remove_filter( 'posts_clauses', __FUNCTION__ );
    11661168
    1167     $clauses['join'] = " INNER JOIN {$wpdb->postmeta} ON ( {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id )";
     1169    // Add a LEFT JOIN of the postmeta table so we don't trample existing JOINs.
     1170    $clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} AS sq1 ON ( {$wpdb->posts}.ID = sq1.post_id AND sq1.meta_key = '_wp_attached_file' )";
     1171
    11681172    $clauses['groupby'] = "{$wpdb->posts}.ID";
    11691173
    11701174    $clauses['where'] = preg_replace(
    11711175        "/\({$wpdb->posts}.post_content (NOT LIKE|LIKE) (\'[^']+\')\)/",
    1172         "$0 OR ( {$wpdb->postmeta}.meta_key = '_wp_attached_file' AND {$wpdb->postmeta}.meta_value $1 $2 )",
     1176        "$0 OR ( sq1.meta_value $1 $2 )",
    11731177        $clauses['where'] );
    11741178
  • trunk/tests/phpunit/tests/query/search.php

    r38625 r38733  
    385385    }
    386386
     387    /**
     388     * @ticket 22744
     389     */
     390    public function test_include_file_names_in_attachment_search_with_meta_query() {
     391        $attachment = self::factory()->post->create( array(
     392            'post_type'    => 'attachment',
     393            'post_status'  => 'publish',
     394            'post_title'   => 'bar foo',
     395            'post_content' => 'foo bar',
     396            'post_excerpt' => 'This post has foo',
     397        ) );
     398
     399        add_post_meta( $attachment, '_wp_attached_file', 'some-image4.png', true );
     400        add_post_meta( $attachment, '_test_meta_key', 'value', true );
     401        add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     402
     403        // Pass post_type a string value.
     404        $q = new WP_Query( array(
     405            's'           => 'image4',
     406            'fields'      => 'ids',
     407            'post_type'   => 'attachment',
     408            'post_status' => 'inherit',
     409            'meta_query'  => array(
     410                array(
     411                    'key'     => '_test_meta_key',
     412                    'value'   => 'value',
     413                    'compare' => '=',
     414                ),
     415            ),
     416        ) );
     417
     418        $this->assertSame( array( $attachment ), $q->posts );
     419    }
     420
     421    /**
     422     * @ticket 22744
     423     */
     424    public function test_include_file_names_in_attachment_search_with_tax_query() {
     425        $attachment = self::factory()->post->create( array(
     426            'post_type'    => 'attachment',
     427            'post_status'  => 'publish',
     428            'post_title'   => 'bar foo',
     429            'post_content' => 'foo bar',
     430            'post_excerpt' => 'This post has foo',
     431        ) );
     432
     433        // Add a tag to the post.
     434        wp_set_post_terms( $attachment, 'test', 'post_tag' );
     435
     436        add_post_meta( $attachment, '_wp_attached_file', 'some-image5.png', true );
     437        add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     438
     439        // Pass post_type a string value.
     440        $q = new WP_Query( array(
     441            's'           => 'image5',
     442            'fields'      => 'ids',
     443            'post_type'   => 'attachment',
     444            'post_status' => 'inherit',
     445            'tax_query' => array(
     446                array(
     447                    'taxonomy' => 'post_tag',
     448                    'field'    => 'slug',
     449                    'terms'    => 'test',
     450                ),
     451            ),
     452        ) );
     453
     454        $this->assertSame( array( $attachment ), $q->posts );
     455    }
     456
     457    /**
     458     * @ticket 22744
     459     */
     460    public function test_filter_query_attachment_filenames_unhooks_itself() {
     461        add_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     462
     463        apply_filters( 'posts_clauses', array(
     464            'where'    => '',
     465            'groupby'  => '',
     466            'join'     => '',
     467            'orderby'  => '',
     468            'distinct' => '',
     469            'fields'   => '',
     470            'limit'    => '',
     471        ) );
     472
     473        $result = has_filter( 'posts_clauses', '_filter_query_attachment_filenames' );
     474
     475        $this->assertFalse( $result );
     476    }
     477
    387478    public function filter_posts_search( $sql ) {
    388479        return $sql . ' /* posts_search */';
Note: See TracChangeset for help on using the changeset viewer.