Make WordPress Core

Changeset 48356


Ignore:
Timestamp:
07/07/2020 12:53:41 AM (5 years ago)
Author:
whyisjake
Message:

Taxonomy: Add support for default terms for custom taxonomies.

The new default_term argument is added to register_taxonomy() allowing a user to define the default term name and optionally slug and description.

Fixes #43517.

Props enrico.sorcinelli, SergeyBiryukov, desrosj, davidbaumwald, whyisjake.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/capabilities.php

    r48167 r48356  
    540540            }
    541541
    542             if ( 'delete_term' === $cap && ( get_option( 'default_' . $term->taxonomy ) == $term->term_id ) ) {
     542            if ( 'delete_term' === $cap && ( get_option( 'default_' . $term->taxonomy ) == $term->term_id || get_option( 'default_taxonomy_' . $term->taxonomy ) == $term->term_id ) ) {
    543543                $caps[] = 'do_not_allow';
    544544                break;
  • trunk/src/wp-includes/class-wp-taxonomy.php

    r48273 r48356  
    209209     */
    210210    public $rest_controller_class;
     211
     212    /**
     213     * The default term name for this taxonomy. If you pass an array you have
     214     * to set 'name' and optionally 'slug' and 'description'.
     215     *
     216     * @since 5.5.0
     217     * @var array|string
     218     */
     219    public $default_term;
    211220
    212221    /**
     
    289298            'rest_base'             => false,
    290299            'rest_controller_class' => false,
     300            'default_term'          => null,
    291301            '_builtin'              => false,
    292302        );
     
    387397        }
    388398
     399        // Default taxonomy term.
     400        if ( ! empty( $args['default_term'] ) ) {
     401            if ( ! is_array( $args['default_term'] ) ) {
     402                $args['default_term'] = array( 'name' => $args['default_term'] );
     403            }
     404            $args['default_term'] = wp_parse_args(
     405                $args['default_term'],
     406                array(
     407                    'name'        => '',
     408                    'slug'        => '',
     409                    'description' => '',
     410                )
     411            );
     412        }
     413
    389414        foreach ( $args as $property_name => $property_value ) {
    390415            $this->$property_name = $property_value;
  • trunk/src/wp-includes/post.php

    r48314 r48356  
    40344034    }
    40354035
     4036    // Add default term for all associated custom taxonomies.
     4037    if ( 'auto-draft' !== $post_status ) {
     4038        foreach ( get_object_taxonomies( $post_type, 'object' ) as $taxonomy => $tax_object ) {
     4039            if ( ! empty( $tax_object->default_term ) && ( empty( $postarr['tax_input'] ) || ! isset( $postarr['tax_input'][ $taxonomy ] ) ) ) {
     4040                $postarr['tax_input'][ $taxonomy ] = array();
     4041            }
     4042        }
     4043    }
     4044
    40364045    // New-style support for all custom taxonomies.
    40374046    if ( ! empty( $postarr['tax_input'] ) ) {
  • trunk/src/wp-includes/taxonomy.php

    r48314 r48356  
    336336 * @since 5.1.0 Introduced `meta_box_sanitize_cb` argument.
    337337 * @since 5.4.0 Added the registered taxonomy object as a return value.
     338 * @since 5.5.0 Introduced `default_term` argument.
    338339 *
    339340 * @global array $wp_taxonomies Registered taxonomies.
     
    407408 *                                                counting them. Default _update_generic_term_count() for taxonomies
    408409 *                                                attached to other object types, such as users.
     410 *     @type string|array  $default_term {
     411 *         Default term to be used for the taxonomy.
     412 *
     413 *         @type string $name         Name of default term.
     414 *         @type string $slug         Slug for default term. Default empty.
     415 *         @type string $description  Description for default term. Default empty.
     416 *     }
    409417 *     @type bool          $_builtin              This taxonomy is a "built-in" taxonomy. INTERNAL USE ONLY!
    410418 *                                                Default false.
     
    432440
    433441    $taxonomy_object->add_hooks();
     442
     443    // Add default term.
     444    if ( ! empty( $taxonomy_object->default_term ) ) {
     445        if ( $term = term_exists( $taxonomy_object->default_term['name'], $taxonomy ) ) {
     446            update_option( 'default_taxonomy_' . $taxonomy_object->name, $term['term_id'] );
     447        } else {
     448            $term = wp_insert_term(
     449                $taxonomy_object->default_term['name'],
     450                $taxonomy,
     451                array(
     452                    'slug'        => sanitize_title( $taxonomy_object->default_term['slug'] ),
     453                    'description' => $taxonomy_object->default_term['description'],
     454                )
     455            );
     456
     457            // Update term id in options.
     458            if ( ! is_wp_error( $term ) ) {
     459                update_option( 'default_taxonomy_' . $taxonomy_object->name, $term['term_id'] );
     460            }
     461        }
     462    }
    434463
    435464    /**
     
    24832512    }
    24842513
     2514    // Add default term.
     2515    $taxonomy_obj = get_taxonomy( $taxonomy );
     2516
     2517    // Default term for this taxonomy.
     2518    if ( empty( $terms ) && ! empty( $taxonomy_obj->default_term ) && ! empty( $default_term_id = get_option( 'default_taxonomy_' . $taxonomy ) ) ) {
     2519        $terms[] = (int) $default_term_id;
     2520    }
     2521
    24852522    if ( ! $append ) {
    24862523        $old_tt_ids = wp_get_object_terms(
  • trunk/tests/phpunit/tests/taxonomy.php

    r47186 r48356  
    966966        $this->assertEquals( $problematic_term, $term_name );
    967967    }
     968
     969    /**
     970     * Test default term for custom taxonomy.
     971     *
     972     * @ticket 43517
     973     */
     974    function test_default_term_for_custom_taxonomy() {
     975
     976        wp_set_current_user( self::factory()->user->create( array( 'role' => 'editor' ) ) );
     977
     978        $tax = 'custom-tax';
     979
     980        // Create custom taxonomy to test with.
     981        register_taxonomy(
     982            $tax,
     983            'post',
     984            array(
     985                'hierarchical' => true,
     986                'public'       => true,
     987                'default_term' => array(
     988                    'name' => 'Default category',
     989                    'slug' => 'default-category',
     990                ),
     991            )
     992        );
     993
     994        // Add post.
     995        $post_id = wp_insert_post(
     996            array(
     997                'post_title' => 'Foo',
     998                'post_type'  => 'post',
     999            )
     1000        );
     1001
     1002        $term = wp_get_post_terms( $post_id, $tax );
     1003        $this->assertSame( get_option( 'default_taxonomy_' . $tax ), $term[0]->term_id );
     1004
     1005        // Add custom post type.
     1006        register_post_type(
     1007            'post-custom-tax',
     1008            array(
     1009                'taxonomies' => array( $tax ),
     1010            )
     1011        );
     1012        $post_id = wp_insert_post(
     1013            array(
     1014                'post_title' => 'Foo',
     1015                'post_type'  => 'post-custom-tax',
     1016            )
     1017        );
     1018        $term    = wp_get_post_terms( $post_id, $tax );
     1019        $this->assertSame( get_option( 'default_taxonomy_' . $tax ), $term[0]->term_id );
     1020    }
    9681021}
Note: See TracChangeset for help on using the changeset viewer.