创建新菜单项 - Wordpress

时间:2015-11-06 17:51:08

标签: php html wordpress

我正在寻找一种方法来创建一个可以添加到菜单中的新项目。

以下是我的问题的详细信息:我使用WPML。 WPML具有很好的功能,您可以自动将切换器添加到菜单中。它在菜单的末尾添加它,无法控制它。

事情是,我希望我的语言切换器成为6中的元素4.在最后自动添加元素的功能不符合我的需要。

所以我想创建一个可以在appence - >菜单中使用的新元素,将我的语言切换器准确地放在我想要的位置。

有没有办法做到这一点?

TLDR:我希望能够在菜单元素(Apparence-> Menu)中推送自定义HTML / PHP代码。有没有这样做的功能?

3 个答案:

答案 0 :(得分:3)

来自wp-includes/nav-menu-template.phpWalker_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 );

这意味着您可以使用该过滤器附加到单个导航菜单项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)来验证当前的渲染导航菜单。

答案 1 :(得分:1)

好的,我有临时解决方案。

以下是步骤:

  1. 打开\wp-content\plugins\sitepress-multilingual-cms\inc\language-switcher.php
  2. 786 行,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. 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){  
    
  5. 转到功能底部,之前:
    }
    return $items;
    添加:}}

  6. 现在,在return $items;添加:

    之前
    for ($i = $id; $i < count($tempitemsexplode); $i++){  
        $items .= $tempitemsexplode[$i];  
    }
    
  7. 如果你遇到困难,整个功能对我来说是这样的:

    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设置为空字符串 为什么?因为现在我们可以将widget作为第一个菜单项或在某些菜单项之间插入。

    然后我们爆炸$tempitems字符串,以便我们可以使用其他订单。

    当您现在指定$id时,这将成为我们的偏移量。

    现在在第一个循环中,在$id的帮助下,我们将一些临时项添加到空$items字符串,然后添加语言小部件和最后剩余的菜单项。

答案 2 :(得分:-2)

即使您使用的是预先制定的themetemplate,也可以创建新模板。

只需从您要使用的模板中复制代码,然后在localhost上进行相应修改,然后将修改后的副本上传到主题目录。

请确保保留副本,以防将主题更新为较新版本,因为它会被覆盖。

另一种选择是开发child theme