Make WordPress Core

Changeset 52173


Ignore:
Timestamp:
11/16/2021 01:41:23 AM (3 years ago)
Author:
hellofromTonya
Message:

Widgets: Use isset() in WP_Widget:: display_callback() to support ArrayIterator and ArrayObject.

[33696] introduced support returning ArrayIterator and ArrayObject objects from WP_Widget::get_settings().

Per the PHP manual, array_key_exists() stopped supporting this in PHP 8.0.0 and deprecated in PHP 7.4.0.

For backward compatibility reasons, array_key_exists() will also return true if key is a property defined within an object given as array. This behaviour is deprecated as of PHP 7.4.0, and removed as of PHP 8.0.0.

This commit uses isset() instead of array_key_exists() which is supported on all current versions of PHP.

Includes unit tests.

Ref:

Follow-up to [32602], [33696].

Props dlh, hellofromTonya, jrf, sergeybiryukov.
Fixes #52728.

Location:
trunk
Files:
2 edited

Legend:

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

    r51070 r52173  
    366366        $instances = $this->get_settings();
    367367
    368         if ( array_key_exists( $this->number, $instances ) ) {
     368        if ( isset( $instances[ $this->number ] ) ) {
    369369            $instance = $instances[ $this->number ];
    370370
  • trunk/tests/phpunit/tests/widgets.php

    r52010 r52173  
    590590
    591591    // @todo Test WP_Widget::display_callback().
     592
     593    /**
     594     * @ticket 52728
     595     */
     596    function test_widget_display_callback_handles_arrayobject() {
     597        $widget = new WP_Widget_Text();
     598
     599        register_widget( $widget );
     600
     601        add_filter(
     602            "pre_option_{$widget->option_name}",
     603            static function() {
     604                return new ArrayObject(
     605                    array(
     606                        2              => array( 'title' => 'Test Title' ),
     607                        '_multiwidget' => 1,
     608                        '__i__'        => true,
     609                    )
     610                );
     611            }
     612        );
     613
     614        // Effectively ignore the output until retrieving it later via `getActualOutput()`.
     615        $this->expectOutputRegex( '`.`' );
     616
     617        $widget->display_callback(
     618            array(
     619                'before_widget' => '<section>',
     620                'after_widget'  => "</section>\n",
     621                'before_title'  => '<h2>',
     622                'after_title'   => "</h2>\n",
     623            ),
     624            2
     625        );
     626
     627        $actual = $this->getActualOutput();
     628
     629        unregister_widget( $widget );
     630
     631        $this->assertStringContainsString( 'Test Title', $actual );
     632    }
    592633
    593634    /**
Note: See TracChangeset for help on using the changeset viewer.