WordPress.org

Make WordPress Core


Ignore:
Timestamp:
10/14/2014 04:02:41 AM (5 years ago)
Author:
boonebgorges
Message:

Introduce support for nested queries in WP_Tax_Query.

Previously, tax query arguments could be joined by a single AND or OR relation.
Now, these queries can be arbitrarily nested, allowing clauses to be linked
together with multiple relations.

In a few places, WP_Query runs through a list of clauses in a tax_query in order
to set certain query vars for backward compatibility. The necessary changes have
been made to WP_Query to support this feature with the new complex structure of
tax_query. Unit tests are included for these backward compatibility fixes.

Unit tests for the new nesting syntax are included.

Props boonebgorges.
Fixes #29718. See #29738.

File:
1 edited

Legend:

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

    r29890 r29891  
    15431543
    15441544    /**
     1545     * @ticket 29738
     1546     * @group taxonomy
     1547     */
     1548    public function test_tax_query_two_nested_queries() {
     1549        register_taxonomy( 'foo', 'post' );
     1550        register_taxonomy( 'bar', 'post' );
     1551
     1552        $foo_term_1 = $this->factory->term->create( array(
     1553            'taxonomy' => 'foo',
     1554        ) );
     1555        $foo_term_2 = $this->factory->term->create( array(
     1556            'taxonomy' => 'foo',
     1557        ) );
     1558        $bar_term_1 = $this->factory->term->create( array(
     1559            'taxonomy' => 'bar',
     1560        ) );
     1561        $bar_term_2 = $this->factory->term->create( array(
     1562            'taxonomy' => 'bar',
     1563        ) );
     1564
     1565        $p1 = $this->factory->post->create();
     1566        $p2 = $this->factory->post->create();
     1567        $p3 = $this->factory->post->create();
     1568
     1569        wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
     1570        wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
     1571        wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
     1572        wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
     1573        wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
     1574        wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
     1575
     1576        $q = new WP_Query( array(
     1577            'fields' => 'ids',
     1578            'update_post_meta_cache' => false,
     1579            'update_post_term_cache' => false,
     1580            'tax_query' => array(
     1581                'relation' => 'OR',
     1582                array(
     1583                    'relation' => 'AND',
     1584                    array(
     1585                        'taxonomy' => 'foo',
     1586                        'terms' => array( $foo_term_1 ),
     1587                        'field' => 'term_id',
     1588                    ),
     1589                    array(
     1590                        'taxonomy' => 'bar',
     1591                        'terms' => array( $bar_term_1 ),
     1592                        'field' => 'term_id',
     1593                    ),
     1594                ),
     1595                array(
     1596                    'relation' => 'AND',
     1597                    array(
     1598                        'taxonomy' => 'foo',
     1599                        'terms' => array( $foo_term_2 ),
     1600                        'field' => 'term_id',
     1601                    ),
     1602                    array(
     1603                        'taxonomy' => 'bar',
     1604                        'terms' => array( $bar_term_2 ),
     1605                        'field' => 'term_id',
     1606                    ),
     1607                ),
     1608            ),
     1609        ) );
     1610
     1611        _unregister_taxonomy( 'foo' );
     1612        _unregister_taxonomy( 'bar' );
     1613
     1614        $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
     1615    }
     1616
     1617    /**
     1618     * @ticket 29738
     1619     * @group taxonomy
     1620     */
     1621    public function test_tax_query_one_nested_query_one_first_order_query() {
     1622        register_taxonomy( 'foo', 'post' );
     1623        register_taxonomy( 'bar', 'post' );
     1624
     1625        $foo_term_1 = $this->factory->term->create( array(
     1626            'taxonomy' => 'foo',
     1627        ) );
     1628        $foo_term_2 = $this->factory->term->create( array(
     1629            'taxonomy' => 'foo',
     1630        ) );
     1631        $bar_term_1 = $this->factory->term->create( array(
     1632            'taxonomy' => 'bar',
     1633        ) );
     1634        $bar_term_2 = $this->factory->term->create( array(
     1635            'taxonomy' => 'bar',
     1636        ) );
     1637
     1638        $p1 = $this->factory->post->create();
     1639        $p2 = $this->factory->post->create();
     1640        $p3 = $this->factory->post->create();
     1641
     1642        wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
     1643        wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
     1644        wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
     1645        wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
     1646        wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
     1647        wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
     1648
     1649        $q = new WP_Query( array(
     1650            'fields' => 'ids',
     1651            'update_post_meta_cache' => false,
     1652            'update_post_term_cache' => false,
     1653            'tax_query' => array(
     1654                'relation' => 'OR',
     1655                array(
     1656                    'taxonomy' => 'foo',
     1657                    'terms' => array( $foo_term_2 ),
     1658                    'field' => 'term_id',
     1659                ),
     1660                array(
     1661                    'relation' => 'AND',
     1662                    array(
     1663                        'taxonomy' => 'foo',
     1664                        'terms' => array( $foo_term_1 ),
     1665                        'field' => 'term_id',
     1666                    ),
     1667                    array(
     1668                        'taxonomy' => 'bar',
     1669                        'terms' => array( $bar_term_1 ),
     1670                        'field' => 'term_id',
     1671                    ),
     1672                ),
     1673            ),
     1674        ) );
     1675
     1676        _unregister_taxonomy( 'foo' );
     1677        _unregister_taxonomy( 'bar' );
     1678
     1679        $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
     1680    }
     1681
     1682    /**
     1683     * @ticket 29738
     1684     * @group taxonomy
     1685     */
     1686    public function test_tax_query_one_double_nested_query_one_first_order_query() {
     1687        register_taxonomy( 'foo', 'post' );
     1688        register_taxonomy( 'bar', 'post' );
     1689
     1690        $foo_term_1 = $this->factory->term->create( array(
     1691            'taxonomy' => 'foo',
     1692        ) );
     1693        $foo_term_2 = $this->factory->term->create( array(
     1694            'taxonomy' => 'foo',
     1695        ) );
     1696        $bar_term_1 = $this->factory->term->create( array(
     1697            'taxonomy' => 'bar',
     1698        ) );
     1699        $bar_term_2 = $this->factory->term->create( array(
     1700            'taxonomy' => 'bar',
     1701        ) );
     1702
     1703        $p1 = $this->factory->post->create();
     1704        $p2 = $this->factory->post->create();
     1705        $p3 = $this->factory->post->create();
     1706        $p4 = $this->factory->post->create();
     1707
     1708        wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
     1709        wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
     1710        wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
     1711        wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
     1712        wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
     1713        wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
     1714
     1715        $q = new WP_Query( array(
     1716            'fields' => 'ids',
     1717            'update_post_meta_cache' => false,
     1718            'update_post_term_cache' => false,
     1719            'tax_query' => array(
     1720                'relation' => 'OR',
     1721                array(
     1722                    'taxonomy' => 'foo',
     1723                    'terms' => array( $foo_term_2 ),
     1724                    'field' => 'term_id',
     1725                ),
     1726                array(
     1727                    'relation' => 'AND',
     1728                    array(
     1729                        'taxonomy' => 'foo',
     1730                        'terms' => array( $foo_term_1 ),
     1731                        'field' => 'term_id',
     1732                    ),
     1733                    array(
     1734                        'relation' => 'OR',
     1735                        array(
     1736                            'taxonomy' => 'bar',
     1737                            'terms' => array( $bar_term_1 ),
     1738                            'field' => 'term_id',
     1739                        ),
     1740                        array(
     1741                            'taxonomy' => 'bar',
     1742                            'terms' => array( $bar_term_2 ),
     1743                            'field' => 'term_id',
     1744                        ),
     1745                    ),
     1746                ),
     1747            ),
     1748        ) );
     1749
     1750        _unregister_taxonomy( 'foo' );
     1751        _unregister_taxonomy( 'bar' );
     1752
     1753        $this->assertEqualSets( array( $p1, $p2, $p3 ), $q->posts );
     1754    }
     1755
     1756    /**
    15451757     * @ticket 20604
    15461758     * @group taxonomy
     
    19742186    /**
    19752187     * @group taxonomy
    1976      * @ticket 29718
     2188     * @ticket 29738
    19772189     */
    19782190    public function test_populate_taxonomy_query_var_from_tax_query() {
     
    20892301    /**
    20902302     * @group taxonomy
    2091      * @ticket 29718
     2303     * @ticket 29738
    20922304     */
    20932305    public function test_populate_cat_category_name_query_var_from_tax_query() {
     
    20972309        ) );
    20982310        $c = $this->factory->term->create( array(
    2099             'taxonomy' => 'foo',
     2311            'taxonomy' => 'category',
    21002312            'slug' => 'bar',
    21012313        ) );
     
    21312343    /**
    21322344     * @group taxonomy
    2133      * @ticket 29718
     2345     * @ticket 29738
    21342346     */
    21352347    public function test_populate_tag_id_query_var_from_tax_query() {
Note: See TracChangeset for help on using the changeset viewer.