1

我正在尝试创建一个具有两列的自定义菜单小部件(即,我可以选择两个不同的菜单并让它们在单个侧边栏小部件中并排显示)。

我找到了有关如何创建两列文本小部件的教程,但是我无法弄清楚如何编辑自定义菜单小部件功能以添加和实现附加菜单——我尝试创建附加菜单变量(即“$menus1 " 和下面的 "$menus2") 破坏 WordPress ("unexpected T string" 错误)。

“$instance”数组是否有一个名为“nav_menu”的预定义键,或者该键及其值是否由“form”函数创建?如果是后者,我可以定义 'nav_menu1' 和 'nav_menu2' 键(我之前尝试过,但也得到了“意外的 T 字符串”错误)?

任何帮助,将不胜感激。

<?php
/**
 * Custom Menu widget copied from default WP Widget Class and adjusted for 2-columns
 */

class SO_ABC_Tag_List_Widget_2col extends WP_Widget {

    function __construct() {
        $widget_ops = array( 'description' => __('By adding this widget you can select your alphabetical tags menu to display on your website.') );
        parent::__construct( 'so_abc_tags_2col', __('SO ABC Tag List 2 col'), $widget_ops );
    }

    function widget($args, $instance) {
        // Get menu
        $nav_menu1 = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;
        $nav_menu2 = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;

        if ( !$nav_menu )
            return;

        $instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

        echo $args['before_widget'];

        if ( !empty($instance['title']) )
            echo $args['before_title'] . '<i class="icon-tags"></i> ' . $instance['title'] . $args['after_title'];

<div style="float: left; width: 45%">
        wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu1 ) );
</div> 

<div style="float: left; width: 45%"></div>     
        wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu2 ) );
</div>
        echo $args['after_widget'];
    }

    function update( $new_instance, $old_instance ) {
        $instance['title'] = strip_tags( stripslashes($new_instance['title']) );
        $instance['nav_menu'] = (int) $new_instance['nav_menu'];
        $instance['nav_menu'] = (int) $new_instance['nav_menu'];
        return $instance;
    }

    function form( $instance ) {
        $title = isset( $instance['title'] ) ? $instance['title'] : '';
        $nav_menu1 = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : '';
        $nav_menu2 = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : '';

        // Get menus
        $menus1 = get_terms( 'nav_menu', array( 'hide_empty' => false ) );
        $menus1 = get_terms( 'nav_menu', array( 'hide_empty' => false ) );

        // If no menus exists, direct the user to go and create some.
        if (( !$menus1  ) AND ( !menus2 )) {
            echo '<p>'. sprintf( __('No menus have been created yet. <a href="%s">Create some</a>.'), admin_url('nav-menus.php') ) .'</p>';
            return;
        }
        ?>
        <p>
            <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:') ?></label>
            <input type="text" class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" value="<?php echo $title; ?>" />
        </p>
        <p>
            <label for="<?php echo $this->get_field_id('nav_menu'); ?>"><?php _e('Select Menu:'); ?></label>
            <select id="<?php echo $this->get_field_id('nav_menu'); ?>" name="<?php echo $this->get_field_name('nav_menu'); ?>">
        <?php
            foreach ( $menus1 as $menu1 ) {
                echo '<option value="' . $menu1->term_id . '"'
                    . selected( $nav_menu, $menu1->term_id, false )
                    . '>'. $menu1->name . '</option>';
            }
        ?>
            </select>
        </p>
        <p>
            <label for="<?php echo $this->get_field_id('nav_menu'); ?>"><?php _e('Select Menu:'); ?></label>
            <select id="<?php echo $this->get_field_id('nav_menu'); ?>" name="<?php echo $this->get_field_name('nav_menu'); ?>">
        <?php
            foreach ( $menus2 as $menu2 ) {
                echo '<option value="' . $menu2->term_id . '"'
                    . selected( $nav_menu, $menu2->term_id, false )
                    . '>'. $menu2->name . '</option>';
            }
        ?>
            </select>
        </p>
        <?php
    }
}
4

1 回答 1

0

您将 html 和 php 代码混合在一起,这肯定会导致错误

if ( !empty($instance['title']) )
        echo $args['before_title'] . '<i class="icon-tags"></i> ' . $instance['title'] . $args['after_title'];
wp_nav_menu(array('fallback_cb' => '', 'menu' => $nav_menu1 ) );
    wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu2 ) );

回声 $args['after_widget']; }

先解决这个问题,然后看看它是否仍然不起作用。
您还没有完成将所有引用从 menu1 更改为 menu2。是的,您将需要更改 $instance 的键,可能还有 get_terms - 再加上重复的表单函数中的一些字段 id 内容。

但我不确定你想要实现什么。您尝试做的将在一个小部件中输出 2 个不同的菜单。我的建议是将两个菜单小部件放在同一区域,然后使用 css 使它们并排放置。

于 2013-08-06T21:22:25.633 回答