|
| 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 | +} |
0 commit comments