Home User profile
tagDiv Member
This user did not write anything. So we are just showing here some random text to make the profile page look nice :)
Smartesider
tagDiv Member

We ran into a reproducible issue with the Newsmag theme (tagDiv Composer) when importing a demo on PHP 8.2.

Symptoms:

tagDiv Importer stops with error:
Fatal error: Uncaught TypeError: Cannot access offset of type string on string in td_demo_util.php

Log also shows Undefined variable $sidebars_widgets and Automatic conversion of false to array is deprecated.

Root cause:
In td_demo_widgets::add_widget_to_sidebar(), the code uses $sidebars_widgets before it’s retrieved from get_option(‘sidebars_widgets’) and normalised.
PHP 8.x is stricter about this than PHP 7.x — in PHP 7 it silently converted null/false to array; in PHP 8 it throws a fatal error.

Workaround:
Patch the function to fetch and normalise $sidebars_widgets before using it. Here’s a minimal fix:

static function add_widget_to_sidebar($sidebar_id, $widget_name, $atts) {

$tmp_sidebars = td_options::get_array('sidebars');
if (empty($tmp_sidebars)) {
$tmp_sidebars = array();
}
if (!in_array('td-' . $sidebar_id, self::$hard_coded_sidebars) &&
!in_array($sidebar_id, $tmp_sidebars)
) {
self::kill(__CLASS__, __FUNCTION__,
'No sidebar with the name provided! - td-' . $sidebar_id,
array_merge(self::$hard_coded_sidebars, $tmp_sidebars)
);
}

// Normalise $atts
if (!is_array($atts)) {
if (is_string($atts)) {
$tmp = json_decode($atts, true);
$atts = is_array($tmp) ? $tmp : array();
} else {
$atts = array();
}
}

// FIX: Get and normalise $sidebars_widgets BEFORE using
$sidebars_widgets = get_option('sidebars_widgets');
if (!is_array($sidebars_widgets)) {
$sidebars_widgets = array();
}
$sb_key = 'td-' . td_util::sidebar_name_to_id($sidebar_id);
if (!isset($sidebars_widgets[$sb_key]) || !is_array($sidebars_widgets[$sb_key])) {
$sidebars_widgets[$sb_key] = array();
}

// Normalise widget instances
$opt_key = 'widget_' . $widget_name;
$widget_instances = get_option($opt_key);
if (!is_array($widget_instances)) {
$widget_instances = array();
}

// Add instance
$widget_instances[self::$last_widget_instance] = $atts;
update_option($opt_key, $widget_instances);

// Assign widget to sidebar
$sidebars_widgets[$sb_key][self::$last_sidebar_widget_position] =
$widget_name . '-' . self::$last_widget_instance;
update_option('sidebars_widgets', $sidebars_widgets);

self::$last_sidebar_widget_position++;
self::$last_widget_instance++;
}

Notes:

Tested on PHP 8.2.29 with Plesk Obsidian and Newsmag 5.4.3.3.

This patch allows the demo importer to complete successfully without downgrading PHP.

The EXIF warnings you may see in logs during import are unrelated and non-fatal.

If tagDiv devs see this — moving the $sidebars_widgets = get_option(‘sidebars_widgets’) block up in the function would resolve this for all PHP 8+ users.

Smartesider
tagDiv Member

Hi,

My php is 8.3, running on Cyberpanel and mariasql.
Tried uploading and overwriting all files in the mentioned paths, but did not solve anything.

Caching was not yet enabled.

Thank you so much for your input.

Viewing 2 posts - 1 through 2 (of 2 total)