Make WordPress Core


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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.