WordPress.org

Make WordPress Core

Ticket #11058: 11058-4.diff

File 11058-4.diff, 4.5 KB (added by leewillis77, 5 years 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//