无法将主页URL添加到带有#的菜单

时间:2016-03-02 作者:dingo_d

我正在添加#section 作为我菜单的自定义链接,因为我想在单击该链接时滚动到该部分。当我在主页上时,这很好(该部分在主页上),但当我不在主页上时,我单击它什么也不会发生,因为它将链接视为#section.

也就是说,当我在第二页时:

http://127.0.0.1/second-page
然后我点击#section 菜单中的链接,它尝试执行以下操作

http://127.0.0.1/second-page/#section
而不是

http://127.0.0.1/#section
现在,该网站仍在开发中,所以它是通过IP地址设置的。但这不重要。问题是我试图将wordpress后端中的自定义链接设置为

http://127.0.0.1/#section
而在后端,这看起来像那样,在我的菜单上,在前端,我只看到

<a href="#section">Section</a>
控制菜单输出的菜单漫游器如下所示:

<?php


// Allow HTML descriptions in WordPress Menu
remove_filter( \'nav_menu_description\', \'strip_tags\' );
function my_plugin_wp_setup_nav_menu_item( $menu_item ) {
    if ( isset( $menu_item->post_type ) ) {
        if ( \'nav_menu_item\' == $menu_item->post_type ) {
            $menu_item->description = apply_filters( \'nav_menu_description\', $menu_item->post_content );
        }
    }

    return $menu_item;
}

add_filter( \'wp_setup_nav_menu_item\', \'my_plugin_wp_setup_nav_menu_item\' );

// Menu without icons
class my_walker_nav_menu extends Walker_Nav_Menu {

    public function display_element($el, &$children, $max_depth, $depth = 0, $args, &$output){
        $id = $this->db_fields[\'id\'];

        if(isset($children[$el->$id])){
            $el->classes[] = \'has_children\';
        }

        parent::display_element($el, $children, $max_depth, $depth, $args, $output);
    }

    // add classes to ul sub-menus
    function start_lvl( &$output, $depth = 0, $args = array() ) {
        // depth dependent classes
        $indent = ( $depth > 0  ? str_repeat( "\\t", $depth ) : \'\' ); // code indent
        $display_depth = ( $depth + 1); // because it counts the first submenu as 0
        $classes = array(
            \'navi\',
            ( $display_depth ==1 ? \'first\' : \'\' ),
            ( $display_depth >=2 ? \'navi\' : \'\' ),
            \'menu-depth-\' . $display_depth
            );
        $class_names = implode( \' \', $classes );

        // build html
        $output .= "\\n" . $indent . \'<ul class="\' . esc_attr($class_names) . \'">\' . "\\n";
    }

    // add main/sub classes to li\'s and links
     function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        global $wp_query;
        $indent = ( $depth > 0 ? str_repeat( "\\t", $depth ) : \'\' ); // code indent

        static $is_first;
        $is_first++;
        // depth dependent classes
        $depth_classes = array(
            ( $depth == 0 ? \'main-menu-item\' : \'\' ),
            ( $depth >=2 ? \'navi\' : \'\' ),
            ( $is_first ==1 ? \'menu-first\' : \'\' ),
            \'menu-item-depth-\' . $depth
        );
        $depth_class_names = esc_attr( implode( \' \', $depth_classes ) );
        // passed classes
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $class_names = esc_attr( implode( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) ) );

        $is_mega_menu = (strpos($class_names,\'mega\') !== false) ? true : false;
        $use_desc = (strpos($class_names,\'use_desc\') !== false) ? true : false;
        $no_title = (strpos($class_names,\'no_title\') !== false) ? true : false;

        if(!$is_mega_menu){
            $class_names .= \' normal_menu_item\';
        }

        // build html
        $output      .= $indent . \'<li id="nav-menu-item-\'. esc_attr($item->ID) . \'" class="\' . esc_attr($depth_class_names) . \' \' . esc_attr($class_names) . \'">\';
        // link attributes
        $attributes  = ! empty( $item->attr_title ) ? \' title="\'  . esc_attr( $item->attr_title ) .\'"\' : \'\';
        $attributes  .= ! empty( $item->target )     ? \' target="\' . esc_attr( $item->target     ) .\'"\' : \'\';
        $attributes  .= ! empty( $item->xfn )        ? \' rel="\'    . esc_attr( $item->xfn        ) .\'"\' : \'\';
        $attributes  .= ! empty( $item->url )        ? \' href="\' . (($item->url[0] == "#" && !is_front_page()) ? home_url(\'/\') : \'\') . esc_attr($item->url) .\'"\' : \'\';

        $attributes  .= \' class="menu-link \'.((strpos($item->url,\'#\') === false) ? \'\' : \'scroll\').\' \' . ( $depth > 0 ? \'sub-menu-link\' : \'main-menu-link\' ) . \'"\';

        $html_output = ($use_desc) ? \'<div class="description_menu_item">\'.$item->description.\'</div>\' : \'\';
        $item_output = (!$no_title) ? \'<a \' . $attributes . \'><span>\' . apply_filters( \'the_title\', $item->title, $item->ID ) . \'</span></a>\'.$html_output : $html_output;
        // build html
        $output      .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args ).(($is_mega_menu)?\'<div class="sf-mega"><div class="sf-mega-inner clearfix">\':\'\');
    }

    function end_el( &$output, $item, $depth = 0, $args = array() ) {

        $classes      = empty( $item->classes ) ? array() : (array) $item->classes;
        $class_names  = esc_attr( implode( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) ) );

        $is_mega_menu = (strpos($class_names,\'mega\') !== false) ? true : false;

        $output       .= (($is_mega_menu)?\'</div></div>\':\'\') . "</li>\\n";
    }

}
锚由以下绳索控制:

$attributes  .= ! empty( $item->url )        ? \' href="\' . (($item->url[0] == "#" && !is_front_page()) ? home_url(\'/\') : \'\') . esc_attr($item->url) .\'"\' : \'\';
它甚至说如果url# 如果不是头版,它应该添加home_url() 对它。

没有这些,我无法从其他页面滚动到第一页的部分。

为什么要这样做?因为地址是IP而不是www?

ANSWER

显然我没有在我的wp_nav_menu(). 感觉很傻

现在可以了。很抱歉没有早点检查。

3 个回复
SO网友:Dionoh

这就是你必须做的:

更改<a href="#section"></a><a href="http://127.0.0.1/#section"></a>

据我所知,家是http://127.0.0.1 在家里#section 不位于上http://127.0.0.1/second-page

所以从http://127.0.0.1/second-page 你必须回到http://127.0.0.1 直接到#section 位于上的http://127.0.0.1

这应该可以解决问题

SO网友:Jeffrey von Grumbkow

我还不能发表评论,所以如果这不是有效的答案,我很抱歉,但据我所知,您的$项目->url在本例中为“#节”

您正在检查$item->url[0]是否等于#,但$item->url不是数组,因此[0]在此处无效。

你能试着换一下这条线吗

$attributes  .= ! empty( $item->url )        ? \' href="\' . (($item->url[0] == "#" && !is_front_page()) ? home_url(\'/\') : \'\') . esc_attr($item->url) .\'"\' : \'\';

$attributes  .= ! empty( $item->url )        ? \' href="\' . ((strpos($item->url, \'#\') != false && !is_front_page()) ? home_url(\'/\') : \'\') . esc_attr($item->url) .\'"\' : \'\';

SO网友:Edu Wass

当在同一页上时,链接应该是相对的:#section

当位于不同页面时,链接应为绝对链接:http://127.0.0.1/#section

您只需在菜单遍历器中添加if语句即可完成该行为。

相关推荐

WordPress中声明SplitMenuWalker::Walk($Elements,$max_Depth)时出现警告

我开始在WordPress网站上收到以下错误:警告:SplitMenuWalker::walk($elements,$max\\u depth)的声明应与/home/relati67/public\\u html/wp content/themes/mentis/inc/mega menu/split menu中的walk::walk($elements,$max\\u depth,$args)兼容。php第0行我不知道在这里该怎么办。我发现了一个具有类似内容的线程,但错误指向特定行(不是第0行),并且不