Создание нового пункта меню - Wordpress

Я ищу способ создать новый элемент, который можно добавить в меню.

Вот подробности моей проблемы: я использую WPML. WPML имеет такую ​​приятную функцию, что вы можете добавить коммутатор в меню автоматически. Он добавляет его в конце меню, не контролируя его.

Thing is, я хочу, чтобы мой языковой коммутатор был элементом 4 из 6. Эта функция автоматического добавления элемента в конце не соответствует моим потребностям.

Итак, я хочу создать новый элемент, который можно использовать в menu- > menu, чтобы поместить мой языковой переключатель точно в то место, которое я хочу.

Есть ли способ сделать это?

TL;DR: я хочу иметь возможность нажимать собственный код HTML/PHP в элементе меню (Apparence- > Menu). Любые функции для этого?

Ответ 1

Вы можете создать новый шаблон, даже если вы используете предварительно разработанные theme или template.

Просто скопируйте код из шаблона, который вы хотите использовать, и соответствующим образом измените его на localhost и загрузите измененную копию в каталог темы.

Убедитесь, что вы сохранили копию, если вы обновите тему до более новой версии, потому что она будет перезаписана.

Другой вариант - создать дочернюю тему .

Ответ 2

От wp-includes/nav-menu-template.php, в Walker_Nav_Menu::start_el:

/**
 * Filter a menu item starting output.
 *
 * The menu item starting output only includes `$args->before`, the opening `<a>`,
 * the menu item 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 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 );

Это означает, что вы можете добавить к содержимому HTML-содержимого отдельного навигационного меню (прямо перед последним тегом li) с помощью этого фильтра. $item_output содержит HTML, сгенерированный для элемента до сих пор. Пример:

<?php

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

Это добавит <span>hello world</span> к каждому элементу меню навигации HTML. После этого фильтра будет добавлен тег закрытия li. Вы можете использовать 4-й аргумент ($args) для проверки текущего навигационного меню.

Ответ 3

Хорошо, у меня есть временное решение.

Это шаги:

  • Открыть \wp-content\plugins\sitepress-multilingual-cms\inc\language-switcher.php
  • Перейдите куда-нибудь по строке 786, где function wp_nav_menu_items_filter($items, $args){
  • Добавьте это право после первого {:

    $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
    
  • Прямо перед if ( $abs_menu_id == $settings_menu_id || false === $abs_menu_id ) { добавьте это:

    $id = 2;  
    for ($i = 0; $i < $id; $i++){  
        $items .= $tempitemsexplode[$i];  
    }  
    for($i = 0; $i < count($tempitemsexplode); $i++){  
        If ($i == $id){  
    
  • В нижней части функции и до:
    }
    return $items;
    Добавить: }}

  • Теперь, перед 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, а затем - виджет языка и в конце остальных пунктов меню.