In questi mesi sto collaborando ad un progetto, la richiesta del cliente è quella di poter avere un numero illimitato di menu e di poter decidere in autonomia dove farli apparire; fatto lo studio di fattibilità ho deciso di usare un custom post type per la creazione dei nomi dei menu che poi do in pasto via PHP con la funzione register_custom_nav_menus() all’interno di un paio di loop, infine per mostrare il menu a front end una piccola condizione PHP che pesca una campo in ACF che mi rilascia l’ID del menu, così lo posso visualizzare modificando il template child con le funzioni wp_get_nav_menu_object() e wp_nav_menu(); alla fine ho fatto un plugin.
Vediamo il codice.
Custom post type
Vabbè questa parte è più che semplice, vado a creare il cpt per far si che il cliente si crei i vari menu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<?php function cpt_menu_contestuale() { // Set UI labels for Custom Post Type $labels = array( 'name' => _x( 'Menu Contestuale', 'Post Type General Name' ), 'singular_name' => _x( 'Menu Contestuale', 'Post Type Singular Name' ), 'menu_name' => __( 'Menu Contestuale' ), 'parent_item_colon' => __( 'Parent Menu Contestuale' ), 'all_items' => __( 'Tutti i Menu Contestuali' ), 'view_item' => __( 'Visualizza Menu Contestuale' ), 'add_new_item' => __( 'Aggiungi Menu Contestuale' ), 'add_new' => __( 'Aggiungi' ), 'edit_item' => __( 'Modifica' ), 'update_item' => __( 'Aggiorna' ), 'search_items' => __( 'Cerca' ), 'not_found' => __( 'Non trovato' ), 'not_found_in_trash' => __( 'Non trovato nel cestino' ), ); // Set other options for Custom Post Type $args = array( 'label' => __( 'Menu Contestuale' ), 'description' => __( 'Menu Contestuale plugin, file ed estensioni' ), 'labels' => $labels, // Features this CPT supports in Post Editor 'supports' => array( 'title', ), // You can associate this CPT with a taxonomy or custom taxonomy. 'taxonomies' => array( 'genres' ), 'menu_icon' => 'dashicons-menu', 'rewrite' => array('slug' => 'menu-contestuale','with_front' => true), 'cptp_permalink_structure' => "/%postname%/", 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'show_in_nav_menus' => true, 'show_in_admin_bar' => true, 'menu_position' => 5, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'page', ); register_post_type( 'menu_contestuale', $args ); } add_action( 'init', 'cpt_menu_contestuale', 0 ); // disable comments on landing category add_action( 'init', 'remove_custom_post_comment_menu' ); function remove_custom_post_comment_menu() { remove_post_type_support( 'menu_contestuale', 'comments' ); } /****************************************************************/ |
WP register custom nav menus , come registrare un menu personalizzato in WordPress
Questa è la funzione di WordPress che permette di registrare dei menu personali, nel codice sottostante ci sono due loop, uno lo uso per prelevare il titolo del cpt (il titolo del post che gli da il cliente), il secondo loop in foreach mi serve per registrare ogni menu che viene creato nel cpt, quindi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
ob_start(); add_action( 'after_setup_theme', 'register_custom_nav_menus' ); function register_custom_nav_menus() { $args = array('post_type' => 'menu_contestuale',); $loop = new WP_Query($args); while($loop->have_posts()): $loop->the_post(); register_nav_menus( array( get_the_ID() => get_the_title(), ) ); endwhile; } wp_reset_query(); |
Come far apparire un menu custom nel template di WordPress
Ora che abbiamo creato il menu non ci resta che inserirlo nel nostro tema, ecco il codice che va inserito nel punto in cui vogliamo far visualizzare il menu.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $menu_contestuale_inpage = get_field("menu_contestuale_inpage"); if (!empty ($menu_contestuale_inpage)) { $menu_ID = wp_get_nav_menu_object($menu_contestuale_inpage); wp_nav_menu( array( 'theme_location' => $menu_ID ) ); } ?> |
Programmatore WordPress Esperto WooCommerce
Sono l’autore di questo blog con tanti trucchi e guide su WordPress e WooCommerce.