{"id":233427,"date":"2023-02-13T16:59:00","date_gmt":"2023-02-13T13:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233427"},"modified":"2022-11-10T23:38:03","modified_gmt":"2022-11-10T20:38:03","slug":"tutorial-wordpress-menu-personalizzato-per-post-o-pagine-nella-barra-laterale","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/tutorial-wordpress-menu-personalizzato-per-post-o-pagine-nella-barra-laterale\/","title":{"rendered":"Tutorial WordPress: menu personalizzato per post o pagine nella barra laterale"},"content":{"rendered":"\n<p>Questo post \u00e8 per te che gestisci un sito WordPress che ha molti contenuti, possibilmente molte pagine strutturate in modo gerarchico, e desideri una migliore navigazione al di fuori del menu principale. Per aiutare a navigare nel sito, un menu personalizzato relativo al post corrente sar\u00e0 di grande aiuto. Il problema con il posizionamento di un widget di menu nella barra laterale (o dove preferisci) \u00e8 che la barra laterale \u00e8 comune. In questo post impareremo come mostrare un menu personalizzato aggiuntivo nella barra laterale, consentendo a post, pagine o tipi di post personalizzati di scegliere un menu.<\/p>\n<p>Aggiungi il codice qui sotto nel tuo tema <code>functions.php<\/code>o nel codice del tuo plugin.<\/p>\n<h2>Consenti ai post o alle pagine di scegliere un menu<\/h2>\n<p>Creare menu in WordPress \u00e8 facile e puoi utilizzare il widget Menu per visualizzare un menu nella barra laterale. Il problema \u00e8 che la barra laterale \u00e8 globale e lo stesso menu verr\u00e0 visualizzato ovunque. E se desideri visualizzare menu specifici su pagine specifiche? Imparerai anche come assicurarti che il menu scelto venga ereditato dalle pagine figlio. In questo modo devi solo selezionare il menu nella pagina principale. Tutte le sottopagine mostreranno anche lo stesso menu senza bisogno di modificarle tutte.<\/p>\n<h3>Aggiunta di una metabox per la scelta del menu<\/h3>\n<p>Il primo passo \u00e8 creare un metabox su post o pagine in cui abbiamo la possibilit\u00e0 di scegliere un menu. Usiamo la funzione <code>add_meta_box()<\/code>e decidiamo per quali tipi di post vogliamo mostrarlo.<\/p>\n<pre><code>add_action('add_meta_boxes', function() {\n    add_meta_box('metabox-sidebar-menu', __('Sidebar Menu', 'txtdomain'), 'awp_sidebar_menu_metabox_callback', ['post', 'page']);\n});<\/code><\/pre>\n<p>Adatta il codice sopra al titolo e ai tipi di post che desideri. L&#8217;esempio sopra aggiunger\u00e0 il metabox sia ai post che alle pagine. Il terzo parametro, quello che ho chiamato <code>awp_sidebar_menu_metabox_callback<\/code>, \u00e8 la funzione responsabile del rendering del contenuto del metabox. Definiamolo dopo. Questo \u00e8 ci\u00f2 che dovremo fare nel nostro metabox:<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n\u00a0\n    \/\/ Get the current saved menu, if set\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n}<\/code><\/pre>\n<p>Possiamo ottenere un array con tutti i menu salvati in WordPress con <code>wp_get_nav_menus()<\/code>. Per quanto riguarda il recupero del menu scelto corrente, memorizziamo il menu scelto come meta post <code>awp_sidebar_menu<\/code>(chiamalo come preferisci) e recupereremo semplicemente il valore in base alla corrente <code>$post<\/code>fornitaci nella funzione metabox. Salveremo gli ID menu perch\u00e9 \u00e8 tutto ci\u00f2 di cui abbiamo bisogno per visualizzare un menu. E poi riproduciamo HTML per una selezione che scorre attraverso i menu. L&#8217;output HTML del metabox dipende davvero da te, il seguente \u00e8 un esempio. Ho incluso anche la funzionalit\u00e0 nonce per la sicurezza.<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n    $menus = wp_get_nav_menus();\n\u00a0\n    \/\/ Get the current saved menu, if set\n    $current_selected = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n    wp_nonce_field('awp_sidebar_menu_metabox_nonce', 'awp_sidebar_menu_nonce');\n    ?&gt;&lt;div class=\"awp-metabox-item\"&gt;\n        &lt;div class=\"awp-metabox-label\"&gt;&lt;label&gt;&lt;?php _e('Choose menu', 'txtdomain'); ?&gt;&lt;\/label&gt;&lt;\/div&gt;\n        &lt;div class=\"awp-metabox-input\"&gt;&lt;?php\n        if (empty($menus)) {\n            echo '&lt;p&gt;'. __('No menus created.', 'txtdomain'). '&lt;\/p&gt;';\n        } else { ?&gt;\n            &lt;select name=\"awp-sidebar-menu\" id=\"awp-sidebar-menu\"&gt;\n                &lt;?php \n                echo '&lt;option value=\"\"&gt;'. __('Choose menu', 'txtdomain'). '&lt;\/option&gt;';\n                foreach ($menus as $menu) { \n                    echo '&lt;option value=\"'. $menu-&gt;term_id. '\" '.selected($current_selected, $menu-&gt;term_id).'&gt;'.$menu-&gt;name.'&lt;\/option&gt;';\n                } ?&gt;\n            &lt;\/select&gt;\n        &lt;?php } ?&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;&lt;?php\n}<\/code><\/pre>\n<p>Nell&#8217;output HTML sto stampando un&#8217;etichetta. Se non ci sono menu salvati in WordPress, visualizzer\u00e0 semplicemente un paragrafo. In caso contrario, viene generata una selezione con ID menu come valori e nomi di menu come etichetta. Sto anche aggiungendo una scelta vuota per consentire ai post di non mostrare un menu. Sto usando la funzione di supporto di WordPress <code>[selected](https:\/\/developer.wordpress.org\/reference\/functions\/selected\/)()<\/code>per gestire il contrassegno dell&#8217;opzione salvata corrente come selezionata.<\/p>\n<p>Se modifichi un post o una pagina dovresti vedere il metabox apparire in basso, mostrando la tua selezione. Stupendo! Tuttavia a questo punto al momento non salver\u00e0 la tua scelta di menu quando salvi il post. Questo \u00e8 il prossimo passo.<\/p>\n<h3>Salvataggio della scelta del menu<\/h3>\n<p>Usiamo l&#8217;hook <code>save_post<\/code>per creare una funzione che salva qualsiasi scelta che abbiamo aggiunto nel nostro metabox. L&#8217; <code>save_post<\/code>hook viene attivato ogni volta che un post viene salvato o aggiornato. Verificheremo prima i nonce (se non sei sicuro di cosa siano i nonce, controlla questa <a href=\"https:\/\/codex.wordpress.org\/WordPress_Nonces\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guida di WordPress sui nonce<\/a> ). Quindi controlliamo due volte se l&#8217;utente \u00e8 autorizzato ad aggiornare i post e aggiorna il nostro meta post con la scelta.<\/p>\n<pre><code>add_action('save_post', function($post_id) {\n    if (!isset($_POST['awp_sidebar_menu_nonce']) || !wp_verify_nonce($_POST['awp_sidebar_menu_nonce'], 'awp_sidebar_menu_metabox_nonce')) {\n        return;\n    }\n\u00a0\n    if (!current_user_can('edit_post', $post_id)) {\n        return;\n    }\n\u00a0\n    update_post_meta($post_id, 'awp_sidebar_menu', $_POST['awp-sidebar-menu']);\n});<\/code><\/pre>\n<p>Ora, quando aggiorni i post, salver\u00e0 anche la tua scelta di menu.<\/p>\n<p>E questo \u00e8 tutto per la parte post-scelta. Il passaggio successivo \u00e8 effettivamente l&#8217;output del menu se \u00e8 stato selezionato un menu.<\/p>\n<h3>Scelta di una posizione per il menu personalizzato<\/h3>\n<p>Sto aggiungendo l&#8217;output nella barra laterale, ma puoi emetterlo ovunque nei modelli del tuo tema. Abbiamo solo bisogno di un hook predefinito o definiamo il nostro. Ad esempio, sto aggiungendo un hook personalizzato nella parte superiore della barra laterale, in modo da poter creare una funzione agganciata a questo.<\/p>\n<p>Potresti semplicemente chiamare <code>wp_nav_menu()<\/code>direttamente nel modello, ma ti consiglio invece di creare un hook personalizzato perch\u00e9 aggiungeremo un bel po&#8217; di codice e pu\u00f2 sembrare disordinato.<\/p>\n<p>Nel mio tema modifico <code>sidebar.php<\/code>e subito prima <code>dynamic_sidebar()<\/code>con la barra laterale viene chiamata (dove vengono aggiunti i widget), aggiungo il mio hook personalizzato con <code>do_action()<\/code>e un dato nome. Puoi chiamarlo come preferisci, ma deve essere unico all&#8217;interno di WordPress. Quindi almeno anteponigli qualcosa di unico per te.<\/p>\n<pre><code>&lt;aside class=\"sidebar\"&gt;\n    &lt;?php \n    do_action('awp_before_sidebar');\n    dynamic_sidebar('left-sidebar'); \n    ?&gt;\n&lt;\/aside&gt;<\/code><\/pre>\n<h3>Rendering del menu<\/h3>\n<p>Ora possiamo tornare a <code>functions.php<\/code>, definire una funzione agganciata <code>awp_before_sidebar<\/code>e il suo output verr\u00e0 visualizzato nella barra laterale prima dei widget. La funzione utilizzer\u00e0 i <a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags#A_Single_Page.2C_a_Single_Post.2C_an_Attachment_or_Any_Other_Custom_Post_Type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tag condizionali di WordPress<\/a> per verificare se stiamo attualmente mostrando o meno un singolo post o pagina. E se \u00e8 cos\u00ec, prender\u00f2 il nostro post meta. Se il post meta \u00e8 stato impostato, emettiamo il menu chiamando <code>[wp_nav_menu](https:\/\/developer.wordpress.org\/reference\/functions\/wp_nav_menu\/)()<\/code>e fornendo l&#8217;ID del menu salvato come <code>menu<\/code>parametro.<\/p>\n<pre><code>add_action('awp_before_sidebar', function() {\n    if (is_singular()) {\n        global $post;\n\u00a0\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ?&gt;&lt;section class=\"widget awp-sidebar-menu\"&gt;\n            &lt;?php wp_nav_menu(['menu' =&gt; $sidebar_menu]); ?&gt;\n        &lt;\/section&gt;&lt;?php\n    }\n});<\/code><\/pre>\n<p>Dovresti regolare l&#8217;HTML attorno al menu in modo che si adatti al resto del contenuto. Nel codice sopra, avvolgo il menu nello stesso HTML in cui sono racchiusi tutti i widget nella barra laterale in modo che lo stile del widget del tema si applichi al nostro menu personalizzato.<\/p>\n<p>Questo \u00e8 tutto! Ogni volta che scegli un menu in un post o in una pagina, il menu verr\u00e0 visualizzato sopra la barra laterale durante la visualizzazione di quel post o pagina.<\/p>\n<p>Possiamo fare un ulteriore passo avanti per\u00f2. Se vuoi che le pagine dei bambini mostrino lo stesso menu della barra laterale impostato in uno qualsiasi dei genitori, continua a leggere.<\/p>\n<h2>Consenti alle pagine figlie di ereditare il menu del genitore<\/h2>\n<p>Questa funzionalit\u00e0 aggiuntiva ha senso se hai molte pagine in una gerarchia o un tipo di post personalizzato con la gerarchia attivata. Sarebbe troppo ingombrante modificare ogni singola pagina figlio e scegliere lo stesso menu. In tal caso sarebbe meglio scegliere il menu sulla pagina principale e lasciare automaticamente che tutte le sottopagine &quot;ereditino&quot; quella scelta di menu. Se una qualsiasi sottopagina sceglie un altro menu, quel menu verr\u00e0 visualizzato al posto di &quot;ereditato&quot; una volta.<\/p>\n<p>All&#8217;interno della nostra funzione hooked to <code>awp_before_sidebar<\/code>, aggiungeremo un pezzo di codice, all&#8217;interno del check se stiamo visualizzando un singolo post o pagina:<\/p>\n<pre><code>        ...\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n        if (!empty($sidebar_menu)) {\n            $parents = get_post_ancestors($post-&gt;ID);\n            if (!empty($parents)) {\n                \/\/ go step by step up the parents tree\n                for ($i = 0; $i &lt; count($parents); $i++) {\n                    $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n                    if (!empty($sidebar_menu)) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ...<\/code><\/pre>\n<p>Quello che fa il codice sopra se non \u00e8 stato trovato alcun menu nella pagina corrente \u00e8 recuperare tutti i genitori con <code>[get_post_ancestors](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_ancestors\/)()<\/code>. Questa funzione restituisce un array di ID post principali ordinati prima in base al genitore pi\u00f9 vicino. Se la pagina non ha genitori (ad esempio se \u00e8 un post) viene restituito un array vuoto. E se ci sono dei genitori, esaminiamo ogni genitore uno per uno e controlliamo se hanno impostato il nostro meta meta. Se ne viene trovato uno, interrompiamo l&#8217;attraversamento dei genitori e <code>$sidebar_menu<\/code>verr\u00e0 impostato e il menu verr\u00e0 visualizzato in seguito con <code>wp_nav_menu()<\/code>.<\/p>\n<p>E questo \u00e8 tutto per la funzionalit\u00e0 &quot;ereditariet\u00e0&quot;!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo post impareremo come mostrare un menu personalizzato nella barra laterale (o ovunque tu voglia), consentendo ai post o alle pagine di scegliere un menu.<\/p>\n","protected":false},"author":1,"featured_media":224072,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,720,835,918,1110,804,804,835,928,720,928,844,844,865,865],"tags":[1168],"class_list":["post-233427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-sviluppatore","category-guida-per-principianti","category-n-a","category-php-6","category-soggetti","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233427"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233427\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}