प्रोग्रामेटिक रूप से एक नेविगेशन मेनू और मेनू आइटम जोड़ें


41

एपीआई फ़ंक्शंस के माध्यम से, मैं एक नए नेविगेशन मेनू को परिभाषित करना चाहता हूं , इसे वर्तमान थीम में चुनें, और फिर मेनू आइटम के रूप में कुछ पृष्ठ डालें। यह एक विषय सक्रियण पर उदाहरण के लिए किया जाना है।

उल्टा इंजीनियरिंग के माध्यम से डेटाबेस आवेषण और अपडेट को मैन्युअल रूप से नेविगेशन मेनू और आइटम सेट करने के बाद (मामूली रूप से दर्दनाक) प्रक्रिया के माध्यम से, मैंने निम्नलिखित चरणों को एक साथ जोड़ दिया है, जहां 'पाद-नेवी' नेविगेशन मेनू I की स्लग आईडी है। मी सृजन:

if (!term_exists('footer-nav', 'nav_menu')) {

    $menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));

    // Select this menu in the current theme
    update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));

    // Insert new page
    $page = wp_insert_post(array('post_title' => 'Blog',
                                 'post_content' => '',
                                 'post_status' => 'publish',
                                 'post_type' => 'page'));

    // Insert new nav_menu_item
    $nav_item = wp_insert_post(array('post_title' => 'News',
                                     'post_content' => '',
                                     'post_status' => 'publish',
                                     'post_type' => 'nav_menu_item'));


    add_post_meta($nav_item, '_menu_item_type', 'post_type');
    add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
    add_post_meta($nav_item, '_menu_item_object_id', $page);
    add_post_meta($nav_item, '_menu_item_object', 'page');
    add_post_meta($nav_item, '_menu_item_target', '');
    add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
    add_post_meta($nav_item, '_menu_item_xfn', '');
    add_post_meta($nav_item, '_menu_item_url', '');

    wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}

यह काम करने लगता है, लेकिन:

  • क्या यह करने का एक मजबूत और सुरुचिपूर्ण तरीका है?
  • क्या मुझे पूरी तरह से कुछ याद आ रहा है जो कोड की एक पंक्ति में यह सब करेगा?

जवाबों:


42

मैं आपको गलत समझ सकता हूं, लेकिन इसका उपयोग क्यों नहीं करते wp_create_nav_menu()?

उदाहरण के लिए, यह वही है जो मैं एक कस्टम बडीप्रेस मेनू बनाने के लिए करता हूं जब मैं बीपी को सक्रिय रूप में पहचानता हूं:

    $menuname = $lblg_themename . ' BuddyPress Menu';
$bpmenulocation = 'lblgbpmenu';
// Does the menu exist already?
$menu_exists = wp_get_nav_menu_object( $menuname );

// If it doesn't exist, let's create it.
if( !$menu_exists){
    $menu_id = wp_create_nav_menu($menuname);

    // Set up default BuddyPress links and add them to the menu.
    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Activity'),
        'menu-item-classes' => 'activity',
        'menu-item-url' => home_url( '/activity/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Members'),
        'menu-item-classes' => 'members',
        'menu-item-url' => home_url( '/members/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Groups'),
        'menu-item-classes' => 'groups',
        'menu-item-url' => home_url( '/groups/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Forums'),
        'menu-item-classes' => 'forums',
        'menu-item-url' => home_url( '/forums/' ), 
        'menu-item-status' => 'publish'));

    // Grab the theme locations and assign our newly-created menu
    // to the BuddyPress menu location.
    if( !has_nav_menu( $bpmenulocation ) ){
        $locations = get_theme_mod('nav_menu_locations');
        $locations[$bpmenulocation] = $menu_id;
        set_theme_mod( 'nav_menu_locations', $locations );
    }

मैं इस समारोह के बारे में नहीं जानता था। हां, मुझे लगता है कि यह उपरोक्त कोड को बहुत कम कर देगा। मुझे लगता है कि मुझे कोडेक्स से आगे बढ़ना चाहिए और वास्तविक कोड में गोता लगाना चाहिए, क्योंकि मुझे लगता है कि एपीआई फ़ंक्शन अक्सर होते हैं, जैसे इस मामले में, बहुत कम-स्तर। धन्यवाद!
जुलिएन_सी

@julien_c यदि इसे हल किया जाता है, तो इसे इस तरह चिह्नित करें, जो आपके बाद आने वाले लोगों को यहां आपके अनुभव से लाभान्वित करने की अनुमति दें।
mor7ifer

मैं वास्तव में वास्तविक रूप से इसका परीक्षण करना चाहता हूं, इसलिए मुझे यकीन है कि यह वही करता है जो मैं चाहता हूं। मुझे याद है कि जैसे ही मैंने किया, इसे हल कर दिया जाएगा!
१५:५० पर जुलिएन_सी

3
आप इन कि कोडेक्स में नहीं हैं की तरह उपयोगी कार्यों देखते हैं, तो उन्हें (Yay विकि) = पी जोड़ने के लिए एक अच्छा विचार है
टॉम जम्मू नॉवेल

क्षमा करें कि मुझे यह जांचने में इतना समय लगा कि इसने मेरे मामले में काम किया। उत्तर स्वीकृत! साथ ही, आप कस्टम लिंक मेनू आइटम को परिभाषित कर रहे हैं , मैंने पेज लिंक को परिभाषित करने के लिए नीचे एक उत्तर जोड़ा है (जो URL परिवर्तनों के लिए अधिक मजबूत होगा, उदाहरण के लिए)।
julien_c

12

ज़हॉमोज़ एवर के पूरक के रूप में, यहां बताया गया है कि आप " पेज- टाइप" मेनू आइटम कैसे बनाएंगे (" कस्टम " एक नहीं):

wp_update_nav_menu_item($menu_id, 0, array('menu-item-title' => 'About',
                                           'menu-item-object' => 'page',
                                           'menu-item-object-id' => get_page_by_path('about')->ID,
                                           'menu-item-type' => 'post_type',
                                           'menu-item-status' => 'publish'));

उदाहरण के लिए, आपको केवल पृष्ठ स्लग पता है।


9

मेरे पास स्वीकार किए गए उत्तर के साथ कुछ मुद्दे हैं - जो इसे गलत नहीं बनाता है, लेकिन मैं अपना खुद का कोड नीचे पोस्ट करूंगा, जो मुझे लगता है कि कुछ लोगों के लिए बेहतर परिणाम हो सकता है क्योंकि मेरे पास एक ही सवाल था, लेकिन वही करना चाहता था कम कोड वाली चीज़।

सबसे पहले, उपरोक्त कोड "URL" प्रकार के नेविगेशन आइटम बनाता है, जो कुछ लोगों के लिए ठीक है, लेकिन मैं PAGES से लिंक करना चाहता हूं, न कि URL से, क्योंकि यह वर्डप्रेस नेविगेशन्स और क्लाइंट्स की एक महत्वपूर्ण विशेषता है अपरिहार्य चाल चीजों के आसपास इसलिए मैं कभी भी URL का उपयोग नहीं करता हूं नौसेना आइटम प्रकार।

इसके अलावा, बच्चों के केवल एक फ्लैट सरणी को पोस्ट किए गए कोड द्वारा नियंत्रित किया जाता है। मैंने नए नेवी आइटम्स को पुन: घोषित करने के लिए एक फ़ंक्शन बनाया है, उनके लौटे मेटाडेटा (मुख्य रूप से लूप में बनाए जाने के बाद आईडी), और बच्चों को स्वीकार करने के लिए एक पैरामीटर स्टोर किया है।

बस संपादित करें $nav_items_to_addऔर बाकी को पुनरावर्ती रूप से संभाला जाता है। प्रत्येक सरणी में 3 आवश्यक कुंजियाँ हैं। सबसे पहले, सरणी कुंजी स्लग है, इसलिए 'shop' => array( ... )आप स्लग के साथ एक पृष्ठ के लिए क्या चाहते हैं shop['title']जिस तरह से नेवी आइटम को फ्रंट एंड पर लेबल किया जाएगा। pathवर्डप्रेस पेज पदानुक्रम के भीतर पृष्ठ का मार्ग है, इसलिए यह स्लग के समान है यदि पृष्ठ एक शीर्ष-स्तरीय माता-पिता है, और यदि shopकोई बच्चा था, homeतो यह होगा 'path' => 'home/shop'

अंतिम वैकल्पिक सरणी कुंजी वह ['parent']जगह है जहां आप सरणी में दूसरी कुंजी को वर्तमान के माता-पिता के रूप में घोषित कर सकते हैं। यह ध्यान रखना महत्वपूर्ण है कि आइटम पुनरावर्ती रूप से जोड़े जाते हैं, इसलिए माता-पिता को बच्चा पैदा करने की कोशिश करने से पहले मौजूद होना चाहिए। इसका अर्थ है कि बच्चों के होने से पहले घोषणा मूल माता-पिता के मद के लिए होनी चाहिए।

    $locations = get_nav_menu_locations();

    if (isset($locations['primary_navigation'])) {
        $menu_id = $locations['primary_navigation'];

        $new_menu_obj = array();

        $nav_items_to_add = array(
                'shop' => array(
                    'title' => 'Shop',
                    'path' => 'shop',
                    ),
                'shop_l2' => array(
                    'title' => 'Shop',
                    'path' => 'shop',
                    'parent' => 'shop',
                    ),
                'cart' => array(
                    'title' => 'Cart',
                    'path' => 'shop/cart',
                    'parent' => 'shop',
                    ),
                'checkout' => array(
                    'title' => 'Checkout',
                    'path' => 'shop/checkout',
                    'parent' => 'shop',
                    ),
                'my-account' => array(
                    'title' => 'My Account',
                    'path' => 'shop/my-account',
                    'parent' => 'shop',
                    ),
                'lost-password' => array(
                    'title' => 'Lost Password',
                    'path' => 'shop/my-account/lost-password',
                    'parent' => 'my-account',
                    ),
                'edit-address' => array(
                    'title' => 'Edit My Address',
                    'path' => 'shop/my-account/edit-address',
                    'parent' => 'my-account',
                    ),
            );

    foreach ( $nav_items_to_add as $slug => $nav_item ) {
        $new_menu_obj[$slug] = array();
        if ( array_key_exists( 'parent', $nav_item ) )
            $new_menu_obj[$slug]['parent'] = $nav_item['parent'];
        $new_menu_obj[$slug]['id'] = wp_update_nav_menu_item($menu_id, 0,  array(
                'menu-item-title' => $nav_item['title'],
                'menu-item-object' => 'page',
                'menu-item-parent-id' => $new_menu_obj[ $nav_item['parent'] ]['id'],
                'menu-item-object-id' => get_page_by_path( $nav_item['path'] )->ID,
                'menu-item-type' => 'post_type',
                'menu-item-status' => 'publish')
        );
    }

    }

2

एक मेनू आइटम जोड़ने के लिए प्रोग्रामेटिक रूप से। आप wp_nav_menu_itemsफ़िल्टर करने के लिए हुक कर सकते हैं । अपने थीम फ़ंक्शन में कोड के नीचे रखें। मुख्य मेनू में लॉगिन / लॉगआउट मेनू आइटम जोड़ने के लिए। 'प्राथमिक' पंजीकृत मेनू का नाम / आईडी है।

/**
 * Add login logout menu item in the main menu.
 * ===========================================
 */

add_filter( 'wp_nav_menu_items', 'lunchbox_add_loginout_link', 10, 2 );
function lunchbox_add_loginout_link( $items, $args ) {
    /**
     * If menu primary menu is set & user is logged in.
     */
    if ( is_user_logged_in() && $args->theme_location == 'primary' ) {
        $items .= '<li><a href="'. wp_logout_url() .'">Log Out</a></li>';
    }
    /**
     * Else display login menu item.
     */
    elseif ( !is_user_logged_in() && $args->theme_location == 'primary' ) {
        $items .= '<li><a href="'. site_url('wp-login.php') .'">Log In</a></li>';
    }
    return $items;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.