Make WordPress Core


Ignore:
Timestamp:
03/01/2018 04:02:41 AM (7 years ago)
Author:
boonebgorges
Message:

Allow LIKE queries against the 'key' value in meta queries.

The new compare_key=LIKE parameter works in conjunction with key in a
similar way to the compare=LIKE and value: by doing a "compares" LIKE
query. This allows developers to do partial matches against keys when
doing meta queries.

Props mariovalney, chasewg.
Fixes #42409.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/query/metaQuery.php

    r42343 r42768  
    18491849        $this->assertEqualSets( array( 'foo_key', 'foo_key-1', 'foo_key-2' ), array_keys( $q->meta_query->get_clauses() ) );
    18501850    }
     1851
     1852    /**
     1853     * @ticket 42409
     1854     */
     1855    public function test_compare_key_like() {
     1856        $posts = self::factory()->post->create_many( 3 );
     1857
     1858        add_post_meta( $posts[0], 'aaa_foo_aaa', 'abc' );
     1859        add_post_meta( $posts[1], 'aaa_bar_aaa', 'abc' );
     1860        add_post_meta( $posts[2], 'aaa_foo_bbb', 'abc' );
     1861
     1862        $q = new WP_Query(
     1863            array(
     1864                'meta_query' => array(
     1865                    array(
     1866                        'compare_key' => 'LIKE',
     1867                        'key'         => 'aa_foo',
     1868                    ),
     1869                ),
     1870                'fields' => 'ids',
     1871            )
     1872        );
     1873
     1874        $this->assertEqualSets( array( $posts[0], $posts[2] ), $q->posts );
     1875    }
     1876
     1877    /**
     1878     * @ticket 42409
     1879     */
     1880    public function test_meta_compare_key_like() {
     1881        $posts = self::factory()->post->create_many( 3 );
     1882
     1883        add_post_meta( $posts[0], 'aaa_foo_aaa', 'abc' );
     1884        add_post_meta( $posts[1], 'aaa_bar_aaa', 'abc' );
     1885        add_post_meta( $posts[2], 'aaa_foo_bbb', 'abc' );
     1886
     1887        $q = new WP_Query(
     1888            array(
     1889                'meta_compare_key' => 'LIKE',
     1890                'meta_key'         => 'aa_foo',
     1891                'fields'           => 'ids',
     1892            )
     1893        );
     1894
     1895        $this->assertEqualSets( array( $posts[0], $posts[2] ), $q->posts );
     1896    }
     1897
     1898    /**
     1899     * @ticket 42409
     1900     */
     1901    public function test_compare_key_like_with_not_exists_compare() {
     1902        $posts = self::factory()->post->create_many( 3 );
     1903
     1904        add_post_meta( $posts[0], 'aaa_foo_aaa', 'abc' );
     1905        add_post_meta( $posts[1], 'aaa_bar_aaa', 'abc' );
     1906        add_post_meta( $posts[2], 'bar', 'abc' );
     1907
     1908        $q = new WP_Query(
     1909            array(
     1910                'meta_query' => array(
     1911                    'relation' => 'AND',
     1912                    array(
     1913                        'compare_key' => 'LIKE',
     1914                        'key'         => 'bar',
     1915                        'compare'     => 'NOT EXISTS',
     1916                    ),
     1917                ),
     1918                'fields' => 'ids',
     1919            )
     1920        );
     1921
     1922        $this->assertEqualSets( array( $posts[0] ), $q->posts );
     1923
     1924    }
    18511925}
Note: See TracChangeset for help on using the changeset viewer.