wp/wp-admin/includes/widgets.php
changeset 9 177826044cd9
parent 7 cf61fcea0001
child 16 a86126ab1dd4
equal deleted inserted replaced
8:c7c34916027a 9:177826044cd9
    20 	$sort = $wp_registered_widgets;
    20 	$sort = $wp_registered_widgets;
    21 	usort( $sort, '_sort_name_callback' );
    21 	usort( $sort, '_sort_name_callback' );
    22 	$done = array();
    22 	$done = array();
    23 
    23 
    24 	foreach ( $sort as $widget ) {
    24 	foreach ( $sort as $widget ) {
    25 		if ( in_array( $widget['callback'], $done, true ) ) // We already showed this multi-widget
    25 		if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget
    26 			continue;
    26 			continue;
       
    27 		}
    27 
    28 
    28 		$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );
    29 		$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );
    29 		$done[] = $widget['callback'];
    30 		$done[]  = $widget['callback'];
    30 
    31 
    31 		if ( ! isset( $widget['params'][0] ) )
    32 		if ( ! isset( $widget['params'][0] ) ) {
    32 			$widget['params'][0] = array();
    33 			$widget['params'][0] = array();
    33 
    34 		}
    34 		$args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' );
    35 
    35 
    36 		$args = array(
    36 		if ( isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number']) ) {
    37 			'widget_id'   => $widget['id'],
    37 			$id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
    38 			'widget_name' => $widget['name'],
    38 			$args['_temp_id'] = "$id_base-__i__";
    39 			'_display'    => 'template',
    39 			$args['_multi_num'] = next_widget_id_number($id_base);
    40 		);
    40 			$args['_add'] = 'multi';
    41 
       
    42 		if ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ) {
       
    43 			$id_base            = $wp_registered_widget_controls[ $widget['id'] ]['id_base'];
       
    44 			$args['_temp_id']   = "$id_base-__i__";
       
    45 			$args['_multi_num'] = next_widget_id_number( $id_base );
       
    46 			$args['_add']       = 'multi';
    41 		} else {
    47 		} else {
    42 			$args['_add'] = 'single';
    48 			$args['_add'] = 'single';
    43 			if ( $sidebar )
    49 			if ( $sidebar ) {
    44 				$args['_hide'] = '1';
    50 				$args['_hide'] = '1';
    45 		}
    51 			}
    46 
    52 		}
    47 		$args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) );
    53 
       
    54 		$args = wp_list_widget_controls_dynamic_sidebar(
       
    55 			array(
       
    56 				0 => $args,
       
    57 				1 => $widget['params'][0],
       
    58 			)
       
    59 		);
    48 		call_user_func_array( 'wp_widget_control', $args );
    60 		call_user_func_array( 'wp_widget_control', $args );
    49 	}
    61 	}
    50 }
    62 }
    51 
    63 
    52 /**
    64 /**
    76 	$description = wp_sidebar_description( $sidebar );
    88 	$description = wp_sidebar_description( $sidebar );
    77 
    89 
    78 	echo '<div id="' . esc_attr( $sidebar ) . '" class="widgets-sortables">';
    90 	echo '<div id="' . esc_attr( $sidebar ) . '" class="widgets-sortables">';
    79 
    91 
    80 	if ( $sidebar_name ) {
    92 	if ( $sidebar_name ) {
       
    93 		$add_to = sprintf(
       
    94 			/* translators: %s: widgets sidebar name. */
       
    95 			__( 'Add to: %s' ),
       
    96 			$sidebar_name
       
    97 		);
    81 		?>
    98 		?>
    82 		<div class="sidebar-name">
    99 		<div class="sidebar-name" data-add-to="<?php echo esc_attr( $add_to ); ?>">
    83 			<button type="button" class="handlediv hide-if-no-js" aria-expanded="true">
   100 			<button type="button" class="handlediv hide-if-no-js" aria-expanded="true">
    84 				<span class="screen-reader-text"><?php echo esc_html( $sidebar_name ); ?></span>
   101 				<span class="screen-reader-text"><?php echo esc_html( $sidebar_name ); ?></span>
    85 				<span class="toggle-indicator" aria-hidden="true"></span>
   102 				<span class="toggle-indicator" aria-hidden="true"></span>
    86 			</button>
   103 			</button>
    87 			<h2><?php echo esc_html( $sidebar_name ); ?> <span class="spinner"></span></h2>
   104 			<h2><?php echo esc_html( $sidebar_name ); ?> <span class="spinner"></span></h2>
   118 	global $wp_registered_widgets;
   135 	global $wp_registered_widgets;
   119 	static $i = 0;
   136 	static $i = 0;
   120 	$i++;
   137 	$i++;
   121 
   138 
   122 	$widget_id = $params[0]['widget_id'];
   139 	$widget_id = $params[0]['widget_id'];
   123 	$id = isset($params[0]['_temp_id']) ? $params[0]['_temp_id'] : $widget_id;
   140 	$id        = isset( $params[0]['_temp_id'] ) ? $params[0]['_temp_id'] : $widget_id;
   124 	$hidden = isset($params[0]['_hide']) ? ' style="display:none;"' : '';
   141 	$hidden    = isset( $params[0]['_hide'] ) ? ' style="display:none;"' : '';
   125 
   142 
   126 	$params[0]['before_widget'] = "<div id='widget-{$i}_{$id}' class='widget'$hidden>";
   143 	$params[0]['before_widget'] = "<div id='widget-{$i}_{$id}' class='widget'$hidden>";
   127 	$params[0]['after_widget'] = "</div>";
   144 	$params[0]['after_widget']  = '</div>';
   128 	$params[0]['before_title'] = "%BEG_OF_TITLE%"; // deprecated
   145 	$params[0]['before_title']  = '%BEG_OF_TITLE%'; // deprecated
   129 	$params[0]['after_title'] = "%END_OF_TITLE%"; // deprecated
   146 	$params[0]['after_title']   = '%END_OF_TITLE%'; // deprecated
   130 	if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) {
   147 	if ( is_callable( $wp_registered_widgets[ $widget_id ]['callback'] ) ) {
   131 		$wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
   148 		$wp_registered_widgets[ $widget_id ]['_callback'] = $wp_registered_widgets[ $widget_id ]['callback'];
   132 		$wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';
   149 		$wp_registered_widgets[ $widget_id ]['callback']  = 'wp_widget_control';
   133 	}
   150 	}
   134 
   151 
   135 	return $params;
   152 	return $params;
   136 }
   153 }
   137 
   154 
   138 /**
   155 /**
   139  *
       
   140  * @global array $wp_registered_widgets
   156  * @global array $wp_registered_widgets
   141  *
   157  *
   142  * @param string $id_base
   158  * @param string $id_base
   143  * @return int
   159  * @return int
   144  */
   160  */
   145 function next_widget_id_number( $id_base ) {
   161 function next_widget_id_number( $id_base ) {
   146 	global $wp_registered_widgets;
   162 	global $wp_registered_widgets;
   147 	$number = 1;
   163 	$number = 1;
   148 
   164 
   149 	foreach ( $wp_registered_widgets as $widget_id => $widget ) {
   165 	foreach ( $wp_registered_widgets as $widget_id => $widget ) {
   150 		if ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) )
   166 		if ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) ) {
   151 			$number = max($number, $matches[1]);
   167 			$number = max( $number, $matches[1] );
       
   168 		}
   152 	}
   169 	}
   153 	$number++;
   170 	$number++;
   154 
   171 
   155 	return $number;
   172 	return $number;
   156 }
   173 }
   170  * @return array
   187  * @return array
   171  */
   188  */
   172 function wp_widget_control( $sidebar_args ) {
   189 function wp_widget_control( $sidebar_args ) {
   173 	global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets;
   190 	global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets;
   174 
   191 
   175 	$widget_id = $sidebar_args['widget_id'];
   192 	$widget_id  = $sidebar_args['widget_id'];
   176 	$sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;
   193 	$sidebar_id = isset( $sidebar_args['id'] ) ? $sidebar_args['id'] : false;
   177 	$key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : '-1'; // position of widget in sidebar
   194 	$key        = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[ $sidebar_id ] ) : '-1'; // position of widget in sidebar
   178 	$control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : array();
   195 	$control    = isset( $wp_registered_widget_controls[ $widget_id ] ) ? $wp_registered_widget_controls[ $widget_id ] : array();
   179 	$widget = $wp_registered_widgets[$widget_id];
   196 	$widget     = $wp_registered_widgets[ $widget_id ];
   180 
   197 
   181 	$id_format = $widget['id'];
   198 	$id_format     = $widget['id'];
   182 	$widget_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
   199 	$widget_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : '';
   183 	$id_base = isset($control['id_base']) ? $control['id_base'] : $widget_id;
   200 	$id_base       = isset( $control['id_base'] ) ? $control['id_base'] : $widget_id;
   184 	$multi_number = isset($sidebar_args['_multi_num']) ? $sidebar_args['_multi_num'] : '';
   201 	$width         = isset( $control['width'] ) ? $control['width'] : '';
   185 	$add_new = isset($sidebar_args['_add']) ? $sidebar_args['_add'] : '';
   202 	$height        = isset( $control['height'] ) ? $control['height'] : '';
   186 
   203 	$multi_number  = isset( $sidebar_args['_multi_num'] ) ? $sidebar_args['_multi_num'] : '';
   187 	$before_form = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '<form method="post">';
   204 	$add_new       = isset( $sidebar_args['_add'] ) ? $sidebar_args['_add'] : '';
   188 	$after_form = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '</form>';
   205 
       
   206 	$before_form           = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '<form method="post">';
       
   207 	$after_form            = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '</form>';
   189 	$before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '<div class="widget-content">';
   208 	$before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '<div class="widget-content">';
   190 	$after_widget_content = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '</div>';
   209 	$after_widget_content  = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '</div>';
   191 
   210 
   192 	$query_arg = array( 'editwidget' => $widget['id'] );
   211 	$query_arg = array( 'editwidget' => $widget['id'] );
   193 	if ( $add_new ) {
   212 	if ( $add_new ) {
   194 		$query_arg['addnew'] = 1;
   213 		$query_arg['addnew'] = 1;
   195 		if ( $multi_number ) {
   214 		if ( $multi_number ) {
   196 			$query_arg['num'] = $multi_number;
   215 			$query_arg['num']  = $multi_number;
   197 			$query_arg['base'] = $id_base;
   216 			$query_arg['base'] = $id_base;
   198 		}
   217 		}
   199 	} else {
   218 	} else {
   200 		$query_arg['sidebar'] = $sidebar_id;
   219 		$query_arg['sidebar'] = $sidebar_id;
   201 		$query_arg['key'] = $key;
   220 		$query_arg['key']     = $key;
   202 	}
   221 	}
   203 
   222 
   204 	/*
   223 	/*
   205 	 * We aren't showing a widget control, we're outputting a template
   224 	 * We aren't showing a widget control, we're outputting a template
   206 	 * for a multi-widget control.
   225 	 * for a multi-widget control.
   207 	 */
   226 	 */
   208 	if ( isset($sidebar_args['_display']) && 'template' == $sidebar_args['_display'] && $widget_number ) {
   227 	if ( isset( $sidebar_args['_display'] ) && 'template' == $sidebar_args['_display'] && $widget_number ) {
   209 		// number == -1 implies a template where id numbers are replaced by a generic '__i__'
   228 		// number == -1 implies a template where id numbers are replaced by a generic '__i__'
   210 		$control['params'][0]['number'] = -1;
   229 		$control['params'][0]['number'] = -1;
   211 		// With id_base widget id's are constructed like {$id_base}-{$id_number}.
   230 		// With id_base widget id's are constructed like {$id_base}-{$id_number}.
   212 		if ( isset($control['id_base']) )
   231 		if ( isset( $control['id_base'] ) ) {
   213 			$id_format = $control['id_base'] . '-__i__';
   232 			$id_format = $control['id_base'] . '-__i__';
   214 	}
   233 		}
   215 
   234 	}
   216 	$wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback'];
   235 
   217 	unset($wp_registered_widgets[$widget_id]['_callback']);
   236 	$wp_registered_widgets[ $widget_id ]['callback'] = $wp_registered_widgets[ $widget_id ]['_callback'];
       
   237 	unset( $wp_registered_widgets[ $widget_id ]['_callback'] );
   218 
   238 
   219 	$widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) );
   239 	$widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) );
   220 	$has_form = 'noform';
   240 	$has_form     = 'noform';
   221 
   241 
   222 	echo $sidebar_args['before_widget']; ?>
   242 	echo $sidebar_args['before_widget'];
       
   243 	?>
   223 	<div class="widget-top">
   244 	<div class="widget-top">
   224 	<div class="widget-title-action">
   245 	<div class="widget-title-action">
   225 		<button type="button" class="widget-action hide-if-no-js" aria-expanded="false">
   246 		<button type="button" class="widget-action hide-if-no-js" aria-expanded="false">
   226 			<span class="screen-reader-text"><?php printf( __( 'Edit widget: %s' ), $widget_title ); ?></span>
   247 			<span class="screen-reader-text edit"><?php printf( __( 'Edit widget: %s' ), $widget_title ); ?></span>
       
   248 			<span class="screen-reader-text add"><?php printf( __( 'Add widget: %s' ), $widget_title ); ?></span>
   227 			<span class="toggle-indicator" aria-hidden="true"></span>
   249 			<span class="toggle-indicator" aria-hidden="true"></span>
   228 		</button>
   250 		</button>
   229 		<a class="widget-control-edit hide-if-js" href="<?php echo esc_url( add_query_arg( $query_arg ) ); ?>">
   251 		<a class="widget-control-edit hide-if-js" href="<?php echo esc_url( add_query_arg( $query_arg ) ); ?>">
   230 			<span class="edit"><?php _ex( 'Edit', 'widget' ); ?></span>
   252 			<span class="edit"><?php _ex( 'Edit', 'widget' ); ?></span>
   231 			<span class="add"><?php _ex( 'Add', 'widget' ); ?></span>
   253 			<span class="add"><?php _ex( 'Add', 'widget' ); ?></span>
   240 	<?php echo $before_widget_content; ?>
   262 	<?php echo $before_widget_content; ?>
   241 	<?php
   263 	<?php
   242 	if ( isset( $control['callback'] ) ) {
   264 	if ( isset( $control['callback'] ) ) {
   243 		$has_form = call_user_func_array( $control['callback'], $control['params'] );
   265 		$has_form = call_user_func_array( $control['callback'], $control['params'] );
   244 	} else {
   266 	} else {
   245 		echo "\t\t<p>" . __('There are no options for this widget.') . "</p>\n";
   267 		echo "\t\t<p>" . __( 'There are no options for this widget.' ) . "</p>\n";
       
   268 	}
       
   269 
       
   270 	$noform_class = '';
       
   271 	if ( 'noform' === $has_form ) {
       
   272 		$noform_class = ' widget-control-noform';
   246 	}
   273 	}
   247 	?>
   274 	?>
   248 	<?php echo $after_widget_content; ?>
   275 	<?php echo $after_widget_content; ?>
   249 	<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr($id_format); ?>" />
   276 	<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $id_format ); ?>" />
   250 	<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" />
   277 	<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" />
   251 	<input type="hidden" name="widget-width" class="widget-width" value="<?php if (isset( $control['width'] )) echo esc_attr($control['width']); ?>" />
   278 	<input type="hidden" name="widget-width" class="widget-width" value="<?php echo esc_attr( $width ); ?>" />
   252 	<input type="hidden" name="widget-height" class="widget-height" value="<?php if (isset( $control['height'] )) echo esc_attr($control['height']); ?>" />
   279 	<input type="hidden" name="widget-height" class="widget-height" value="<?php echo esc_attr( $height ); ?>" />
   253 	<input type="hidden" name="widget_number" class="widget_number" value="<?php echo esc_attr($widget_number); ?>" />
   280 	<input type="hidden" name="widget_number" class="widget_number" value="<?php echo esc_attr( $widget_number ); ?>" />
   254 	<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr($multi_number); ?>" />
   281 	<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr( $multi_number ); ?>" />
   255 	<input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr($add_new); ?>" />
   282 	<input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr( $add_new ); ?>" />
   256 
   283 
   257 	<div class="widget-control-actions">
   284 	<div class="widget-control-actions">
   258 		<div class="alignleft">
   285 		<div class="alignleft">
   259 			<button type="button" class="button-link button-link-delete widget-control-remove"><?php _e( 'Delete' ); ?></button>
   286 			<button type="button" class="button-link button-link-delete widget-control-remove"><?php _e( 'Delete' ); ?></button>
   260 			<span class="widget-control-close-wrapper">
   287 			<span class="widget-control-close-wrapper">
   261 				|
   288 				|
   262 				<button type="button" class="button-link widget-control-close"><?php _e( 'Done' ); ?></button>
   289 				<button type="button" class="button-link widget-control-close"><?php _e( 'Done' ); ?></button>
   263 			</span>
   290 			</span>
   264 		</div>
   291 		</div>
   265 		<div class="alignright<?php if ( 'noform' === $has_form ) echo ' widget-control-noform'; ?>">
   292 		<div class="alignright<?php echo $noform_class; ?>">
   266 			<?php submit_button( __( 'Save' ), 'primary widget-control-save right', 'savewidget', false, array( 'id' => 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?>
   293 			<?php submit_button( __( 'Save' ), 'primary widget-control-save right', 'savewidget', false, array( 'id' => 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?>
   267 			<span class="spinner"></span>
   294 			<span class="spinner"></span>
   268 		</div>
   295 		</div>
   269 		<br class="clear" />
   296 		<br class="clear" />
   270 	</div>
   297 	</div>
   271 	<?php echo $after_form; ?>
   298 	<?php echo $after_form; ?>
   272 	</div>
   299 	</div>
   273 
   300 
   274 	<div class="widget-description">
   301 	<div class="widget-description">
   275 <?php echo ( $widget_description = wp_widget_description($widget_id) ) ? "$widget_description\n" : "$widget_title\n"; ?>
   302 	<?php echo ( $widget_description = wp_widget_description( $widget_id ) ) ? "$widget_description\n" : "$widget_title\n"; ?>
   276 	</div>
   303 	</div>
   277 <?php
   304 	<?php
   278 	echo $sidebar_args['after_widget'];
   305 	echo $sidebar_args['after_widget'];
   279 
   306 
   280 	return $sidebar_args;
   307 	return $sidebar_args;
   281 }
   308 }
   282 
   309 
   283 /**
   310 /**
   284  *
       
   285  * @param string $classes
   311  * @param string $classes
   286  * @return string
   312  * @return string
   287  */
   313  */
   288 function wp_widgets_access_body_class($classes) {
   314 function wp_widgets_access_body_class( $classes ) {
   289 	return "$classes widgets_access ";
   315 	return "$classes widgets_access ";
   290 }
   316 }