Make WordPress Core

Changeset 48880


Ignore:
Timestamp:
08/27/2020 02:46:22 AM (4 years ago)
Author:
SergeyBiryukov
Message:

Taxonomy: Make sure wp_terms_checklist() and Walker_Category_Checklist::start_el() properly handle an array of strings as selected_cats or popular_cats values.

Even with these values documented as an array of integers, they can technically also accept an array of strings, e.g. as form results.

Add a unit test.

Props brianhogg, TimothyBlynJacobs, SergeyBiryukov.
Fixes #51137.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/class-walker-category-checklist.php

    r47557 r48880  
    8282        }
    8383
    84         $args['popular_cats'] = empty( $args['popular_cats'] ) ? array() : $args['popular_cats'];
     84        $args['popular_cats'] = ! empty( $args['popular_cats'] ) ? array_map( 'intval', $args['popular_cats'] ) : array();
    8585
    8686        $class = in_array( $category->term_id, $args['popular_cats'], true ) ? ' class="popular-category"' : '';
    8787
    88         $args['selected_cats'] = empty( $args['selected_cats'] ) ? array() : $args['selected_cats'];
     88        $args['selected_cats'] = ! empty( $args['selected_cats'] ) ? array_map( 'intval', $args['selected_cats'] ) : array();
    8989
    9090        if ( ! empty( $args['list_only'] ) ) {
  • trunk/src/wp-admin/includes/template.php

    r48760 r48880  
    121121
    122122    if ( is_array( $parsed_args['selected_cats'] ) ) {
    123         $args['selected_cats'] = $parsed_args['selected_cats'];
     123        $args['selected_cats'] = array_map( 'intval', $parsed_args['selected_cats'] );
    124124    } elseif ( $post_id ) {
    125125        $args['selected_cats'] = wp_get_object_terms( $post_id, $taxonomy, array_merge( $args, array( 'fields' => 'ids' ) ) );
     
    129129
    130130    if ( is_array( $parsed_args['popular_cats'] ) ) {
    131         $args['popular_cats'] = $parsed_args['popular_cats'];
     131        $args['popular_cats'] = array_map( 'intval', $parsed_args['popular_cats'] );
    132132    } else {
    133133        $args['popular_cats'] = get_terms(
  • trunk/tests/phpunit/tests/admin/includesTemplate.php

    r48858 r48880  
    44 */
    55class Tests_Admin_includesTemplate extends WP_UnitTestCase {
     6
    67    function test_equal() {
    78        $this->assertEquals( ' selected=\'selected\'', selected( 'foo', 'foo', false ) );
     
    4546        $this->assertEquals( '', selected( 0, false, false ) );
    4647        $this->assertEquals( '', checked( 0, false, false ) );
     48    }
     49
     50    /**
     51     * @ticket 51147
     52     * @dataProvider data_wp_terms_checklist_with_selected_cats
     53     */
     54    public function test_wp_terms_checklist_with_selected_cats( $term_id ) {
     55        $output = wp_terms_checklist(
     56            0,
     57            array(
     58                'selected_cats' => array( $term_id ),
     59                'echo'          => false,
     60            )
     61        );
     62
     63        $this->assertContains( "checked='checked'", $output );
     64    }
     65
     66    /**
     67     * @ticket 51147
     68     * @dataProvider data_wp_terms_checklist_with_selected_cats
     69     */
     70    public function test_wp_terms_checklist_with_popular_cats( $term_id ) {
     71        $output = wp_terms_checklist(
     72            0,
     73            array(
     74                'popular_cats' => array( $term_id ),
     75                'echo'         => false,
     76            )
     77        );
     78
     79        $this->assertContains( 'class="popular-category"', $output );
     80    }
     81
     82    public function data_wp_terms_checklist_with_selected_cats() {
     83        return array(
     84            array( '1' ),
     85            array( 1 ),
     86        );
    4787    }
    4888
Note: See TracChangeset for help on using the changeset viewer.