WordPress.org

Make WordPress Core

Changeset 30141


Ignore:
Timestamp:
11/01/2014 02:57:31 AM (6 years ago)
Author:
boonebgorges
Message:

Allow resource_type to be specified in get_ancestors().

Being explicit about resource type (taxonomy vs post_type) allows for the
proper resolution of conflicts when a taxonomy and post_type share a slug.

Props filosofo.
Fixes #15029.

Location:
trunk
Files:
3 edited

Legend:

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

    r30055 r30141  
    789789    $level = 0;
    790790    if ( is_taxonomy_hierarchical($taxonomy) ) {
    791         $level = count( get_ancestors( $tag->term_id, $taxonomy ) );
     791        $level = count( get_ancestors( $tag->term_id, $taxonomy, 'taxonomy' ) );
    792792        ob_start();
    793793        $wp_list_table->single_row( $tag, $level );
  • trunk/src/wp-includes/taxonomy.php

    r30122 r30141  
    40554055        if ( $t->rewrite['hierarchical'] ) {
    40564056            $hierarchical_slugs = array();
    4057             $ancestors = get_ancestors($term->term_id, $taxonomy);
     4057            $ancestors = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' );
    40584058            foreach ( (array)$ancestors as $ancestor ) {
    40594059                $ancestor_term = get_term($ancestor, $taxonomy);
     
    42804280 * Get an array of ancestor IDs for a given object.
    42814281 *
    4282  * @param int $object_id The ID of the object
    4283  * @param string $object_type The type of object for which we'll be retrieving ancestors.
    4284  * @return array of ancestors from lowest to highest in the hierarchy.
    4285  */
    4286 function get_ancestors($object_id = 0, $object_type = '') {
     4282 * @since 3.1.0
     4283 * @since 4.1.0 Introduced the 'resource_type' parameter.
     4284 *
     4285 * @param int    $object_id     The ID of the object.
     4286 * @param string $object_type   The type of object for which we'll be retrieving ancestors.
     4287 *                              Accepts a post type or a taxonomy name.
     4288 * @param string $resource_type Optional. Type of resource $object_type is. Accepts 'post_type' or 'taxonomy'.
     4289 * @return array An array of ancestors from lowest to highest in the hierarchy.
     4290 */
     4291function get_ancestors( $object_id = 0, $object_type = '', $resource_type = '' ) {
    42874292    $object_id = (int) $object_id;
    42884293
     
    42924297
    42934298        /** This filter is documented in wp-includes/taxonomy.php */
    4294         return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type );
    4295     }
    4296 
    4297     if ( is_taxonomy_hierarchical( $object_type ) ) {
     4299        return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type );
     4300    }
     4301
     4302    if ( ! $resource_type ) {
     4303        if ( is_taxonomy_hierarchical( $object_type ) ) {
     4304            $resource_type = 'taxonomy';
     4305        } else if ( post_type_exists( $object_type ) ) {
     4306            $resource_type = 'post_type';
     4307        }
     4308    }
     4309
     4310    if ( 'taxonomy' === $resource_type ) {
    42984311        $term = get_term($object_id, $object_type);
    42994312        while ( ! is_wp_error($term) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors ) ) {
     
    43014314            $term = get_term($term->parent, $object_type);
    43024315        }
    4303     } elseif ( post_type_exists( $object_type ) ) {
     4316    } elseif ( 'post_type' === $resource_type ) {
    43044317        $ancestors = get_post_ancestors($object_id);
    43054318    }
     
    43104323     * @since 3.1.0
    43114324     *
    4312      * @param array  $ancestors   An array of object ancestors.
    4313      * @param int    $object_id   Object ID.
    4314      * @param string $object_type Type of object.
     4325     * @param array  $ancestors     An array of object ancestors.
     4326     * @param int    $object_id     Object ID.
     4327     * @param string $object_type   Type of object.
     4328     * @param string $resource_type Type of resource $object_type is.
    43154329     */
    43164330    return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type );
  • trunk/tests/phpunit/tests/taxonomy.php

    r29830 r30141  
    235235        $this->assertEquals( 0, wp_insert_category( $cat, false ) );
    236236    }
     237
     238    public function test_get_ancestors_taxonomy_non_hierarchical() {
     239        register_taxonomy( 'wptests_tax', 'post' );
     240        $t = $this->factory->term->create( array(
     241            'taxonomy' => 'wptests_tax',
     242        ) );
     243
     244        $this->assertSame( array(), get_ancestors( $t, 'wptests_tax' ) );
     245        _unregister_taxonomy( 'wptests_tax' );
     246    }
     247
     248    public function test_get_ancestors_taxonomy() {
     249        register_taxonomy( 'wptests_tax', 'post', array(
     250            'hierarchical' => true,
     251        ) );
     252        $t1 = $this->factory->term->create( array(
     253            'taxonomy' => 'wptests_tax',
     254        ) );
     255        $t2 = $this->factory->term->create( array(
     256            'taxonomy' => 'wptests_tax',
     257            'parent' => $t1,
     258        ) );
     259        $t3 = $this->factory->term->create( array(
     260            'taxonomy' => 'wptests_tax',
     261            'parent' => $t2,
     262        ) );
     263        $t4 = $this->factory->term->create( array(
     264            'taxonomy' => 'wptests_tax',
     265            'parent' => $t1,
     266        ) );
     267
     268        $this->assertEqualSets( array( $t2, $t1 ), get_ancestors( $t3, 'wptests_tax' ) );
     269        _unregister_taxonomy( 'wptests_tax' );
     270    }
     271
     272    public function test_get_ancestors_post_type_non_hierarchical() {
     273        register_post_type( 'wptests_pt' );
     274        $p = $this->factory->post->create( array(
     275            'taxonomy' => 'wptests_pt',
     276        ) );
     277
     278        $this->assertEqualSets( array(), get_ancestors( $p, 'wptests_tax' ) );
     279    }
     280
     281    public function test_get_ancestors_post_type() {
     282        register_post_type( 'wptests_pt', array(
     283            'hierarchical' => true,
     284        ) );
     285        $p1 = $this->factory->post->create( array(
     286            'post_type' => 'wptests_pt',
     287        ) );
     288        $p2 = $this->factory->post->create( array(
     289            'post_type' => 'wptests_pt',
     290            'post_parent' => $p1,
     291        ) );
     292        $p3 = $this->factory->post->create( array(
     293            'post_type' => 'wptests_pt',
     294            'post_parent' => $p2,
     295        ) );
     296        $p4 = $this->factory->post->create( array(
     297            'post_type' => 'wptests_pt',
     298            'post_parent' => $p1,
     299        ) );
     300
     301        $this->assertEqualSets( array( $p2, $p1 ), get_ancestors( $p3, 'wptests_pt' ) );
     302        _unregister_post_type( 'wptests_pt' );
     303    }
     304
     305    /**
     306     * @ticket 15029
     307     */
     308    public function test_get_ancestors_taxonomy_post_type_conflict_resource_type_taxonomy() {
     309        register_post_type( 'wptests_conflict', array(
     310            'hierarchical' => true,
     311        ) );
     312        $p1 = $this->factory->post->create( array(
     313            'post_type' => 'wptests_conflict',
     314        ) );
     315        $p2 = $this->factory->post->create( array(
     316            'post_type' => 'wptests_conflict',
     317            'post_parent' => $p1,
     318        ) );
     319
     320        register_taxonomy( 'wptests_conflict', 'post', array(
     321            'hierarchical' => true,
     322        ) );
     323        $t1 = $this->factory->term->create( array(
     324            'taxonomy' => 'wptests_conflict',
     325        ) );
     326        $t2 = $this->factory->term->create( array(
     327            'taxonomy' => 'wptests_conflict',
     328            'parent' => $t1,
     329        ) );
     330
     331        $this->assertEqualSets( array( $p1 ), get_ancestors( $p2, 'wptests_conflict', 'post_type' ) );
     332        $this->assertEqualSets( array( $t1 ), get_ancestors( $t2, 'wptests_conflict', 'taxonomy' ) );
     333        $this->assertEqualSets( array( $t1 ), get_ancestors( $t2, 'wptests_conflict' ) );
     334        _unregister_post_type( 'wptests_pt' );
     335    }
    237336}
Note: See TracChangeset for help on using the changeset viewer.