Handles saving a widget via AJAX.
function wp_ajax_save_widget() {
global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;
check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );
if ( ! current_user_can( 'edit_theme_options' ) || ! isset( $_POST['id_base'] ) ) {
wp_die( -1 );
}
unset( $_POST['savewidgets'], $_POST['action'] );
/**
* Fires early when editing the widgets displayed in sidebars.
*
* @since 2.8.0
*/
do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/**
* Fires early when editing the widgets displayed in sidebars.
*
* @since 2.8.0
*/
do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/** This action is documented in wp-admin/widgets.php */
do_action( 'sidebar_admin_setup' );
$id_base = wp_unslash( $_POST['id_base'] );
$widget_id = wp_unslash( $_POST['widget-id'] );
$sidebar_id = $_POST['sidebar'];
$multi_number = ! empty( $_POST['multi_number'] ) ? (int) $_POST['multi_number'] : 0;
$settings = isset( $_POST[ 'widget-' . $id_base ] ) && is_array( $_POST[ 'widget-' . $id_base ] ) ? $_POST[ 'widget-' . $id_base ] : false;
$error = '<p>' . __( 'An error has occurred. Please reload the page and try again.' ) . '</p>';
$sidebars = wp_get_sidebars_widgets();
$sidebar = isset( $sidebars[ $sidebar_id ] ) ? $sidebars[ $sidebar_id ] : array();
// Delete.
if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) {
if ( ! isset( $wp_registered_widgets[ $widget_id ] ) ) {
wp_die( $error );
}
$sidebar = array_diff( $sidebar, array( $widget_id ) );
$_POST = array(
'sidebar' => $sidebar_id,
'widget-' . $id_base => array(),
'the-widget-id' => $widget_id,
'delete_widget' => '1',
);
/** This action is documented in wp-admin/widgets.php */
do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );
} elseif ( $settings && preg_match( '/__i__|%i%/', key( $settings ) ) ) {
if ( ! $multi_number ) {
wp_die( $error );
}
$_POST[ 'widget-' . $id_base ] = array( $multi_number => reset( $settings ) );
$widget_id = $id_base . '-' . $multi_number;
$sidebar[] = $widget_id;
}
$_POST['widget-id'] = $sidebar;
foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
if ( $name === $id_base ) {
if ( ! is_callable( $control['callback'] ) ) {
continue;
}
ob_start();
call_user_func_array( $control['callback'], $control['params'] );
ob_end_clean();
break;
}
}
if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) {
$sidebars[ $sidebar_id ] = $sidebar;
wp_set_sidebars_widgets( $sidebars );
echo "deleted:$widget_id";
wp_die();
}
if ( ! empty( $_POST['add_new'] ) ) {
wp_die();
}
$form = $wp_registered_widget_controls[ $widget_id ];
if ( $form ) {
call_user_func_array( $form['callback'], $form['params'] );
}
wp_die();
}
Fires immediately after a widget has been marked for deletion.
Fires early when editing the widgets displayed in sidebars.
Fires early before the Widgets administration screen loads, after scripts are enqueued.
Fires early when editing the widgets displayed in sidebars.
| Version | Description |
|---|---|
| 3.1.0 | Introduced. |
© 2003–2024 WordPress Foundation
Licensed under the GNU GPLv2+ License.
https://developer.wordpress.org/reference/functions/wp_ajax_save_widget