2015-11-06 12 views
12

मैं एक नया आइटम बनाने का एक तरीका ढूंढ रहा हूं जिसे मेनू में जोड़ा जा सकता है।नया मेनू आइटम बनाना - वर्डप्रेस

यहां मेरी समस्या का विवरण दिया गया है: मैं WPML का उपयोग करता हूं। WPML में वह अच्छी सुविधा है जिसे आप स्वचालित रूप से मेनू में स्विचर जोड़ सकते हैं। यह मेनू के अंत में इसे जोड़ता है, उस पर कोई नियंत्रण नहीं।

बात यह है कि, मैं चाहता हूं कि मेरी भाषा स्विचर 6 में से 4 तत्व हो। यह सुविधा अंत में तत्व को स्वचालित रूप से जोड़ने के लिए मेरी आवश्यकताओं को पूरा नहीं करती है।

तो मैं एक नया तत्व बनाना चाहता हूं जिसका उपयोग ऐपारेन्स-> मेनू में किया जा सकता है ताकि मैं अपनी भाषा स्विचर को उस स्थान पर बिल्कुल सही जगह पर रख सकूं जिसे मैं चाहता हूं।

क्या ऐसा करने का कोई तरीका है?

टीएलडीआर: मैं मेनू तत्व (Apparence-> मेनू) में कस्टम HTML/PHP कोड को धक्का देने में सक्षम होना चाहता हूं। ऐसा करने के लिए कोई काम?

+0

दिलचस्प सवाल, उत्तर के साथ आगे देख रहे हैं: D – Fiido93

+0

आप कस्टम पोस्ट प्रकार "ui_elements" या तो कैसे बनाते हैं और कार्यक्षमता को किसी पोस्ट से लिंक करते हैं। और फिर आप इसे मेनू में जोड़ते हैं। – xphan

+0

मैं एक प्रीमेड टेम्पलेट का उपयोग कर रहा हूं। इसलिए मैं एक टेम्पलेट को वास्तव में जोड़/संशोधित नहीं कर सकता जैसा मैं चाहता हूं। और अगर मुझे मैन्युअल रूप से हेडर को संशोधित करने की पहुंच होगी, तो मेरा मेनू कोड में सही होगा। – Fredy31

उत्तर

-2

यदि आप पूर्व विकसित theme या template का उपयोग कर रहे हैं, तो भी आप एक नया टेम्पलेट बना सकते हैं।

बस उस टेम्पलेट से कोड कॉपी करें जिसे आप उपयोग करना चाहते हैं और तदनुसार इसे अपने localhost पर संशोधित करें और संशोधित प्रति थीम निर्देशिका में अपलोड करें।

सुनिश्चित करें कि आप एक नए संस्करण में विषय अपडेट करते समय एक प्रतिलिपि रखें क्योंकि इसे ओवरराइट किया जाएगा।

एक और विकल्प child theme विकसित करना होगा।

+0

यह काम नहीं कर रहा है ... –

+0

इसे एक बच्चे के विषय में रखकर करता है। यह WP कोर या WPML प्लगइन के मूल को संशोधित करने से बेहतर है। पता नहीं क्यों यह इतना कठिन गोली मार दी गई थी। – Fredy31

3
wp-includes/nav-menu-template.php से

, Walker_Nav_Menu::start_el में:

/** 
* Filter a menu item's starting output. 
* 
* The menu item's starting output only includes `$args->before`, the opening `<a>`, 
* the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is 
* no filter for modifying the opening and closing `<li>` for a menu item. 
* 
* @since 3.0.0 
* 
* @param string $item_output The menu item's starting HTML output. 
* @param object $item  Menu item data object. 
* @param int $depth  Depth of menu item. Used for padding. 
* @param array $args  An array of {@see wp_nav_menu()} arguments. 
*/ 
$output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args); 

आप (दाएं पिछले li टैग से पहले) अलग-अलग एनएवी मेनू आइटम एचटीएमएल सामग्री को संलग्न है कि फिल्टर का उपयोग कर सकते हैं इसका मतलब है। $item_output में अब तक आइटम के लिए जेनरेट किया गया HTML शामिल है। उदाहरण:

<?php 

add_filter('walker_nav_menu_start_el', function ($item_output) { 
    return $item_output . '<span>hello world</span>'; 
}); 

जो प्रत्येक एनवी मेनू आइटम HTML में <span>hello world</span> जोड़ देगा। इस फ़िल्टर के बाद एक बंद li टैग जोड़ा जाएगा। वर्तमान में प्रतिपादन नेविगेशन मेनू को सत्यापित करने के लिए आप चौथे तर्क ($args) का उपयोग कर सकते हैं।

+0

भले ही यह इसे ठीक करता है, मैं इसे उत्तर के रूप में स्वीकार नहीं कर सकता।आपको कभी भी, कभी भी modifiy WP कोर नहीं होना चाहिए। – Fredy31

+0

हुक कोर को संशोधित नहीं करता है। यह कोर द्वारा प्रदान किया जाता है और इसका उपयोग समायोजन के लिए प्लगइन और थीम द्वारा किया जाना है। – ojrask

1

ठीक है, मेरे पास अस्थायी समाधान है।

ये कदम हैं:

  1. ओपन \wp-content\plugins\sitepress-multilingual-cms\inc\language-switcher.php
  2. जाओ कहीं लाइन , जहां function wp_nav_menu_items_filter($items, $args){
  3. पहले { के बाद यह सही जोड़े के आसपास:

    $tempitems = $items; 
    $tempitemsexplode = explode("\n", $tempitems); 
    $items = ""; 
    $id = 2; //This is where widget will be located: example, if you want it to be at place 4, write 5 
    
  4. अधिकारसे पहलेइस जोड़ें:

    $id = 2; 
    for ($i = 0; $i < $id; $i++){ 
        $items .= $tempitemsexplode[$i]; 
    } 
    for($i = 0; $i < count($tempitemsexplode); $i++){ 
        If ($i == $id){ 
    
  5. समारोह की तह तक और इससे पहले कि जाएँ:
    }
    return $items;
    जोड़ें: }}

  6. अब, return $items; जोड़ें से पहले:

    for ($i = $id; $i < count($tempitemsexplode); $i++){ 
        $items .= $tempitemsexplode[$i]; 
    } 
    

आप यहाँ अटक हैं कि पूरे समारोह मेरे लिए लग रहा है कि कैसे:

function wp_nav_menu_items_filter($items, $args){ 
    $tempitems = $items; 
    $tempitemsexplode = explode("\n", $tempitems); 
    $items = ""; 
    global $sitepress_settings, $sitepress; 

    $current_language = $sitepress->get_current_language(); 
    $default_language = $sitepress->get_default_language(); 
    // menu can be passed as integer or object 
    if(isset($args->menu->term_id)) $args->menu = $args->menu->term_id; 

    $abs_menu_id = icl_object_id($args->menu, 'nav_menu', false, $default_language); 
    $settings_menu_id = icl_object_id($sitepress_settings[ 'menu_for_ls' ], 'nav_menu', false, $default_language); 

    $id = 2; 
    for ($i = 0; $i < $id; $i++){ 
     $items .= $tempitemsexplode[$i]; 
    } 

    for($i = 0; $i < count($tempitemsexplode); $i++){ 
     If ($i == $id){ 
      if ($abs_menu_id == $settings_menu_id || false === $abs_menu_id) { 

       $languages = $sitepress->get_ls_languages(); 


       $items .= '<li class="menu-item menu-item-language menu-item-language-current">'; 
       if(isset($args->before)){ 
        $items .= $args->before; 
       } 
       $items .= '<a href="#" onclick="return false">'; 
       if(isset($args->link_before)){ 
        $items .= $args->link_before; 
       } 

       $language_name = ''; 
       if ($sitepress_settings[ 'icl_lso_native_lang' ]) { 
        $language_name .= $languages[ $current_language ][ 'native_name' ]; 
       } 
       if ($sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ]) { 
        $language_name .= ' ('; 
       } 
       if ($sitepress_settings[ 'icl_lso_display_lang' ]) { 
        $language_name .= $languages[ $current_language ][ 'translated_name' ]; 
       } 
       if ($sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ]) { 
        $language_name .= ')'; 
       } 



       $alt_title_lang = esc_attr($language_name); 

       if($sitepress_settings['icl_lso_flags']){ 
        $items .= '<img class="iclflag" src="' . $languages[ $current_language ][ 'country_flag_url' ] . '" width="18" height="12" alt="' . $alt_title_lang . '" title="' . esc_attr($language_name) . '" />'; 
       } 

       $items .= $language_name; 

       if(isset($args->link_after)){ 
        $items .= $args->link_after; 
       } 
       $items .= '</a>'; 
       if(isset($args->after)){ 
        $items .= $args->after; 
       } 

       unset($languages[ $current_language ]); 
       $sub_items = false; 
       $menu_is_vertical = !isset($sitepress_settings['icl_lang_sel_orientation']) || $sitepress_settings['icl_lang_sel_orientation'] == 'vertical'; 
       if(!empty($languages)){ 
        foreach($languages as $lang){ 
         $sub_items .= '<li class="menu-item menu-item-language menu-item-language-current">'; 
         $sub_items .= '<a href="'.$lang['url'].'">'; 

         $language_name = ''; 
         if ($sitepress_settings[ 'icl_lso_native_lang' ]) { 
          $language_name .= $lang[ 'native_name' ]; 
         } 
         if ($sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ]) { 
          $language_name .= ' ('; 
         } 
         if ($sitepress_settings[ 'icl_lso_display_lang' ]) { 
          $language_name .= $lang[ 'translated_name' ]; 
         } 
         if ($sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ]) { 
          $language_name .= ')'; 
         } 
         $alt_title_lang = esc_attr($language_name); 

         if($sitepress_settings['icl_lso_flags']){ 
          $sub_items .= '<img class="iclflag" src="'.$lang['country_flag_url'].'" width="18" height="12" alt="'.$alt_title_lang.'" title="' . $alt_title_lang . '" />'; 
         } 
         $sub_items .= $language_name; 

         $sub_items .= '</a>'; 
         $sub_items .= '</li>'; 

        } 
        if($sub_items && $menu_is_vertical) { 
         $sub_items = '<ul class="sub-menu submenu-languages">' . $sub_items . '</ul>'; 
        } 
       } 

       if($menu_is_vertical) { 
        $items .= $sub_items; 
        $items .= '</li>'; 
       } else { 
        $items .= '</li>'; 
        $items .= $sub_items; 
       } 
      } 
     } 
    } 

    for ($i = $id; $i < count($tempitemsexplode); $i++){ 
     $items .= $tempitemsexplode[$i]; 
    } 

    return $items; 

} 

मैं यह आसान जहां विजेट को रखना चाहते बदलने के लिए बनाने की कोशिश करेंगे।
अगर आपको समस्याएं हैं तो टिप्पणी करें। सौभाग्य!

संपादित करें: स्पष्टीकरण यह संशोधित फ़ंक्शन क्या करता है।
यह फ़ंक्शन मेनू स्विचर को मेनू में जोड़ने के लिए उपयोग किया जाता है।
जब यह फ़ंक्शन कहा जाता है, तो हमारे पास $items स्ट्रिंग है जिसमें सभी मेनू आइटम होते हैं।
मैंने सभी मेनू आइटम $items से $tempitems पर स्थानांतरित कर दिए हैं और खाली स्ट्रिंग के लिए $items सेट करें।
क्यों? क्योंकि अब हम विजेट को पहले मेनू आइटम या कुछ मेनू आइटम्स के बीच सम्मिलित कर सकते हैं।

फिर हम $tempitems स्ट्रिंग को विस्फोट करते हैं ताकि हम दूसरे ऑर्डर का उपयोग कर सकें।

जब आप अब $id निर्दिष्ट करते हैं तो यह हमारा ऑफसेट बन जाता है।

और अब $id की सहायता से पहले लूप में, हम $items स्ट्रिंग खाली करने के लिए कुछ temp आइटम जोड़ते हैं, और फिर भाषा विजेट और अंत में शेष मेनू आइटम।

संबंधित मुद्दे