WordPress.org

Make WordPress Core

Ticket #11058: 11058-4.diff

File 11058-4.diff, 4.5 KB (added by leewillis77, 19 months ago)

Adds initial unit tests

  • tests/tests/taxonomy.php

     
    103103        function test_register_long_taxonomy() { 
    104104                $this->assertInstanceOf( 'WP_Error', register_taxonomy( 'abcdefghijklmnopqrstuvwxyz0123456789', 'post', array() ) ); 
    105105        } 
     106 
     107        function test_registering_taxonomies_to_object_types() { 
     108 
     109                // Create a taonomy to test with 
     110                $tax = rand_str(10); 
     111                $this->assertFalse( taxonomy_exists($tax) ); 
     112                register_taxonomy( $tax, 'post', array( 'hierarchical' => true ) ); 
     113 
     114                // Create a post type to test with 
     115                $post_type = rand_str(10); 
     116                $this->assertFalse( get_post_type( $post_type ) ); 
     117                $this->assertObjectHasAttribute( 'name', register_post_type( $post_type ) ); 
     118 
     119                // Core taxonomy, core post type 
     120                $this->assertTrue( unregister_taxonomy_from_object_type( 'category', 'post' ) ); 
     121                $this->assertFalse( unregister_taxonomy_from_object_type( 'category', 'post' ) ); 
     122                $this->assertTrue( register_taxonomy_for_object_type( 'category', 'post' ) ); 
     123 
     124                // Core taxonomy, non-core post type 
     125                $this->assertTrue( register_taxonomy_for_object_type( 'category', $post_type ) ); 
     126                $this->assertTrue( unregister_taxonomy_from_object_type( 'category', $post_type ) ); 
     127                $this->assertFalse( unregister_taxonomy_from_object_type( 'category', $post_type ) ); 
     128                $this->assertTrue( register_taxonomy_for_object_type( 'category', $post_type ) ); 
     129 
     130                // Core taxonomies, non-post object types 
     131                $this->assertFalse( register_taxonomy_for_object_type( 'category', 'user' ) ); 
     132                $this->assertFalse( unregister_taxonomy_from_object_type( 'category', 'user' ) ); 
     133 
     134                // Non-core taxonomy, core post type 
     135                $this->assertTrue( unregister_taxonomy_from_object_type( $tax, 'post' ) ); 
     136                $this->assertFalse( unregister_taxonomy_from_object_type( $tax, 'post' ) ); 
     137                $this->assertTrue( register_taxonomy_for_object_type( $tax, 'post' ) ); 
     138 
     139                // Non-core taxonomy, non-core post type 
     140                $this->assertTrue( register_taxonomy_for_object_type( $tax, $post_type ) ); 
     141                $this->assertTrue( unregister_taxonomy_from_object_type( $tax, $post_type ) ); 
     142                $this->assertFalse( unregister_taxonomy_from_object_type( $tax, $post_type ) ); 
     143                $this->assertTrue( register_taxonomy_for_object_type( $tax, $post_type ) ); 
     144 
     145                // Non-core taxonomies, non-post object types 
     146                $this->assertFalse( register_taxonomy_for_object_type( $tax, 'user' ) ); 
     147                $this->assertFalse( unregister_taxonomy_from_object_type( $tax, 'user' ) ); 
     148 
     149                unset($GLOBALS['wp_taxonomies'][$tax]); 
     150                _unregister_post_type( $post_type ); 
     151 
     152        } 
    106153} 
  • src/wp-includes/taxonomy.php

     
    477477 * @param string $object_type Name of the object type 
    478478 * @return bool True if successful, false if not 
    479479 */ 
    480 function register_taxonomy_for_object_type( $taxonomy, $object_type) { 
     480function register_taxonomy_for_object_type( $taxonomy, $object_type ) { 
    481481        global $wp_taxonomies; 
    482482 
    483         if ( !isset($wp_taxonomies[$taxonomy]) ) 
     483        if ( ! isset( $wp_taxonomies[$taxonomy] ) ) 
    484484                return false; 
    485485 
    486         if ( ! get_post_type_object($object_type) ) 
     486        // If a single taxonomy handles both a post type and a non-post type, you 
     487        // can end up with ID conflicts, so we only allow this for post-type 
     488        // objects. 
     489        if ( ! get_post_type_object( $object_type ) ) 
    487490                return false; 
    488491 
    489492        if ( ! in_array( $object_type, $wp_taxonomies[$taxonomy]->object_type ) ) 
     
    492495        return true; 
    493496} 
    494497 
     498/** 
     499 * Remove an already registered taxonomy from an object type. 
     500 * 
     501 * @package WordPress 
     502 * @subpackage Taxonomy 
     503 * @since 3.7.0 
     504 * @uses $wp_taxonomies Modifies taxonomy object 
     505 * 
     506 * @param string $taxonomy Name of taxonomy object 
     507 * @param string $object_type Name of the object type 
     508 * @return bool True if successful, false if not 
     509 */ 
     510function unregister_taxonomy_from_object_type( $taxonomy, $object_type ) { 
     511        global $wp_taxonomies; 
     512 
     513        if ( ! isset( $wp_taxonomies[$taxonomy] ) ) 
     514                return false; 
     515 
     516        // For consistency with register_taxonomy_for_object_type() 
     517        if ( ! get_post_type_object( $object_type ) ) 
     518                return false; 
     519 
     520        foreach ( array_keys( $wp_taxonomies[$taxonomy]->object_type ) as $array_key ) { 
     521                if ( $wp_taxonomies[$taxonomy]->object_type[$array_key] === $object_type ) { 
     522                        unset( $wp_taxonomies[$taxonomy]->object_type[$array_key] ); 
     523                        return true; 
     524                } 
     525        } 
     526 
     527        return false; 
     528} 
     529 
    495530// 
    496531// Term API 
    497532//