WordPress: generare infinite sidebar

WordPress: generare infinite sidebar

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.

Torna su