我正在尝试创建一个具有两列的自定义菜单小部件(即,其中我可以选择两个不同的菜单并让它们在单个侧边栏小部件中并排显示)。
我找到了关于如何创建双列文本小部件的tutorial,但我无法弄清楚如何编辑自定义菜单小部件功能以添加和实现其他菜单 - 我尝试创建其他菜单变量(即下面的“$ menus1”和“$ menus2”)打破WordPress(“意外的T字符串”错误)。
“$ 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
}
}
答案 0 :(得分: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'=&gt;'','menu'=&gt; $ nav_menu1));
wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu2 ) );
echo $ args ['after_widget']; }
首先修复它然后查看它是否仍然无效 您还没有完成从menu1到menu2的所有引用的更改。是的,您将需要更改$ instance的密钥,可能还需要更改get_terms - 以及在复制的表单函数中的某些字段ID内容。
但我不确定你想要达到什么目标。 您要做的是在一个小部件中输出2个不同的菜单。 我的建议是将两个菜单小部件放在同一个区域,然后用css将它们并排放置。