Generare infinite sidebar è sicuramente una caratteristica molto richiesta dai temi di WordPress. Vediamo insieme come ottenere questo risultato.
Definire la pagina di opzioni del tema
Definiamo per prima cosa la pagina di opzioni del tema dove generare le sidebar:
<?php
class ThemeAdmin {
public function __construct() {
add_action( 'init', array($this, 'registerSidebar') );
add_action( 'admin_menu', array($this, 'setupThemeAdminMenus' ));
}
public function setupThemeAdminMenus() {
/* Cambiate 'tema' e 'Tema' con il nome del vostro tema.
* Il percorso dell'icona del menu è a titolo d'esempio.
*/
add_menu_page('Tema: Opzioni', 'Opzioni tema', 'manage_options',
'tema_theme_settings', array($this, 'themeSettingsPage'), get_template_directory_uri() . '/framework/admin/img/admin-menu-icon.png');
add_submenu_page('tema_theme_settings',
'Sidebar', 'Sidebar', 'manage_options',
'tema_sidebar', array($this, 'sidebarPage'));
}
public function themeSettingsPage() {
// Opzioni generali
}
public function registerSidebar() {
/* Usa l'array dei nomi delle sidebar memorizzato nell'opzione 'sidebars'
* e ne confronta le voci con l'array di WP $wp_registered_sidebars.
* Se la sidebar non è nell'array di WP viene creata
*/
global $wp_registered_sidebars;
$sidebars = get_option('sidebars');
if(count($sidebars) > 0) {
foreach($sidebars as $sidebar) {
if(!in_array($sidebar, $wp_registered_sidebars)) {
register_sidebar(array('name'=> $sidebar,
'before_widget' => '<div class="widget">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>',
));
}
}
}
}
public function sidebarPage() {
?>
<h2>Sidebar</h2>
<?php if(isset($_POST['update_settings'])) {
/* Registra il nome della sidebar scelta dall'utente
* nell'array 'sidebars' registrato come opzione del tema
*/
add_option('sidebars', array());
$new_sidebar = esc_attr($_POST['sidebars']);
$sidebars = get_option('sidebars');
if(count($sidebars) == 0) {
$newsidebars = array();
} else {
$newsidebars = $sidebars;
}
$newsidebars[] = $new_sidebar;
update_option('sidebars', $newsidebars);
?>
<div id="message" class="updated">Sidebar aggiunta</div>
<?php } ?>
<form method="post" action="">
<p>Qui potete creare nuove sidebar</p>
<p>
<label>Nome della sidebar</label>
<input type="text" name="sidebars" id="sidebars"/>
<p>
<input type="submit" value="Aggiungi" class="button-primary"/>
<input type="hidden" name="update_settings" value="Y" />
</p>
</form>
<?php
}
}
$admin = new ThemeAdmin();
?>
Inserire le sidebar nel tema
Possiamo far scegliere agli utenti la sidebar voluta con un semplice dropdown menu:
<?php
class ThemeSidebar {
public function __construct() {
add_action( 'admin_init', array($this, 'sidebarMetaBox'));
add_action( 'save_post', array($this, 'saveSidebar'));
}
public function sidebarMetaBox() {
add_meta_box("sidebar-meta", "Sidebar", array(&$this, 'sidebarMetaOptions'), "post", "side", "low");
add_meta_box("sidebar-meta", "Sidebar", array(&$this, 'sidebarMetaOptions'), "page", "side", "low");
}
public function sidebarMetaOptions() {
global $post;
global $wp_registered_sidebars;
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
$custom = get_post_custom($post->ID);
$sidebar = $custom["sidebar"][0];
?>
<label>Sidebar:</label>
<select name="sidebar">
<?php
foreach($wp_registered_sidebars as $bar) {
$bar_name = $bar['name'];
?>
<option value="<?php echo $bar_name; ?>" <?php if($bar_name == $sidebar) { ?> selected="selected" <?php } ?>><?php echo $bar_name; ?></option>
<?php
}
?>
</select>
<?php
}
public function saveSidebar(){
global $post;
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ){
return $post_id;
}else{
update_post_meta($post->ID, 'sidebar', $_POST["sidebar"]);
}
}
}
$sidebar = new ThemeSidebar();
?>
Modificare il file sidebar.php
Il file sidebar.php
va modificato in questo modo:
<div id="widget-area">
<?php
global $post;
$id = $post->ID;
$sidebar = get_post_meta($id, 'sidebar', true);
if($sidebar != '') {
dynamic_sidebar($sidebar);
} else {
dynamic_sidebar('Sidebar predefinita');
}
?>
</div>
Usare il codice
Le classi ThemeAdmin
e ThemeSidebar
vanno in due file separati che possiamo richiamare nel file functions.php
:
<?php
require_once(TEMPLATEPATH . '/framework/ThemeAdmin.php');
require_once(TEMPLATEPATH . '/framework/ThemeSidebar.php');
?>
Ovviamente sostituite il percorso con quello scelto da voi.