2017-10-12 70 views
0

我在菜單中顯示WPML語言切換器,在底部的最後一個項目。我希望它在二級菜單的第二位。移動定製菜單在特定的位置

如何改變我的代碼來實現這一目標嗎?

當前代碼:

/*Display WPML language switcher in the menu */ 
function wpml144107($menu, $args){ 

    if (! is_admin()): 
     if($args->theme_location == 'secondary'): 
      if(function_exists('icl_get_languages')): 
       $languages = icl_get_languages('skip_missing=0&orderby=custom'); 

       if(count($languages) >= 1): 

        $flags = '<li id="menu-item-lang"><div class="flags_top">'; 
        //foreach((array)$languages as $language): 
          //echo print_r($languages); 
          $language = $languages['fr']; 
          $flags .= ' 
          <span class="icl-'. $language['language_code'] . ($language['active'] == 1 ? ' icl-current' : '') .'">   
           <a rel="alternate" hreflang="' . $language['language_code'] . '" href="' . $language['url']. '">' . $language['language_code'] . '</a> 
          </span> /'; 

          $language = $languages['en']; 
          $flags .= ' 
          <span class="icl-'. $language['language_code'] . ($language['active'] == 1 ? ' icl-current' : '') .'">   
           <a rel="alternate" hreflang="' . $language['language_code'] . '" href="' . $language['url']. '">' . $language['language_code'] . '</a> 
          </span>'; 

        //endforeach; 
        $flags .= '</div></li>'; 
       endif; 

       return $menu . $flags; 
      endif; 
     endif; 
    endif; 
    return $menu; 
} 
add_action('wp_nav_menu_items', 'wpml144107', 50, 2); 

回答

1

此時:

return $menu . $flags; 

語言菜單追加到菜單。

如果將其更改爲:

return $flags . $menu; 

這將是在第一位置...

但是你想擁有它的第二個,對不對?然後,它是一個更復雜一點,你必須拆分包含菜單中的字符串,我想,每一個元素是一個<li> - 元素中:

/* finds the position of the first occurrence of </li>, 
so the end of the first element, add 4 because we want the position of 
the end of the </li>-tag not the start... */ 
$splitpos = strpos($menu, '</li>') + 4; 

// cut the string up to that position and you get the first element... 
$firstelem = substr($menu, 0, $splitpos)); 

// cut after that position and you get the rest of the menu... 
$rest = substr($menu, $splitpos)); 

// now return the menu with your language menu in between... 
return $firstelem . $flags . $rest; 

我想這應該工作! :)

+0

後礦井答案似乎做同樣的事情卻多了幾分複雜,環路unneassery我的想法! 我想上發表評論,但不幸的是我可以在我的文章發表評論,所以如果你考驗我的解決方案,它的作品請投我... :) – ToTaTaRi

1

我已經找到一種方法來做到這一點:我分裂陣列中的菜單項,以便能夠插入你的語言切換器在第2位。

我已經重新審視你的代碼位:

// Display WPML language switcher in 2nd position of the menu 
function wpml144107($items, $args){ 

    if (! is_admin() && $args->theme_location == 'secondary' && function_exists('icl_get_languages')): 

     $languages = icl_get_languages('skip_missing=0&orderby=custom'); 

     if(count($languages) == 0) return $items; // If there is no languages we return defaults menu items 

     $html = 'id="menu-item-lang"> 
     <div class="flags_top"> 
      <span class="icl-'. $languages['fr']['language_code'] . ($languages['fr']['active'] == 1 ? ' icl-current' : '') .'"> 
       <a rel="alternate" hreflang="' . $languages['fr']['language_code'] . '" href="' . $languages['fr']['url']. '">' . $languages['fr']['language_code'] . '</a> 
      </span> /'; 

     $html .= ' 
      <span class="icl-'. $languages['en']['language_code'] . ($languages['en']['active'] == 1 ? ' icl-current' : '') .'"> 
       <a rel="alternate" hreflang="' . $languages['en']['language_code'] . '" href="' . $languages['en']['url']. '">' . $languages['en']['language_code'] . '</a> 
      </span>'; 

     $html .= '</div> 
     '; 
     // Html in between each items (to split the items in an array) 
     $glue = '</li> 
<li '; 
     // Spliting menu items in an array 
     $items_array = explode($glue, $items); 

     // Counter 
     $count = 0; 
     foreach($items_array as $key => $item){ 
      // We insert in 2nd position the language switcher 
      if($key == 1) 
       $ordered_items[$count] = $html; 
      else 
       $ordered_items[$count] = $item; 
      $count++; 
     } 
     // We set back the array of menu items in a correct html string 
     $items = implode($glue, $ordered_items); 

    endif; 

    return $items; 
} 
add_action('wp_nav_menu_items', 'wpml144107', 50, 2); 

代碼放在您的活動子主題的function.php文件(活動的主題或任何插件文件)。

測試和工程在WooCommerce 3+

0

我解決它使用this answer

與此代碼:

/*Display WPML language switcher in the secondary menu at the second position*/ 
function add_custom_in_menu($items, $args) 
{ 
    if($args->theme_location == 'secondary'): 
     if(function_exists('icl_get_languages')): 
      $languages = icl_get_languages('skip_missing=0&orderby=custom'); 
      if(count($languages) >= 1): 

       $items_array = array(); 
       while (false !== ($item_pos = strpos ($items, '<li', 3))) 
       { 
        $items_array[] = substr($items, 0, $item_pos); 
        $items = substr($items, $item_pos); 
       } 
       $items_array[] = $items; 

       $customHtml = '<li>bla</li>'; 
       $flags = '<li id="menu-item-lang"><div class="flags_top">'; 
        //foreach((array)$languages as $language): 
         //echo print_r($languages); 
         $language = $languages['fr']; 
         $flags .= ' 
         <span class="icl-'. $language['language_code'] . ($language['active'] == 1 ? ' icl-current' : '') .'">   
          <a rel="alternate" hreflang="' . $language['language_code'] . '" href="' . $language['url']. '">' . $language['language_code'] . '</a> 
         </span> /'; 

         $language = $languages['en']; 
         $flags .= ' 
         <span class="icl-'. $language['language_code'] . ($language['active'] == 1 ? ' icl-current' : '') .'">   
          <a rel="alternate" hreflang="' . $language['language_code'] . '" href="' . $language['url']. '">' . $language['language_code'] . '</a> 
         </span>'; 

       //endforeach; 
       $flags .= '</div></li>'; 

       // insert custom item after 2nd one 
       array_splice($items_array, 1, 0, $flags); 

       $items = implode('', $items_array); 

      endif; 
     endif; 
    endif; 
    return $items; 
} 
add_filter('wp_nav_menu_items','add_custom_in_menu', 10, 2); 

我認爲這是你們提出的同樣的方法。謝謝。