wp_widget_control()
概述
wp_widget_control() 是一个 WordPress 核心函数,用于显示小部件的控制表单。它通常由 dynamic_sidebar() 调用,处理小部件在侧边栏中的配置界面输出。
关键要点
- 函数用途:生成小部件的控制表单,用于管理小部件设置。
- 调用来源:由 dynamic_sidebar() 触发,处理侧边栏中的小部件控制逻辑。
- 参数:接受 $sidebar_args 数组,包含小部件 ID、侧边栏 ID 等关键信息。
- 返回值:返回数组,但主要功能是输出 HTML 表单和控制界面。
- 内部处理:基于全局变量如 $wp_registered_widgets 和 $wp_registered_widget_controls 来获取小部件数据。
- 模板支持:支持多小部件模板模式,通过 '_display' => 'template' 参数处理通用 ID 格式。
- 安全措施:使用 esc_html()、esc_url() 等函数进行输出转义,确保安全性。
代码示例
function wp_widget_control( $sidebar_args ) {
global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets;
$widget_id = $sidebar_args['widget_id'];
// 更多代码处理小部件控制逻辑...
}注意事项
- 此函数主要用于内部调用,开发者通常无需直接使用,但理解其机制有助于自定义小部件开发。
- 在自定义小部件时,确保正确注册控制回调以与此函数兼容。
- 注意全局变量的使用,避免在插件或主题中意外修改导致问题。
Meta widget used to display the control form for a widget.
Description
Called from dynamic_sidebar() .
Parameters
$sidebar_argsarrayrequired
Source
function wp_widget_control( $sidebar_args ) {
global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets;
$widget_id = $sidebar_args['widget_id'];
$sidebar_id = isset( $sidebar_args['id'] ) ? $sidebar_args['id'] : false;
$key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[ $sidebar_id ], true ) : '-1'; // Position of widget in sidebar.
$control = isset( $wp_registered_widget_controls[ $widget_id ] ) ? $wp_registered_widget_controls[ $widget_id ] : array();
$widget = $wp_registered_widgets[ $widget_id ];
$id_format = $widget['id'];
$widget_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : '';
$id_base = isset( $control['id_base'] ) ? $control['id_base'] : $widget_id;
$width = isset( $control['width'] ) ? $control['width'] : '';
$height = isset( $control['height'] ) ? $control['height'] : '';
$multi_number = isset( $sidebar_args['_multi_num'] ) ? $sidebar_args['_multi_num'] : '';
$add_new = isset( $sidebar_args['_add'] ) ? $sidebar_args['_add'] : '';
$before_form = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '<form method="post">';
$after_form = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '</form>';
$before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '<div class="widget-content">';
$after_widget_content = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '</div>';
$query_arg = array( 'editwidget' => $widget['id'] );
if ( $add_new ) {
$query_arg['addnew'] = 1;
if ( $multi_number ) {
$query_arg['num'] = $multi_number;
$query_arg['base'] = $id_base;
}
} else {
$query_arg['sidebar'] = $sidebar_id;
$query_arg['key'] = $key;
}
/*
* We aren't showing a widget control, we're outputting a template
* for a multi-widget control.
*/
if ( isset( $sidebar_args['_display'] ) && 'template' === $sidebar_args['_display'] && $widget_number ) {
// number == -1 implies a template where id numbers are replaced by a generic '__i__'.
$control['params'][0]['number'] = -1;
// With id_base widget ID's are constructed like {$id_base}-{$id_number}.
if ( isset( $control['id_base'] ) ) {
$id_format = $control['id_base'] . '-__i__';
}
}
$wp_registered_widgets[ $widget_id ]['callback'] = $wp_registered_widgets[ $widget_id ]['_callback'];
unset( $wp_registered_widgets[ $widget_id ]['_callback'] );
$widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) );
$has_form = 'noform';
echo $sidebar_args['before_widget'];
?>
<div class="widget-top">
<div class="widget-title-action">
<button type="button" class="widget-action hide-if-no-js" aria-expanded="false">
<span class="screen-reader-text edit">
</span>
<span class="screen-reader-text add">
</span>
<span class="toggle-indicator" aria-hidden="true"></span>
</button>
<a class="widget-control-edit hide-if-js" href="<?php echo esc_url( add_query_arg( $query_arg ) ); ?>">
<span class="edit"></span>
<span class="add"></span>
<span class="screen-reader-text"></span>
</a>
</div>
<div class="widget-title"><h3><span class="in-widget-title"></span></h3></div>
</div>
<div class="widget-inside">
" . __( 'There are no options for this widget.' ) . "</p>n";
}
$noform_class = '';
if ( 'noform' === $has_form ) {
$noform_class = ' widget-control-noform';
}
?>
<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $id_format ); ?>" />
<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" />
<input type="hidden" name="widget-width" class="widget-width" value="<?php echo esc_attr( $width ); ?>" />
<input type="hidden" name="widget-height" class="widget-height" value="<?php echo esc_attr( $height ); ?>" />
<input type="hidden" name="widget_number" class="widget_number" value="<?php echo esc_attr( $widget_number ); ?>" />
<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr( $multi_number ); ?>" />
<input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr( $add_new ); ?>" />
<div class="widget-control-actions">
<div class="alignleft">
<button type="button" class="button-link button-link-delete widget-control-remove"></button>
<span class="widget-control-close-wrapper">
| <button type="button" class="button-link widget-control-close"></button>
</span>
</div>
<div class="alignright<?php echo $noform_class; ?>">
'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?>
<span class="spinner"></span>
</div>
<br class="clear" />
</div>
</div>
<div class="widget-description">
</div>
</pre><p class="wporg-dot-link-list"><a href="https://developer.wordpress.org/reference/files/wp-admin/includes/widgets.php/">View all references</a> <a href="https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-admin/includes/widgets.php#L190">View on Trac</a> <a href="https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-admin/includes/widgets.php#L190-L321">View on GitHub</a></p></section>
<section class="wp-block-wporg-code-reference-related" data-nosnippet="true"><h2 id="related" class="is-toc-heading wp-block-heading has-heading-5-font-size" tabindex="-1" ><a href="#related">Related</a></h2> <section style="margin-top:var(--wp--preset--spacing--20)" class="wp-block-wporg-code-table" id="uses"><figure class="wp-block-table "><table><thead><tr><th scope="col">Uses</th><th scope="col">Description</th></tr></thead><tbody><tr class=""><td><a href="https://developer.wordpress.org/reference/functions/submit_button/">submit_button()</a><code>wp-admin/includes/template.php
Echoes a submit button, with provided text and appropriate class(es).
_ex()wp-includes/l10n.php
Displays translated string with gettext context.
wp_widget_description()wp-includes/widgets.php
Retrieves description for widget.
__()wp-includes/l10n.php
Retrieves the translation of $text.
_e()wp-includes/l10n.php
Displays translated text.
esc_html()wp-includes/formatting.php
Escaping for HTML blocks.
esc_url()wp-includes/formatting.php
Checks and cleans a URL.
esc_attr()wp-includes/formatting.php
Escaping for HTML attributes.
add_query_arg()wp-includes/functions.php
Retrieves a modified URL query string.
| Used by | Description |
|---|---|
wp_list_widgets()wp-admin/includes/widgets.php |
Display list of the available widgets. |
WP_Customize_Widgets::get_widget_control()wp-includes/class-wp-customize-widgets.php |
Retrieves the widget control markup. |
Changelog
| Version | Description |
|---|---|
| 2.5.0 | Introduced. |