【问题标题】:Creating new menu item - Wordpress创建新菜单项 - Wordpress
【发布时间】:2016-02-07 22:48:05
【问题描述】:

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

以下是我的问题的详细信息:我使用 WPML。 WPML 有一个不错的功能,您可以自动将切换器添加到菜单中。它将它添加到菜单的末尾,对此没有任何控制。

问题是,我希望我的语言切换器是 6 个元素中的第 4 个元素。在末尾自动添加元素的功能不符合我的需要。

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

有什么办法吗?

TLDR:我希望能够在菜单元素(Apparence->Menu)中推送自定义 HTML/PHP 代码。有什么功能可以做到这一点?

【问题讨论】:

  • 有趣的问题,期待答案:D
  • 如何创建自定义帖子类型“ui_elements”左右并将功能链接到帖子。然后将其添加到菜单中。
  • 我使用的是预制模板。所以我不能像我希望的那样添加/修改模板。好吧,如果我可以手动修改标题,我的菜单就会在代码中完成。

标签: php html wordpress


【解决方案1】:

来自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 );

这意味着您可以使用该过滤器附加到单个导航菜单项的 HTML 内容(就在最后一个 li 标记之前)。 $item_output 包含到目前为止为该项目生成的 HTML。示例:

<?php

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

这会将&lt;span&gt;hello world&lt;/span&gt; 附加到每个导航菜单项HTML。在此过滤器之后将附加一个结束 li 标记。您可以使用第四个参数 ($args) 来验证当前呈现的导航菜单。

【讨论】:

  • 即使这样修复了它,我也不能接受它作为答案。你永远不应该修改 WP 核心。
  • 钩子不修改核心。它由核心提供,旨在供插件和主题使用以进行调整。
【解决方案2】:

好的,我有临时解决办法。

这些是步骤:

  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];  
    }
    

如果你卡在这里,整个函数对我来说是怎样的:

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 字符串中,然后是语言小部件,最后是剩余的菜单项。

【讨论】:

    【解决方案3】:

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

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

    确保您保留一份副本,以防您将主题更新到较新的版本,因为它会被覆盖。

    另一种选择是开发child theme

    【讨论】:

    • 将其放入子主题中即可。这比修改 WP Core 或 WPML Plugin 的核心要好。不知道为什么这被击落得如此猛烈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多