2007-04-24 03:05:17 +02:00
< ? php
2008-08-16 09:27:34 +02:00
/**
* Widgets administration panel .
*
* @ package WordPress
* @ subpackage Administration
*/
2007-04-24 03:05:17 +02:00
2008-08-16 09:27:34 +02:00
/** WordPress Administration Bootstrap */
2008-01-05 00:34:33 +01:00
require_once ( 'admin.php' );
2008-08-16 09:27:34 +02:00
/** WordPress Administration Widgets API */
2008-02-07 22:57:54 +01:00
require_once ( ABSPATH . 'wp-admin/includes/widgets.php' );
2007-04-24 03:05:17 +02:00
2007-05-20 01:44:37 +02:00
if ( ! current_user_can ( 'switch_themes' ) )
2007-05-04 19:52:22 +02:00
wp_die ( __ ( 'Cheatin’ uh?' ));
2008-01-05 00:34:33 +01:00
wp_enqueue_script ( array ( 'wp-lists' , 'admin-widgets' ) );
2008-05-22 02:06:41 +02:00
wp_admin_css ( 'widgets' );
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
do_action ( 'sidebar_admin_setup' );
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
$title = __ ( 'Widgets' );
$parent_file = 'themes.php' ;
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
// $sidebar = What sidebar are we editing?
if ( isset ( $_GET [ 'sidebar' ]) && isset ( $wp_registered_sidebars [ $_GET [ 'sidebar' ]]) ) {
$sidebar = attribute_escape ( $_GET [ 'sidebar' ] );
} elseif ( is_array ( $wp_registered_sidebars ) && ! empty ( $wp_registered_sidebars ) ) {
// By default we look at the first defined sidebar
2008-04-17 01:09:51 +02:00
$sidebar = array_shift ( $keys = array_keys ( $wp_registered_sidebars ) );
2008-01-05 00:34:33 +01:00
} else {
// If no sidebars, die.
require_once ( 'admin-header.php' );
2007-04-29 22:16:26 +02:00
?>
2008-01-05 00:34:33 +01:00
< div class = " error " >
< p >< ? php _e ( 'No Sidebars Defined' ); ?> </p>
</ div >
2008-02-05 07:47:27 +01:00
< div class = " wrap " >
2008-01-05 00:34:33 +01:00
< p >< ? php _e ( 'You are seeing this message because the theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please <a href="http://automattic.com/code/widgets/themes/">follow these instructions</a>.' ); /* TODO: article on codex */ ; ?> </p>
</ div >
2007-04-29 22:16:26 +02:00
< ? php
2008-01-05 00:34:33 +01:00
require_once ( 'admin-footer.php' );
exit ;
2007-04-24 03:05:17 +02:00
}
2008-01-05 00:34:33 +01:00
// These are the widgets grouped by sidebar
$sidebars_widgets = wp_get_sidebars_widgets ();
if ( empty ( $sidebars_widgets ) )
$sidebars_widgets = wp_get_widget_defaults ();
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
// for the sake of PHP warnings
if ( empty ( $sidebars_widgets [ $sidebar ] ) )
$sidebars_widgets [ $sidebar ] = array ();
2007-06-14 04:25:30 +02:00
2008-03-18 00:25:05 +01:00
$http_post = 'post' == strtolower ( $_SERVER [ 'REQUEST_METHOD' ]);
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
// We're updating a sidebar
if ( $http_post && isset ( $sidebars_widgets [ $_POST [ 'sidebar' ]]) ) {
2008-03-18 00:25:05 +01:00
check_admin_referer ( 'edit-sidebar_' . $_POST [ 'sidebar' ] );
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
/* Hack #1
* The widget_control is overloaded . It updates the widget 's options AND echoes out the widget' s HTML form .
2008-02-04 21:38:48 +01:00
* Since we want to update before sending out any headers , we have to catch it with an output buffer ,
2008-01-05 00:34:33 +01:00
*/
ob_start ();
/* There can be multiple widgets of the same type , but the widget_control for that
2008-02-04 21:38:48 +01:00
* widget type needs only be called once if it ' s a multi - widget .
2008-01-05 00:34:33 +01:00
*/
$already_done = array ();
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
foreach ( $wp_registered_widget_controls as $name => $control ) {
if ( in_array ( $control [ 'callback' ], $already_done ) )
continue ;
2007-04-24 03:05:17 +02:00
2008-02-04 21:38:48 +01:00
if ( is_callable ( $control [ 'callback' ] ) ) {
2008-01-05 00:34:33 +01:00
call_user_func_array ( $control [ 'callback' ], $control [ 'params' ] );
2008-02-04 21:38:48 +01:00
$control_output = ob_get_contents ();
if ( false !== strpos ( $control_output , '%i%' ) ) // if it's a multi-widget, only call control function once.
$already_done [] = $control [ 'callback' ];
}
ob_clean ();
2008-01-05 00:34:33 +01:00
}
ob_end_clean ();
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
// Prophylactic. Take out empty ids.
foreach ( ( array ) $_POST [ 'widget-id' ] as $key => $val )
if ( ! $val )
unset ( $_POST [ 'widget-id' ][ $key ]);
2007-06-14 04:25:30 +02:00
2008-03-18 00:25:05 +01:00
// Reset the key numbering and store
2008-02-04 21:38:48 +01:00
$new_sidebar = isset ( $_POST [ 'widget-id' ] ) && is_array ( $_POST [ 'widget-id' ] ) ? array_values ( $_POST [ 'widget-id' ] ) : array ();
2008-01-05 00:34:33 +01:00
$sidebars_widgets [ $_POST [ 'sidebar' ]] = $new_sidebar ;
wp_set_sidebars_widgets ( $sidebars_widgets );
wp_redirect ( add_query_arg ( 'message' , 'updated' ) );
2007-04-24 03:05:17 +02:00
exit ;
}
2008-01-05 00:34:33 +01:00
// What widget (if any) are we editing
$edit_widget = - 1 ;
2008-03-18 00:25:05 +01:00
$query_args = array ( 'add' , 'remove' , 'key' , 'edit' , '_wpnonce' , 'message' , 'base' );
2008-01-05 00:34:33 +01:00
if ( isset ( $_GET [ 'add' ]) && $_GET [ 'add' ] ) {
// Add to the end of the sidebar
2008-03-18 00:25:05 +01:00
$control_callback ;
2008-01-05 00:34:33 +01:00
if ( isset ( $wp_registered_widgets [ $_GET [ 'add' ]]) ) {
check_admin_referer ( " add-widget_ $_GET[add] " );
$sidebars_widgets [ $sidebar ][] = $_GET [ 'add' ];
wp_set_sidebars_widgets ( $sidebars_widgets );
2008-03-18 00:25:05 +01:00
} elseif ( isset ( $_GET [ 'base' ]) && isset ( $_GET [ 'key' ]) ) { // It's a multi-widget
check_admin_referer ( " add-widget_ $_GET[add] " );
// Copy minimal info from an existing instance of this widget to a new instance
foreach ( $wp_registered_widget_controls as $control ) {
if ( $_GET [ 'base' ] === $control [ 'id_base' ] ) {
$control_callback = $control [ 'callback' ];
$num = ( int ) $_GET [ 'key' ];
$control [ 'params' ][ 0 ][ 'number' ] = $num ;
$control [ 'id' ] = $control [ 'id_base' ] . '-' . $num ;
$wp_registered_widget_controls [ $control [ 'id' ]] = $control ;
$sidebars_widgets [ $sidebar ][] = $control [ 'id' ];
break ;
}
}
}
// it's a multi-widget. The only way to add multi-widgets without JS is to actually submit POST content...
// so here we go
if ( is_callable ( $control_callback ) ) {
require_once ( 'admin-header.php' );
?>
< div class = " wrap " >
< h2 >< ? php _e ( 'Add Widget' ); ?> </h2>
< br />
< form action = " <?php echo clean_url( remove_query_arg( $query_args ) ); ?> " method = " post " >
2008-08-09 07:36:14 +02:00
2008-03-18 00:25:05 +01:00
< ul class = " widget-control-list " >
< li class = " widget-list-control-item " >
2008-05-04 04:05:18 +02:00
< div class = " widget-top " >
2008-03-18 00:25:05 +01:00
< h4 class = " widget-title " >< ? php echo $control [ 'name' ]; ?> </h4>
2008-05-04 04:05:18 +02:00
</ div >
2008-03-18 00:25:05 +01:00
< div class = " widget-control " style = " display: block; " >
< ? php
call_user_func_array ( $control_callback , $control [ 'params' ] );
?>
< div class = " widget-control-actions " >
< input type = " submit " class = " button " value = " <?php _e( 'Add Widget' ); ?> " />
< input type = " hidden " id = 'sidebar' name = 'sidebar' value = " <?php echo $sidebar ; ?> " />
< ? php wp_nonce_field ( 'edit-sidebar_' . $sidebar );
foreach ( $sidebars_widgets [ $sidebar ] as $sidebar_widget_id ) : ?>
< input type = " hidden " name = 'widget-id[]' value = " <?php echo $sidebar_widget_id ; ?> " />
< ? php endforeach ; ?>
</ div >
</ div >
</ li >
</ ul >
</ form >
</ div >
< ? php
require_once ( 'admin-footer.php' );
exit ;
2008-01-05 00:34:33 +01:00
}
wp_redirect ( remove_query_arg ( $query_args ) );
exit ;
} elseif ( isset ( $_GET [ 'remove' ]) && $_GET [ 'remove' ] && isset ( $_GET [ 'key' ]) && is_numeric ( $_GET [ 'key' ]) ) {
// Remove from sidebar the widget of type $_GET['remove'] and in position $_GET['key']
$key = ( int ) $_GET [ 'key' ];
if ( - 1 < $key && ( $keys = array_keys ( $sidebars_widgets [ $sidebar ], $_GET [ 'remove' ]) ) && in_array ( $key , $keys ) ) {
check_admin_referer ( " remove-widget_ $_GET[remove] " );
unset ( $sidebars_widgets [ $sidebar ][ $key ]);
$sidebars_widgets [ $sidebar ] = array_values ( $sidebars_widgets [ $sidebar ]);
wp_set_sidebars_widgets ( $sidebars_widgets );
}
wp_redirect ( remove_query_arg ( $query_args ) );
exit ;
} elseif ( isset ( $_GET [ 'edit' ]) && $_GET [ 'edit' ] && isset ( $_GET [ 'key' ]) && is_numeric ( $_GET [ 'key' ]) ) {
// Edit widget of type $_GET['edit'] and position $_GET['key']
$key = ( int ) $_GET [ 'key' ];
if ( - 1 < $key && ( $keys = array_keys ( $sidebars_widgets [ $sidebar ], $_GET [ 'edit' ]) ) && in_array ( $key , $keys ) )
$edit_widget = $key ;
2007-04-24 03:05:17 +02:00
}
2008-01-05 00:34:33 +01:00
// Total number of registered sidebars
$sidebar_widget_count = count ( $sidebars_widgets [ $sidebar ]);
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
// This is sort of lame since "widget" won't be converted to "widgets" in the JS
if ( 1 < $sidebars_count = count ( $wp_registered_sidebars ) )
$sidebar_info_text = __ngettext ( 'You are using %1$s widget in the "%2$s" sidebar.' , 'You are using %1$s widgets in the "%2$s" sidebar.' , $sidebar_widget_count );
else
$sidebar_info_text = __ngettext ( 'You are using %1$s widget in the sidebar.' , 'You are using %1$s widgets in the sidebar.' , $sidebar_widget_count );
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
$sidebar_info_text = sprintf ( wp_specialchars ( $sidebar_info_text ), " <span id='widget-count'> $sidebar_widget_count </span> " , $wp_registered_sidebars [ $sidebar ][ 'name' ] );
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
$page = isset ( $_GET [ 'apage' ]) ? abs ( ( int ) $_GET [ 'apage' ] ) : 1 ;
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
/* TODO : Paginate widgets list
$page_links = paginate_links ( array (
'base' => add_query_arg ( 'apage' , '%#%' ),
'format' => '' ,
'total' => ceil (( $total = 105 ) / 10 ),
'current' => $page
));
*/
2008-02-07 22:57:54 +01:00
$page_links = ' ' ;
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
// Unsanitized!
$widget_search = isset ( $_GET [ 's' ]) ? $_GET [ 's' ] : false ;
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
// Not entirely sure what all should be here
$show_values = array (
'' => $widget_search ? __ ( 'Show any widgets' ) : __ ( 'Show all widgets' ),
'unused' => __ ( 'Show unused widgets' ),
'used' => __ ( 'Show used widgets' )
);
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
$show = isset ( $_GET [ 'show' ]) && isset ( $show_values [ $_GET [ 'show' ]]) ? attribute_escape ( $_GET [ 'show' ] ) : false ;
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
$messages = array (
'updated' => __ ( 'Changes saved.' )
);
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
require_once ( 'admin-header.php' );
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
if ( isset ( $_GET [ 'message' ]) && isset ( $messages [ $_GET [ 'message' ]]) ) : ?>
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
< div id = " message " class = " updated fade " >< p >< ? php echo $messages [ $_GET [ 'message' ]]; ?> </p></div>
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
< ? php endif ; ?>
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
< div class = " wrap " >
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
< form id = " widgets-filter " action = " " method = " get " >
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
< h2 >< ? php _e ( 'Widgets' ); ?> </h2>
< p id = " widget-search " >
2008-05-04 12:37:06 +02:00
< label class = " hidden " for = " widget-search-input " >< ? php _e ( 'Search Widgets' ); ?> :</label>
2008-01-05 00:34:33 +01:00
< input type = " text " id = " widget-search-input " name = " s " value = " <?php echo attribute_escape( $widget_search ); ?> " />
2008-02-22 18:30:43 +01:00
< input type = " submit " class = " button " value = " <?php _e( 'Search Widgets' ); ?> " />
2008-01-05 00:34:33 +01:00
</ p >
2007-04-24 03:05:17 +02:00
2008-01-05 00:34:33 +01:00
< div class = " widget-liquid-left-holder " >
< div id = " available-widgets-filter " class = " widget-liquid-left " >
2008-05-04 12:37:06 +02:00
< h3 >< label for = " show " >< ? php _e ( 'Available Widgets' ); ?> </label></h3>
2008-02-07 22:57:54 +01:00
< div class = " nav " >
2008-05-04 12:37:06 +02:00
< select name = " show " id = " show " >
2008-01-05 00:34:33 +01:00
< ? php foreach ( $show_values as $show_value => $show_text ) : $show_value = attribute_escape ( $show_value ); ?>
< option value = '<?php echo $show_value; ?>' < ? php selected ( $show_value , $show ); ?> ><?php echo wp_specialchars( $show_text ); ?></option>
< ? php endforeach ; ?>
</ select >
2008-02-21 01:27:23 +01:00
< input type = " submit " value = " <?php _e('Show' ); ?> " class = " button-secondary " />
2008-02-07 22:57:54 +01:00
< p class = " pagenav " >
< ? php echo $page_links ; ?>
</ p >
</ div >
2008-01-05 00:34:33 +01:00
</ div >
2007-04-24 03:05:17 +02:00
</ div >
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
< div id = " available-sidebars " class = " widget-liquid-right " >
2008-05-04 12:37:06 +02:00
< h3 >< label for = " sidebar-selector " >< ? php _e ( 'Current Widgets' ); ?> </label></h3>
2008-01-05 00:34:33 +01:00
2008-02-07 22:57:54 +01:00
< div class = " nav " >
2008-01-05 00:34:33 +01:00
< select id = " sidebar-selector " name = " sidebar " >
< ? php foreach ( $wp_registered_sidebars as $sidebar_id => $registered_sidebar ) : $sidebar_id = attribute_escape ( $sidebar_id ); ?>
< option value = '<?php echo $sidebar_id; ?>' < ? php selected ( $sidebar_id , $sidebar ); ?> ><?php echo wp_specialchars( $registered_sidebar['name'] ); ?></option>
< ? php endforeach ; ?>
</ select >
2008-02-21 01:27:23 +01:00
< input type = " submit " value = " <?php _e('Show' ); ?> " class = " button-secondary " />
2008-02-07 22:57:54 +01:00
</ div >
2008-01-05 00:34:33 +01:00
</ div >
</ form >
< div id = " widget-content " class = " widget-liquid-left-holder " >
< div id = " available-widgets " class = " widget-liquid-left " >
< ? php wp_list_widgets ( $show , $widget_search ); // This lists all the widgets for the query ( $show, $search ) ?>
2008-02-07 22:57:54 +01:00
< div class = " nav " >
< p class = " pagenav " >
< ? php echo $page_links ; ?>
</ p >
</ div >
2008-01-05 00:34:33 +01:00
</ div >
2007-04-24 03:05:17 +02:00
</ div >
2007-06-14 04:25:30 +02:00
2008-01-05 00:34:33 +01:00
< form id = " widget-controls " action = " " method = " post " >
< div id = " current-widgets-head " class = " widget-liquid-right " >
< div id = " sidebar-info " >
< p >< ? php echo $sidebar_info_text ; ?> </p>
< p >< ? php _e ( 'Add more from the Available Widgets section.' ); ?> </p>
</ div >
</ div >
< div id = " current-widgets " class = " widget-liquid-right " >
< div id = " current-sidebar " >
2008-03-11 00:23:32 +01:00
< ? php wp_list_widget_controls ( $sidebar ); // Show the control forms for each of the widgets in this sidebar ?>
2008-01-05 00:34:33 +01:00
</ div >
2008-02-07 22:57:54 +01:00
2008-03-10 06:19:12 +01:00
< p class = " submit " >
< input type = " hidden " id = 'sidebar' name = 'sidebar' value = " <?php echo $sidebar ; ?> " />
2008-03-14 07:48:23 +01:00
< input type = " hidden " id = " generated-time " name = " generated-time " value = " <?php echo time() - 1199145600; // Jan 1, 2008 ?> " />
2008-03-10 06:19:12 +01:00
< input type = " submit " name = " save-widgets " value = " <?php _e( 'Save Changes' ); ?> " />
2008-03-18 00:25:05 +01:00
< ? php
wp_nonce_field ( 'edit-sidebar_' . $sidebar );
?>
2008-03-10 06:19:12 +01:00
</ p >
</ div >
2008-01-05 00:34:33 +01:00
</ form >
</ div >
< ? php do_action ( 'sidebar_admin_page' ); ?>
2007-06-14 04:25:30 +02:00
2008-04-23 01:48:28 +02:00
< br class = " clear " />
2008-01-05 00:34:33 +01:00
< ? php require_once ( 'admin-footer.php' ); ?>
2007-04-24 03:05:17 +02:00