APPUNTI

Menu plugin WordPress con una semplice classe in Php

Di seguito vi riporto la semplice classe che ho scritto in php per aggiungere un menu a un plugin custom di wordpress

Per includerla ed usarla nel codice del plugin che si sta realizzando, create un file dal nome plugin-menu.php nella cartella class del plugin (se non esiste la dir createla), e incollate il codice della classe nel nuovo file php. Inserite poi le seguenti righe di codice nel file principale del plugin custom per richiamarla:

// Includo e carico la classe epa_plugin_menu

require_once( dirname( __FILE__ ) . '/class/plugin-menu.php');

Per evitare conflitti tra plugin, alla classe viene impostato un nomespace che deve essere dichiarato all’inizio del codice, ad esempio potrebbe essere il nome univoco del plugin oppure anche semplicemente dir_nome_plugin_classe, dove dir_nome_plugin è il nome della directory del plugin.

A secondo del tipo di menu che desiderate inserire nel vostro plugin, commentate o decommentate il codice aiutandovi con i commenti presenti nel codice, buon lavoro.

<?php
/*
 * Class Genera Menu Admin Plugin EPA
 *
 * @link              https://www.paliotti.itPer includere ed usare la classe nel codice del plugin che si sta creando,
 * inserire decommentando le seguenti righe di codice nel file principale del plugin:
 *
 * // Includo e carico la classe epa_plugin_menu
 * require_once( dirname( __FILE__ ) . '/class/plugin-menu.php');
 *
 * Per evitare conflitti tra plugin, alla classe viene impostato un nomespace che deve essere dichiarato all'inizio del codice,
 * ad esempio potrebbe essere il nome univoco del plugin oppure anche semplicemente dir_nome_plugin/class/plugin-stato
 * dove dir_nome_plugin è il nome della directory del plugin
 * @Ver:              1.0.2
 * @author:           Enzo Paliotti <enzo@paliotti.it>
 * @author URI:       https://www.paliotti.it
 *
 * Per includere ed usare la classe nel codice del plugin che si sta creando,
 * inserire decommentando le seguenti righe di codice nel file principale del plugin:
 *
 * // Includo e carico la classe epa_plugin_menu
 * require_once( dirname( __FILE__ ) . '/class/plugin-menu.php');
 *
 * Per evitare conflitti tra plugin, alla classe viene impostato un nomespace che deve essere dichiarato all'inizio del codice,
 * ad esempio potrebbe essere il nome univoco del plugin oppure anche semplicemente dir_nome_plugin_class_plugin-stato
 * dove dir_nome_plugin è il nome della directory del plugin
 *  
 */
namespace my_name_plugin; // con il nomespace viene impostato anche come SLUG del plugin

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'epa_plugin_menu', true ) ) {
	
	class epa_plugin_menu {
		
		public $slug = __NAMESPACE__;
		//public $slug = 'epa_social_1_1_0';
		
		public function __construct() {
			// hook per generare la pagina di option setting
			add_action('admin_init',  [ $this, 'page_option_settings_init'] );
			
			// hook per richiamare la funzione per generare nell'admin un nuovo menu
			// per questo plugin, commentare/decommentare per attivare/disattivare
			add_action( 'admin_menu',  [ $this,'epa_menu_admin'] );
			
			// hook per richiamare la funzione che generare nel menu admin un link/voce
			// alla pagina option del plugin, commentare/decommentare per attivare/disattivare
			add_action('admin_menu',  [ $this, 'menu_options_page'] );
					
			// hook per richiamare la funzione che genera nel menu admin impostazione un link/voce
			// alla pagina option del plugin, commentare/decommentare per attivare/disattivare
			add_action( 'admin_menu',  [ $this,'epa_menu_setup'] );
		
		}
		
		// funzione per sanificare gli input della pagina di setup
		function plugin_sanitize_options($data){
		
			 $old_options = get_option($this->slug.'_options');
			 $has_errors = false;

    		if (empty($data['field_name'])) {
        		add_settings_error( $this->slug.'_messages', $this->slug.'_message', __('Il Nome è obbligatorio', $this->slug), 'error');        		
        		$has_errors = true;
        		unset($data['field_name']);        		
        	}
        	
        	if (empty($data['field_email'])) {
        		unset($data['field_email']);        		
        		add_settings_error( $this->slug.'_messages', $this->slug.'_message', __('L\'indirizzo email è obbligatorio', $this->slug), 'error');
        		$has_errors = true;        	
        	}
        	
        	if ( !empty($data['field_email']) && !is_email($data['field_email'])) {
        		add_settings_error( $this->slug.'_messages', $this->slug.'_message', __('L\'indirizzo email non è valido', $this->slug), 'error');        		
        		unset($data['field_email']); 
        		$has_errors = true;
        	}
        	
        	if ($has_errors) {
        		//$data = $old_options;        		
        	}        	

			return $data;	
		
		}
		
		// funzione per generale il menu option del plugin
		function menu_options_page() {
			
			add_menu_page(
				__('Epa Plugin Setup', $this->slug.'_setup'), // titolo della pagina
				__('Epa Plugin Setup', $this->slug.'_setup'), // label voce menu
				'manage_options', // permessi utente
				$this->slug.'_setup', // slug pagina
				[$this, 'plugin_options_page_html'] // chiamo la funzione
			);		
			
		}
		
		// Funzione per aggiungere una voce al menu impostazioni admin per il plugin
		function epa_menu_setup() {
			
				// la capacità utente per accedere al menu del plugin, normalmente è manage_options
				$capacity='manage_options';
				add_options_page(
					__('Epa Setup Plugin', $this->slug.'_setup'),
					__('Epa Setup Plugin', $this->slug.'_setup'),
					$capacity, 
					$this->slug.'_setup',
					[$this, 'plugin_options_page_html'],	
				);
		
		}
		
		// funzione per generare la pagina di optione del plugin
		function plugin_options_page_html() {
			if (!current_user_can('manage_options')) {
				
				return;
			
			}
			if ($_SERVER['SCRIPT_NAME']<>'/wp-admin/options-general.php'){
				
				if (isset($_GET['settings-updated']) && empty(get_settings_errors($this->slug.'_messages'))) {
					
					add_settings_error($this->slug.'_messages', $this->slug.'_message', __('Dati salvati con successo.', $this->slug), 'updated');
			
				}
				
				settings_errors($this->slug.'_messages');

			}
			?>
      	<div class="wrap">
      		<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
         	<form action="options.php" method="post">
           		<?php
           		settings_fields($this->slug);
              	do_settings_sections($this->slug);
              	submit_button(__('Salva le modifiche',$this->slug));
              	?>
         	</form>
      	</div>
    		<?php
		}
		// end function
		
		function page_option_settings_init() {
			
			register_setting(
				$this->slug,
				$this->slug.'_options',
				['type' => 'array', 'sanitize_callback' => [ $this ,'plugin_sanitize_options'],]
			);

    		add_settings_section(
    			$this->slug.'_section_info',
    			__('Informazioni Base', $this->slug),
    			function ($args) {
    				?>
    				<p id="<?php echo esc_attr($args['id']); ?>"><?php esc_html_e('Qui una breve descrizione delle informazioni di base di quest\'area del plugin', $this->slug); ?></p>
    				<?php    				
				},
    			$this->slug,
    		);
    		
    		add_settings_field(
    			$this->slug.'_field_name', // nome input
    			__('Nome', $this->slug),
    			function ($args){
    				 $options = get_option( $this->slug.'_options');
    				 ?>
    				 <input class="regular-text" placeholder="Mario Rossi" type="text" id="<?php echo esc_attr($args['label_for']); ?>" name="<?php echo $this->slug?>_options[<?php echo esc_attr($args['label_for']); ?>]" value="<?php echo esc_attr($options[$args['label_for']]); ?>" />
    				 <p class="description">
    				 <?php esc_html_e('Inserisci il nome.', $this->slug); ?>
    				 </p>
    				 <?php    			
    			},
    			$this->slug,
    			$this->slug.'_section_info',
    			array(
    				'label_for' => 'field_name', // imposta anche il nome del input 
    				'class' => $this->slug.'_row',
       		)
       	);
       	
       	add_settings_field(
    			$this->slug.'_field_email', // nome input
    			__('Indirizzo Email', $this->slug),
    			function ($args){
    				 $options = get_option( $this->slug.'_options');
    				 ?>
    				 <input class="regular-text" placeholder="mario.rossi@example.com" type="text" id="<?php echo esc_attr($args['label_for']); ?>" name="<?php echo $this->slug?>_options[<?php echo esc_attr($args['label_for']); ?>]" value="<?php echo esc_attr($options[$args['label_for']]); ?>" />
    				 <p class="description">
    				 <?php esc_html_e('Inserisci l\'indirizzo email.', $this->slug); ?>
    				 </p>
    				 <?php    			
    			},
    			$this->slug,
    			$this->slug.'_section_info',
    			array(
    				'label_for' => 'field_email', // imposta anche il nome del input 
    				'class' => $this->slug.'_row',
       		)
       	);
			
			add_settings_field(
				$this->slug.'_menu_setting_opt_a', // nome specifico field
				__('Opzioni Gruppo A', $this->slug), // nome label option
				function ($args){
					$options = get_option( $this->slug.'_options' ); // il nome del campo option_name
					$optA_1=esc_attr( $options['optA']['optA_1'] ); // nome Array, nome input 
					$optA_2=esc_attr( $options['optA']['optA_2'] ); // nome Array, nome input 
					if ( $optA_1=="1"){ $optA_1='checked="checked"';}
					if ( $optA_2=="1"){ $optA_2='checked="checked"';}					
					echo '
					<fieldset>
						<label for="'.$this->slug.'_opt_a_1">
							<input id="'.$this->slug.'_opt_a_1" name="'.$this->slug.'_options[optA][optA_1]" type="checkbox" value="1" '.$optA_1.' />
							'.__('OptA1',$this->slug).'
						</label>
						<br>
						<label for="'.$this->slug.'_opt_a_2">
							<input id="'.$this->slug.'_opt_a_2" name="'.$this->slug.'_options[optA][optA_2]" type="checkbox" value="1" '.$optA_2.' />
							'.__('OptA2',$this->slug).'
						</label>
						<br>
					</fieldset>
					<p class="description">'.__('Qui una breve descrizione delle opzioni di quest\'area.',$this->slug).'</p>';					
				},
				$this->slug,
				$this->slug.'_section_info',
				array(
    				'label_for' => 'field_optA', // imposta anche il nome del input 
    				'class' => $this->slug.'_row',
    				'id' => 'field_optA',
       		)
			);			
			
			add_settings_field(
				$this->slug.'_menu_setting_opt_b', // nome specifico field
				__('Opzioni Gruppo B', $this->slug), // nome label option
				function ($args){
					$options = get_option( $this->slug.'_options' ); // il nome del campo option_name
    				$value=esc_attr( $options['optB'] );
    				if ($value==""){ $optB_0='selected="selected"';}
    				elseif ($value=="before_content"){ $optB_1='selected="selected"';}
    				elseif ($value=="after_content"){ $optB_2='selected="selected"';}
    				elseif ($value=="before_after_content"){ $optB_3='selected="selected"';}
    				echo '<select name="'.$this->slug.'_options[optB]" id="'.esc_attr($args['label_for']).'">
    				<option value="" '.$optB_0.'>Non visibile</option>
    				<option value="before_content" '.$optB_1.'>Prima del contenuto</option>
    				<option value="after_content" '.$optB_2.'>Dopo il contenuto</option>
    				<option value="before_after_content" '.$optB_3.'>Prima e dopo il contenuto</option>		
    				</select>
    				<p class="description">'.__('Qui una breve descrizione delle opzioni di quest\'area.',$this->slug).'</p>';
				},
				$this->slug,
				$this->slug.'_section_info',
				array(
    				'label_for' => 'field_optB', // imposta anche il nome del input 
    				'class' => $this->slug.'_row',
    				'id' => 'field_optB',
       		)
			);
			
			add_settings_field(
				$this->slug.'_menu_setting_opt_c',
				__('Opzioni Gruppo C', $this->slug),
				function ($args){
					$options = get_option( $this->slug.'_options' ); // il nome del campo option_name
					$optC_1=esc_attr( $options['optC']['optC_1'] ); // nome Array, nome input 
					$optC_2=esc_attr( $options['optC']['optC_2'] ); // nome Array, nome input 
					$optC_3=esc_attr( $options['optC']['optC_3'] ); // nome Array, nome input 
					if ( $optC_1=="1"){ $optC_1='checked="checked"';}
					if ( $optC_2=="1"){ $optC_2='checked="checked"';}
					if ( $optC_3=="1"){ $optC_3='checked="checked"';}					
					echo '
					<fieldset id="'.esc_attr($args['label_for']).'">
						<label for="'.$this->slug.'_optC_1">
							<input id="'.$this->slug.'_optC_1" name="'.$this->slug.'_options[optC][optC_1]" type="checkbox" value="1" '.$optC_1.' />
							'.__('OptC1',$this->slug).'
						</label>
						<br>
						<label for="'.$this->slug.'_optC_2">
							<input id="'.$this->slug.'_optC_2" name="'.$this->slug.'_options[optC][optC_2]" type="checkbox" value="1" '.$optC_2.' />
							'.__('OptC2',$this->slug).'
						</label>
						<br>
						<label for="'.$this->slug.'_optC_3">
							<input id="'.$this->slug.'_optC_3" name="'.$this->slug.'_options[optC][optC_3]" type="checkbox" value="1" '.$optC_3.' />
							'.__('OptC3',$this->slug).'
						</label>
						<br>
					</fieldset>
					<p class="description">'.__('Qui una breve descrizione delle opzioni di quest\'area.',$this->slug).'</p>';					
				},
				$this->slug,
				$this->slug.'_section_info',
				array(
    				'label_for' => 'field_optC', // imposta anche il nome del input 
    				'class' => $this->slug.'_row',
       		)
			);				
		
		}
		
		// Funzione per creare un nuovo menu admin per il plugin
		public function epa_menu_admin() {
			
			// il ruolo utente autorizzato ad accedere al menu del plugin, normalmente è administrator
			$capacity='administrator';
			// posizione del menu sulla barra admin
			$posizione=2;
			$icona='dashicons-welcome-widgets-menus';
			add_menu_page(
				__('Epa Plugin Menu', $this->slug),
				__('Epa Plugin Menu', $this->slug),
				$capacity,
				$this->slug.'_admin_menu',
				/************************************************************************* 
				Decommentando la riga successiva e impostando il nome, si può richiamare
				una funzione esterna oppure una funziona incorporata come sotto riportato.
				*************************************************************************/ 
				// 'my_function_one';  
				function () {
					/************************************************************************ 
					Decommentando la riga successiva e impostando percorso e nome, si può
					includere un file php con il codice da eseguire nella funzione,
					oppure includere direttamente il codice come sotto riportato.
					************************************************************************/ 
					// include_once plugin_dir_path( __FILE__ ) . 'inc/menu/page_one.php';
					echo '
					<div class="wrap">
      				<h1>'.esc_html(get_admin_page_title()).'</h1>
      				<h2>ecco il contenuto di questa pagina del plugin</h2>
         	  	</div>';										
				},
				$icona,
				$posizione
			);
							     
			// prima voce del menu del plugin
			add_submenu_page( $this->slug.'_admin_menu', __('Bacheca', $this->slug), __('Bacheca', $this->slug), $capacity, $this->slug.'_admin_menu');
			
			// seconda voce del menu del plugin
			add_submenu_page( 
				$this->slug.'_admin_menu',
				__('Two Voice Menu', $this->slug),
				__('Two Voice Menu', $this->slug),
				$capacity,
				$this->slug.'_two',
				/************************************************************************* 
				Decommentando la riga successiva e impostando il nome, si può richiamare
				una funzione esterna oppure una funziona incorporata come sotto riportato.
				*************************************************************************/ 
				// 'my_function_two'; 
				function () {
					/************************************************************************ 
					Decommentando la riga successiva e impostando percorso e nome, si può
					includere un file php con il codice da eseguire nella funzione,
					oppure includere direttamente il codice come sotto riportato
					************************************************************************/ 
					// include_once plugin_dir_path( __FILE__ ) . 'inc/menu/page_two.php';
					echo '
					<div class="wrap">
      				<h1>'.esc_html(get_admin_page_title()).'</h1>
      				<h2>ecco il contenuto di questa pagina del plugin</h2>
         	  	</div>';		
				}
			);
			// terza voce del menu del plugin
			add_submenu_page(
				$this->slug.'_admin_menu',
				__('Three Voice Menu', $this->slug),
				__('Three Voice Menu', $this->slug),
				$capacity,
				$this->slug.'_three',
				/************************************************************************* 
				Decommentando la riga successiva e impostando il nome, si può richiamare
				una funzione esterna oppure una funziona incorporata come sotto riportato.
				*************************************************************************/ 					
				// 'my_function_tree'; 
				function () {
					/************************************************************************ 
					Decommentando la riga successiva e impostando percorso e nome, si può
					includere un file php con il codice da eseguire nella funzione,
					oppure includere direttamente il codice come sotto riportato
					************************************************************************/ 
					// include_once plugin_dir_path( __FILE__ ) . 'inc/menu/page_three.php';
					echo '<h1>Three Voice Menu</h1>';
					echo '<h2>ecco il contenuto di questa pagina del plugin</h2>';
				}
			);
			// quarta voce del menu del plugin, richiama la pagina di setup
			add_submenu_page(
				$this->slug.'_admin_menu',
				__('Setup', $this->slug),
				__('Setup', $this->slug),
				$capacity,
				$this->slug.'_setup', 
				[$this, 'plugin_options_page_html'],
			);
		}
		
	}	
	
	${__NAMESPACE__.'_plugin_menu'} = new epa_plugin_menu;

}
?>

Su questo sito utilizziamo cookie tecnici necessari alla navigazione e funzionali all’erogazione del servizio. Utilizziamo i cookie anche per fornirti un’esperienza di navigazione sempre migliore, per facilitare le interazioni con le nostre funzionalità social e per consentirti di ricevere comunicazioni di marketing aderenti alle tue abitudini di navigazione e ai tuoi interessi.

Puoi esprimere il tuo consenso cliccando su ACCETTA TUTTI I COOKIE. Chiudendo questa informativa, continui senza accettare.

Potrai sempre gestire le tue preferenze accedendo al nostro COOKIE CENTER e ottenere maggiori informazioni sui cookie utilizzati, visitando la nostra COOKIE POLICY.

Privacy Settings saved!
Impostazioni

Quando visiti un sito Web, esso può archiviare o recuperare informazioni sul tuo browser, principalmente sotto forma di cookies. Controlla qui i tuoi servizi di cookie personali.


I cookie tecnici sono necessari al funzionamento del sito web perché abilitano funzioni per facilitare la navigazione dell’utente, che per esempio potrà accedere al proprio profilo senza dover eseguire ogni volta il login oppure potrà selezionare la lingua con cui desidera navigare il sito senza doverla impostare ogni volta.

Rifiuta tutti i Servizi
Accetta tutti i Servizi