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;
}
?>