हार्ड कोड कस्टम मेनू आइटम कैसे करें


22

क्या कोई ऐसा तरीका है जिससे मैं कस्टम मेनू आइटमों को हार्ड कोड कर सकता हूं जब पहली थीम स्थापित होती है? मैं एक थीम बना रहा हूं जो इंस्टॉल होने पर अपने आप कुछ सामान्य पेज बना लेगा। इसलिए मुझे यह जानने की जरूरत है कि क्या मैं उन्हें वर्डप्रेस कस्टम मेनू में भी जोड़ सकता हूं इसलिए क्लाइंट को उन्हें मैन्युअल रूप से जोड़ने की आवश्यकता नहीं है?

दूसरे शब्दों में: प्रोग्राम मेनू में कस्टम मेनू आइटम कैसे डालें / बनाएं?

अगर कुछ अस्पष्ट है तो मुझे बताएं। उपयुक्त कोडेक्स पेज के लिए गाइड का स्वागत है। धन्यवाद!


अद्यतन: यहाँ से कोड की कोशिश की wp_nav_menu_items के साथ विशिष्ट मेनू को लक्षित करना

मेनू पंजीकरण:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

खाका उपयोग:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

नए आइटम जोड़ने के लिए कोड:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    $items = $homelink . $items;
    return $items;
    }
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

जब functions.phpफाइल मेनू में नेवी मेनू में नए आइटम जोड़ने के लिए कोड जोड़ते हैं तो व्यवस्थापक पैनल में मेनू पेज में होता है, लेकिन वर्तमान मेनू आइटम साइट में चले गए हैं!

जवाबों:


23

आपके कोड के साथ समस्या यह है कि इसका वास्तव में मेनू में लिंक और केवल मेनू के आउटपुट में जोड़ना नहीं है, इसलिए फ़िल्टर का उपयोग (add_filter) इसलिए आप मेनू के आउटपुट को वास्तव में फ़िल्टर कर रहे हैं, भले ही आप न करें एक मेनू में आपका लिंक आपके द्वारा उपयोग किए जा रहे कोड के साथ दिखाया जाएगा। लेकिन एक लिंक बनाने और इसे एक मेनू में जोड़ने के लिए आप इस कोड का उपयोग कर सकते हैं:

$run_once = get_option('menu_check');
if (!$run_once){
    //give your menu a name
    $name = 'theme default menu';
    //create the menu
    $menu_id = wp_create_nav_menu($name);
    //then get the menu object by its name
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //then add the actuall link/ menu item and you do this for each item you want to add
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //then you set the wanted theme  location
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // then update the menu_check option to make sure this code only runs once
    update_option('menu_check', true);
}

मैंने इसे सरल बनाने के लिए सभी पर टिप्पणी की।

एक चाइल्ड पेज / सब पेज / सेकेंड लेवल मेन्यू (आप इसे कभी भी कैसे कॉल कर सकते हैं) बनाने के लिए, आपको menu-item-parent-idउदाहरण के लिए नए आइटम को सेट करना होगा :

//create the top level menu item (home)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Sub menu item (first child)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('First_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Sub Sub menu item (first child)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Second_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

यह भी आप कोड के साथ स्थिति निर्धारित कर सकते हैं menu-item-position और मुझे लगता है कि इस तरह से किया गया है:

  • पहला आइटम - 'मेनू-आइटम-पोजिशन' => 1
    • पहला आइटम पहला बच्चा - 'मेनू-आइटम-स्थिति' => 1
    • पहला आइटम दूसरा बच्चा - 'मेनू-आइटम-स्थिति' => 1
      • पहला आइटम दूसरा बच्चा पहला बच्चा - 'मेनू-आइटम-पोजिशन' => 1
  • दूसरा आइटम - 'मेनू-आइटम-पोजिशन' => 2
  • 3 आइटम - 'मेनू-आइटम-स्थिति' => 3
  • 4 आइटम - 'मेनू-आइटम-स्थिति' => 4

वे कार्य हैं जिनकी मुझे तलाश थी :) कोडेक्स में ये शामिल नहीं हैं :( एक और सवाल कि मैं होम आइटम में एक आइटम बच्चे को कैसे जोड़ सकता हूं। जैसे ही मैं अपने पीसी पर
जाऊंगा आपको बता

@ शिशिर: मैंने एक उदाहरण के साथ अद्यतन किया कि कैसे बाल पेज बनाने के लिए
Bainternet

@Bainternet: पहली बार कोड चलाने पर यह त्रुटि हुई Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25। लेकिन मेन्यू बन जाता है और जब पेज रिफ्रेश होता है तो सब कुछ काम करता है लेकिन कुछ भी Appearance -> Menu Theme Locationसेक्शन में नहीं दिखता है। हम वास्तव में करीब हैं :) धन्यवाद!
सिसिर

@Bainternet: मेरा अनुमान है कि कोड में त्रुटि हो रही है जब यह कोड को चलाने की कोशिश कर रहा है $locations = get_theme_mod('nav_menu_locations');, तो इससे पहले के कोड (सभी मेनू प्रविष्टि किया जाता है) निष्पादित हो जाते हैं और उसके बाद कोड प्राप्त होता है (वांछित विषय स्थान सेट करें) निष्पादित नहीं होता है। ।
सिसिर

@ शिशिर: कोड ठीक काम कर रहा है, आपका थीम स्थान नाम क्या है और मुझे आपके द्वारा उपयोग किए जा रहे सटीक कोड को दिखाएं, मैं देखूंगा कि क्या मैं मदद कर सकता हूं।
बेनटर्नट

8

आपका मूल कोड पैसे के बहुत करीब है और मुझे गंभीरता से लगता है कि यह लंबे समाधान @Bainternet (कोई अपराध नहीं है) ओवरकिल है, इसलिए इसके बजाय इस पर एक नज़र डालें:

function new_nav_menu_items($items, $args) {
    if( $args->theme_location == 'primary' ){
        $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
        $items = $homelink . $items;
    }
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

आपकी एकमात्र समस्या यह थी कि सही मेनू के लिए फ़ंक्शन की जाँच के बाद आप $ आइटम नहीं लौटा रहे थे , और आप चेक ( $ args ) बनाने के लिए आवश्यक दूसरी कॉलबैक तर्क को याद कर रहे थे ।


आप इस विधि का उपयोग करके मेनू आइटम का स्थान कैसे सेट करेंगे?
माइकल एन

1

Wordpress 3.4.2 में एक बग है:

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

आपको शब्द संबंध मैन्युअल रूप से बनाने की आवश्यकता है:

$menu = wp_get_nav_menu_object('top menu');
$id = wp_update_nav_menu_item($menu->term_id, 0, $data);

if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) {
    wp_set_post_terms($id, array((int)$this->id), 'nav_menu');
}

साधारण मेनू निर्माण के लिए मेनू वर्ग के उदाहरण के लिए https://gist.github.com/4148529 देखें ।


0

जानकारी के लिए, वर्तमान उपयोगकर्ता को शब्द जोड़ने के अधिकार प्राप्त हैं, मेरा मेनू_इटीम्स बनाया गया था लेकिन wp_set_current_user (1) में कॉल जोड़ने से पहले तालिका wp_terms_relationship में नहीं जोड़ा गया था;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.