【问题标题】:How to create WordPress widget using custom menu select如何使用自定义菜单选择创建 WordPress 小部件
【发布时间】:2013-10-03 23:22:45
【问题描述】:

我正在为 WordPress 创建一个自定义小部件,但我想使用与默认自定义菜单小部件相同的选择菜单。到目前为止,除了所选菜单之外,我所做的工作没有被保存或显示在前端。对此的任何帮助或指导表示赞赏。谢谢。

为简洁起见,我删除了额外的小部件选项,因此这基本上看起来非常接近自定义菜单小部件:

class kedc_mini_sitemap extends WP_Widget {

/*constructor*/
function kedc_mini_sitemap() {
    parent::WP_Widget(false, $name = 'Mini Sitemap');
}

/**/
function widget($args, $instance) {
    extract( $args );

    // widget options
    $title = apply_filters('widget_title', $instance['title']);
    $nav_menu1 = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;
    $checkbox = $instance['checkbox'];

    echo $before_widget;    

    if ($title) {
        echo $before_title . $title . $after_title;
    }

    if ($nav_menu1) {
        echo wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu1 ) );
    }


    if ($checkbox == true) {
        echo 'This message is displayed if our checkbox is checked.';
    }

    echo $after_widget;
}

/* saves options chosen from the widgets panel */
function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance['title'] = strip_tags($new_instance['title']);
    $instance['nav_menu'] = (int) $new_instance['nav_menu'];
    $instance['checkbox'] = strip_tags($new_instance['checkbox']);
    return $instance;
}

/* display widget in widgets panel */
function form($instance) {  

    $title = esc_attr($instance['title']);
    $nav_menu1 = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : '';
    $checkbox = esc_attr($instance['checkbox']);

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

    ?>

    <p>
        <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Widget Title:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" 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>
        <input id="<?php echo $this->get_field_id('checkbox'); ?>" name="<?php echo $this->get_field_name('checkbox'); ?>" type="checkbox" value="1" <?php checked( '1', $checkbox ); ?>/>
        <label for="<?php echo $this->get_field_id('checkbox'); ?>"><?php _e('Do you want this to display as 2 columns?'); ?></label>
    </p>

    <?php
}

}

// register widget
add_action('widgets_init', create_function('', 'return register_widget("kedc_mini_sitemap");'));

【问题讨论】:

  • 如果有可能选择一个可以返回所有第一级子页面的父页面,我很想学习如何!这比创建一个新的菜单组并选择它要好。

标签: wordpress widget custom-widgets


【解决方案1】:

form() 函数中有错字:$nav_menu1$nav_menu

为变量使用更有意义、更严格和更具描述性的名称。例如,$menus1 可以称为$get_nav_menus

使用良好的 IDE,例如 NetBeans 或类似的,并检查 WordPress Coding Standards Handbook

哦,是的,您的代码正在转储 PHP 通知,请始终在启用 WP_DEBUG 的情况下进行开发。

【讨论】:

  • 啊,谢谢!是的,我曾计划更改变量名称,因为 nav_menu 部分是我在某处捡到的一段代码。我确实启用了调试模式,我将不得不检查为什么它没有给我错误。感谢您的提醒和资源。
猜你喜欢
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2013-10-15
相关资源
最近更新 更多