函数文档

wp_ajax_widgets_order()

💡 云策文档标注

概述

wp_ajax_widgets_order() 是一个 WordPress AJAX 处理函数,用于保存小部件在侧边栏中的排序。它通过验证 AJAX 请求和用户权限,处理 POST 数据并调用 wp_set_sidebars_widgets() 来更新侧边栏小部件配置。

关键要点

  • 函数用于处理 AJAX 请求,保存小部件排序,确保用户具有 'edit_theme_options' 权限。
  • 使用 check_ajax_referer() 验证请求安全性,防止外部攻击。
  • 解析 $_POST['sidebars'] 数据,提取小部件 ID 并存储到数组,最终通过 wp_set_sidebars_widgets() 更新侧边栏配置。
  • 函数在成功或失败时调用 wp_die() 返回相应状态码(1 表示成功,-1 表示失败)。

代码示例

function wp_ajax_widgets_order() {
    check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );

    if ( ! current_user_can( 'edit_theme_options' ) ) {
        wp_die( -1 );
    }

    unset( $_POST['savewidgets'], $_POST['action'] );

    // Save widgets order for all sidebars.
    if ( is_array( $_POST['sidebars'] ) ) {
        $sidebars = array();

        foreach ( wp_unslash( $_POST['sidebars'] ) as $key => $val ) {
            $sb = array();

            if ( ! empty( $val ) ) {
                $val = explode( ',', $val );

                foreach ( $val as $k => $v ) {
                    if ( ! str_contains( $v, 'widget-' ) ) {
                        continue;
                    }

                    $sb[ $k ] = substr( $v, strpos( $v, '_' ) + 1 );
                }
            }
            $sidebars[ $key ] = $sb;
        }

        wp_set_sidebars_widgets( $sidebars );
        wp_die( 1 );
    }

    wp_die( -1 );
}

注意事项

  • 函数依赖于 AJAX 请求,需确保前端正确发送包含 'sidebars' 数据的 POST 请求。
  • 用户权限检查是关键,只有具有 'edit_theme_options' 能力的用户才能执行此操作。
  • 数据解析时使用 wp_unslash() 处理转义字符,确保小部件 ID 正确提取。

📄 原文内容

Handles saving the widgets order via AJAX.

Source

function wp_ajax_widgets_order() {
	check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );

	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	unset( $_POST['savewidgets'], $_POST['action'] );

	// Save widgets order for all sidebars.
	if ( is_array( $_POST['sidebars'] ) ) {
		$sidebars = array();

		foreach ( wp_unslash( $_POST['sidebars'] ) as $key => $val ) {
			$sb = array();

			if ( ! empty( $val ) ) {
				$val = explode( ',', $val );

				foreach ( $val as $k => $v ) {
					if ( ! str_contains( $v, 'widget-' ) ) {
						continue;
					}

					$sb[ $k ] = substr( $v, strpos( $v, '_' ) + 1 );
				}
			}
			$sidebars[ $key ] = $sb;
		}

		wp_set_sidebars_widgets( $sidebars );
		wp_die( 1 );
	}

	wp_die( -1 );
}

Changelog

Version Description
3.1.0 Introduced.