Skip to content

Register widgets from PHP

PHP driven registration of the Widgets in #WordPress can be quite confusing. There is my way how to handle it:

class Widgets {
private $widgets = [];
private $options = [];
public function __construct() {
$this->options = wp_get_sidebars_widgets();
}
public function unregisterAllWidgets() {
foreach ($this->options as $name => $values)
$this->options[$name] = [];
}
public function cleanWidgetSettings($type, $multi = null) {
$this->widgets[$type] = [];
if ($multi !== null) $this->widgets[$type]['_multiwidget'] = (int)(bool)$multi;
}
public function setMultiWidget($type, $val = 1) {
$this->widgets[$type]['_multiwidget'] = $val;
}
public function add($type, array $options, $area = null) {
$this->widgets[$type][] = $options;
if ($area !== null) {
if (array_key_exists($area, $this->options) === false) {
throw new Exception('Widget area ' . $area . ' not exists.');
}
end($this->widgets[$type]);
$this->options[$area][] = $type . '-' . key($this->widgets[$type]);
}
}
public function __destruct() {
foreach ($this->widgets as $name => $settings) {
if (!array_key_exists('_multiwidget', $settings)) $settings['_multiwidget'] = 1;
update_option('widget_' . $name, $settings);
}
wp_set_sidebars_widgets($this->options);
}
}

Following code is an example how to use class Witgets:

$widgets = new Widgets();
$widgets->unregisterAllWidgets();
$widgets->add('text', [
'title' => 'About us',
'text' => 'Simple text about us',
'filter' => true,
'classes' => '',
'ids' => null,
],
'cmdFooter-1'
);
// ...

This code need to be call only once. Put your code to function.php to after_switch_theme action:

add_action(
'after_switch_theme', function () {
$widgets = new Widgets();
$widgets->unregisterAllWidgets();
// ...
}
);