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:
* https://www.php.net/manual/en/function.array-key-exists.php#refsect1-function.array-key-exists-notes

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

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

git-svn-id: https://develop.svn.wordpress.org/trunk@52173 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Tonya Mork 2021-11-16 01:41:23 +00:00
parent 6ec3f649b7
commit 13b52a310f
2 changed files with 42 additions and 1 deletions

View File

@ -365,7 +365,7 @@ class WP_Widget {
$this->_set( $widget_args['number'] );
$instances = $this->get_settings();
if ( array_key_exists( $this->number, $instances ) ) {
if ( isset( $instances[ $this->number ] ) ) {
$instance = $instances[ $this->number ];
/**

View File

@ -590,6 +590,47 @@ class Tests_Widgets extends WP_UnitTestCase {
// @todo Test WP_Widget::display_callback().
/**
* @ticket 52728
*/
function test_widget_display_callback_handles_arrayobject() {
$widget = new WP_Widget_Text();
register_widget( $widget );
add_filter(
"pre_option_{$widget->option_name}",
static function() {
return new ArrayObject(
array(
2 => array( 'title' => 'Test Title' ),
'_multiwidget' => 1,
'__i__' => true,
)
);
}
);
// Effectively ignore the output until retrieving it later via `getActualOutput()`.
$this->expectOutputRegex( '`.`' );
$widget->display_callback(
array(
'before_widget' => '<section>',
'after_widget' => "</section>\n",
'before_title' => '<h2>',
'after_title' => "</h2>\n",
),
2
);
$actual = $this->getActualOutput();
unregister_widget( $widget );
$this->assertStringContainsString( 'Test Title', $actual );
}
/**
* @see WP_Widget::is_preview()
*/