【问题标题】:Insert hash into url to turn it into an anchor将哈希插入 url 以将其变成锚点
【发布时间】:2016-05-18 19:56:03
【问题描述】:

我正在使用 Wordpress,并试图弄清楚如何破解子菜单中的链接。

我在这里设置了一个演示:http://brandsite.simpletruth.io/logo/

具体来说,我想在二级菜单链接前添加一个哈希,以便它们成为同一页面的锚点,而不是转到单独的页面。

例如:

http://brandsite.simpletruth.io/logo/logo-spacing/

变成:

http://brandsite.simpletruth.io/logo#logo-spacing

理想情况下,这发生在 Wordpress 中,但我认为使用 javascript 也是一个不错的解决方案。

谢谢!

【问题讨论】:

  • 你现在如何调用菜单?
  • 这是XY problem:您实际上想解决什么问题?为什么是哈希?这有什么用?
  • @Mark 我正在为菜单使用默认的 wordpress 功能。
  • @cale_b 我​​组织了 Wordpress,以便所有子页面都拉入父页面。因此,例如,徽标页面上显示的所有子页面的内容。当有人点击菜单项时,我希望他们转到主徽标页面,并自动向下滚动到该子页面内容所在的页面锚点。
  • 好的,当你说“子菜单”时——这些菜单是在哪里设置的?你怎么称呼他们? “默认”没有帮助 - 您是在使用“菜单”功能,还是只是调用 wp_nav_menu 而不在仪表板中设置菜单? (在“外观”=>“菜单”下)?如果您在仪表板中设置菜单,您实际上可以设置 自定义 链接,并直接通过仪表板界面将所有“标准”链接替换为您想要的主题标签版本。

标签: javascript wordpress url permalinks


【解决方案1】:

你必须使用custom walker function

在你的例子中:

在您的函数中

class custom_names extends Walker_Nav_Menu
    {

        /* Start of the <ul>
         *
         * Note on $depth: Counterintuitively, $depth here means the "depth right before we start this menu".
         *                 So basically add one to what you'd expect it to be
         */
        function start_lvl(&$output, $depth = 0, $args = array())
        {
            $indent = str_repeat("\t", $depth);
            $output .= "\n$indent<ul class=\"children\">\n";
        }

        /* End of the <ul>
         *
         * Note on $depth: Counterintuitively, $depth here means the "depth right before we start this menu".
         *                 So basically add one to what you'd expect it to be
         */
        function end_lvl( &$output, $depth = 0, $args = array() ) {
            $indent = str_repeat("\t", $depth);
            $output .= "$indent</ul>\n";
        }

        /* Output the <li> and the containing <a>
         * Note: $depth is "correct" at this level
         */
        function start_el( &$output, $item, $depth = 0, $args = array(),  $current_object_id = 0 )
        {
            $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

            $classes = empty( $item->classes ) ? array() : (array) $item->classes;
            $classes[] = 'menu-item-' . $item->ID;

            $args = apply_filters( 'nav_menu_item_args', $args, $item, $depth );

            $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
            $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';


            $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
            $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';


            $output .= $indent . '<li' . $id . $class_names .'>';


            $atts = array();
            $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
            $atts['target'] = ! empty( $item->target )     ? $item->target     : '';
            $atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
            $atts['href']   = ! empty( $item->url )        ? $item->url        : '';


            $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );

            $attributes = '';
            foreach ( $atts as $attr => $value ) {
                if ( ! empty( $value ) ) {
                    $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                    $attributes .= ' ' . $attr . '="' . $value . '"';
                }
                if ($depth == 1) {
                $attributes = ' ' . $attr . '="'.str_replace(basename ($item->url), '#'.str_replace(' ', '-', strtolower ($item->title)), $value).'"';
            }
            }


            $title = apply_filters( 'the_title', $item->title, $item->ID );

            $title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth );

            $item_output = $args->before;
            $item_output .= '<a'. $attributes .'>';
            $item_output .= $args->link_before . $title . $args->link_after;
            $item_output .= '</a>';
            $item_output .= $args->after;


        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
        }

        /* Close the <li>
         * Note: the <a> is already closed
         * Note 2: $depth is "correct" at this level
         */
        function end_el ( &$output, $item, $depth = 0, $args = array())
        {
            $output .= '</li>';
            return;
        }

        /* Add a 'hasChildren' property to the item
         * Code from: http://wordpress.org/support/topic/how-do-i-know-if-a-menu-item-has-children-or-is-a-leaf#post-3139633
         */
        function display_element ($element, &$children_elements, $max_depth, $depth = 0, $args, &$output)
        {
            // check whether this item has children, and set $item->hasChildren accordingly
            $element->hasChildren = isset($children_elements[$element->ID]) && !empty($children_elements[$element->ID]);

            // continue with normal behavior
            return parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
        }
    }

在您的 header.php 中(或您的菜单所在的任何位置)

<?php wp_nav_menu( array('walker' => new custom_names())); ?>

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 2011-11-22
    • 1970-01-01
    • 2015-11-18
    • 2012-05-15
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多