Skip to content

Commit 1c43aec

Browse files
author
Guido W. Pettinari
committed
Classe intermedia MenuPage
1 parent 2c7442f commit 1c43aec

File tree

4 files changed

+132
-73
lines changed

4 files changed

+132
-73
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ deploy.sh
33
version.txt
44
/~/
55
/.svnignore
6+
.DS_Store

readme.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11
# Come funziona
22

3-
* Crea nuovi menu o sottomenu in WordPress estendendo la classe `Idearia\SettingsPage`.
3+
* Crea nuove pagine di opzioni in WordPress estendendo la classe `Idearia\SettingsPage`.
4+
* Se vuoi creare un menu o sottomenu in WordPress senza opzioni, basta che estendi la classe `Idearia\MenuPage`.
45
* Accedi alle opzioni serializzate come fossi in Laravel estendend la classe `Idearia\Config`.
6+
57
# Per avere più controllo
68

79
La classe `Idearia\SettingsPage` è un wrapper di `Idearia\SettingsApi` che ne semplifica l'utilizzo, che a sua volta è un wrapper della [Settings API di WordPress](https://codex.wordpress.org/Settings_API).
810

911
Per avere maggiore controllo sulle opzioni, puoi usare direttamente la classe `Idearia\SettingsApi`.
12+
13+
# Features
14+
15+
- Crea una pagina di opzioni usando solo array, niente codice richiesto.
16+
- Usa il pratico template a tabs per raggruppare le opzioni.
17+
- Controlla chi può vedere i menu.
18+
- Controlla chi può modificare le opzioni.
19+
- Controlla la posizione dei menu.
20+
- Crea sia menu che sotto-menu.
21+
1022
# Dopo ogni modifica al repo...
1123

1224
Aggiorna il repository composer di Idearia come da istruzioni:

src/class-menu-page.php

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
// phpcs:disable WordPress.Security.NonceVerification.Recommended
3+
4+
namespace Idearia;
5+
6+
defined( 'ABSPATH' ) || exit;
7+
8+
/**
9+
* Crea una pagina generica di menu in WordPress e mostrala come
10+
* voce di menu a se stante oppure come sottovoce di un menu
11+
* esistente.
12+
*
13+
* Per creare una pagina estendi questa classe e sovrascrivi
14+
* i seguenti CAMPI OBBLIGATORI:
15+
*
16+
* - $label => titolo della pagina e nome della voce di menu
17+
* - $slug => slug unico della voce di menu
18+
* - view() => funzione che stampa l'HTML
19+
*
20+
* Per maggiore controllo sovrascrivi i seguenti CAMPI OPZIONALI:
21+
* - $position => posizione relativa della voce di menu
22+
* - $parentSlug => se vuoi che la pagina sia una sottovoce di un
23+
* menu esistente, specifica qui lo slug del menu; altrimenti
24+
* verrà creato un menu madre ad hoc con etichetta $label
25+
* - $menuLabel => per specificare un'etichetta del menu
26+
* diversa da $label
27+
* - $capability => per specificare quale capability deve
28+
* possedere l'utente per visualizzare la voce del menu
29+
*
30+
* Ricordati di caricare la classe nel bootstrap del tuo plugin.
31+
*/
32+
abstract class MenuPage
33+
{
34+
/**
35+
* Nome della pagina, apparirà sia come titolo della pagina che
36+
* come etichetta della voce di menu
37+
*/
38+
protected $label; // obbligatorio
39+
40+
/**
41+
* Slug della pagina
42+
*/
43+
protected $slug; // obbligatorio
44+
45+
/**
46+
* Posizione della voce di menu nella sidebar
47+
*/
48+
protected $position = null;
49+
50+
/**
51+
* Menu madre a cui far appartenere questa pagina (ad es.
52+
* options-general.php).
53+
*
54+
* Se lasci vuoto, verrà creato appositamente un nuovo menu
55+
* madre con slug $parentSlug e con etichetta $label.
56+
*/
57+
protected $parentSlug = '';
58+
59+
/**
60+
* Etichetta del menu madre. Lascia vuoto se vuoi che coincida
61+
* con $label, oppure se il menu non ha altre pagine oltre
62+
* questa.
63+
*
64+
* Ignorata se viene specificato un valore per $parentSlug.
65+
*/
66+
protected $menuLabel = '';
67+
68+
/**
69+
* Permessi per visualizzare la voce del menu
70+
*/
71+
protected $capability = 'manage_options';
72+
73+
/**
74+
* Priorità della voce di menu nel filtro WordPress admin_menu
75+
*/
76+
protected $filterPriority = 10;
77+
78+
/**
79+
* Registra gli hooks
80+
*/
81+
public function __construct() {
82+
add_action( 'admin_menu', array( $this, 'admin_menu' ), $this->filterPriority );
83+
}
84+
85+
/**
86+
* Aggiungi alla sidebar la voce di menu
87+
*/
88+
public function admin_menu() {
89+
// Se la pagina è una sottovoce di un menu madre esistente...
90+
if ( ! empty( $this->parentSlug ) ) {
91+
add_submenu_page( $this->parentSlug, $this->label, $this->label, $this->capability, $this->slug, [ $this, 'view' ], $this->position );
92+
}
93+
// Se il menu madre va creato...
94+
else {
95+
// Caso in cui l'etichetta del menu madre è diversa da quella
96+
// della sottovoce di menu (https://wordpress.stackexchange.com/a/66499/86662)
97+
if ( ! empty( $this->menuLabel ) ) {
98+
add_menu_page( $this->menuLabel, $this->menuLabel, $this->capability, $this->slug, '__return_true', '', $this->position );
99+
add_submenu_page( $this->slug, $this->label, $this->label, $this->capability, $this->slug, [ $this, 'view' ] );
100+
}
101+
// Caso in cui non ci interessa differenziare, ad es. perché non ci sono
102+
// altre pagine di menu nel menu madre
103+
else {
104+
add_menu_page( $this->label, $this->label, $this->capability, $this->slug, [ $this, 'view' ], '', $this->position );
105+
}
106+
}
107+
}
108+
109+
/**
110+
* Funzione usata per renderizzare l'HTML
111+
*/
112+
public function view() {
113+
return 'Hello world!';
114+
}
115+
}

src/class-settings-page.php

Lines changed: 3 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -35,52 +35,8 @@
3535
*
3636
* Ricordati di caricare la classe nel bootstrap del tuo plugin.
3737
*/
38-
abstract class SettingsPage {
39-
40-
/**
41-
* Nome della pagina, apparirà sia come titolo della pagina che
42-
* come etichetta della voce di menu
43-
*/
44-
protected $label; // obbligatorio
45-
46-
/**
47-
* Slug della pagina
48-
*/
49-
protected $slug; // obbligatorio
50-
51-
/**
52-
* Posizione della voce di menu nella sidebar
53-
*/
54-
protected $position = null;
55-
56-
/**
57-
* Menu madre a cui far appartenere questa pagina (ad es.
58-
* options-general.php).
59-
*
60-
* Se lasci vuoto, verrà creato appositamente un nuovo menu
61-
* madre con slug $parentSlug e con etichetta $label.
62-
*/
63-
protected $parentSlug = '';
64-
65-
/**
66-
* Etichetta del menu madre. Lascia vuoto se vuoi che coincida
67-
* con $label, oppure se il menu non ha altre pagine oltre
68-
* questa.
69-
*
70-
* Ignorata se viene specificato un valore per $parentSlug.
71-
*/
72-
protected $menuLabel = '';
73-
74-
/**
75-
* Permessi per visualizzare la voce del menu
76-
*/
77-
protected $capability = 'manage_options';
78-
79-
/**
80-
* Priorità della voce di menu nel filtro WordPress admin_menu
81-
*/
82-
protected $filterPriority = 10;
83-
38+
abstract class SettingsPage extends MenuPage
39+
{
8440
/**
8541
* Istanza della classe che si interfaccia con le
8642
* Settings API di WordPress; verrà impostato nel
@@ -104,8 +60,8 @@ abstract protected function getFields();
10460
* Registra gli hooks
10561
*/
10662
public function __construct() {
63+
parent::__construct();
10764
$this->api = new SettingsApi;
108-
add_action( 'admin_menu', array( $this, 'admin_menu' ), $this->filterPriority );
10965
add_action( 'admin_init', array( $this, 'admin_init' ) );
11066
if ( $this->capability !== 'manage_options' ) {
11167
$this->set_write_capabilities();
@@ -138,30 +94,6 @@ public function admin_init() {
13894
$this->api->admin_init();
13995
}
14096

141-
/**
142-
* Aggiungi alla sidebar la voce di menu
143-
*/
144-
public function admin_menu() {
145-
// Se la pagina è una sottovoce di un menu madre esistente...
146-
if ( ! empty( $this->parentSlug ) ) {
147-
add_submenu_page( $this->parentSlug, $this->label, $this->label, $this->capability, $this->slug, [ $this, 'view' ], $this->position );
148-
}
149-
// Se il menu madre va creato...
150-
else {
151-
// Caso in cui l'etichetta del menu madre è diversa da quella
152-
// della sottovoce di menu (https://wordpress.stackexchange.com/a/66499/86662)
153-
if ( ! empty( $this->menuLabel ) ) {
154-
add_menu_page( $this->menuLabel, $this->menuLabel, $this->capability, $this->slug, '__return_true', '', $this->position );
155-
add_submenu_page( $this->slug, $this->label, $this->label, $this->capability, $this->slug, [ $this, 'view' ] );
156-
}
157-
// Caso in cui non ci interessa differenziare, ad es. perché non ci sono
158-
// altre pagine di menu nel menu madre
159-
else {
160-
add_menu_page( $this->label, $this->label, $this->capability, $this->slug, [ $this, 'view' ], '', $this->position );
161-
}
162-
}
163-
}
164-
16597
/**
16698
* Funzione usata per renderizzare l'HTML; di default usiamo
16799
* il layout a tabs.
@@ -179,5 +111,4 @@ protected function view_template_tabs() {
179111
$this->api->show_forms();
180112
echo '</div>';
181113
}
182-
183114
}

0 commit comments

Comments
 (0)