如何注册自定义菜单微件

时间:2013-03-11 作者:bigwolk

我正在尝试使用编程方式注册自定义菜单小部件wp_register_sidebar_widget, 但它没有出现在wordpress中。我正在使用该方法的远程调用(xml rpc)。参考codex,我将这样的参数传递给该方法:

wp_register_sidebar_widget(
    \'custom_menu_widget-1\',
    \'My name\',
    \'WP_Nav_Menu_Widget\',
    array( \'description\' => \'blogroll\' )
);
它应该创建名为“我的名字”的自定义菜单小部件,但它不注册任何内容。我认为第三个参数$output_callback 可能是错误的,但我找不到任何地方,自定义菜单的回调应该是什么。我没有从那个调用中得到任何输出或错误,所以我看不出有什么问题。也许我错过了什么,或者有其他方法来注册自定义菜单小部件?我不想编辑函数。php,我只想使用wp方法注册标准自定义菜单小部件。

1 个回复
SO网友:Amino

尝试此代码(在中function.php)

class MyWidget extends WP_Widget {

    function __construct() {
        $widget_ops = array( \'description\' => __(\'Use this widget to add one of your custom menu as a link list widget.\') );
        parent::__construct( \'custom_menu_widget-1\', __(\'My name\'), $widget_ops );
    }

    function widget($args, $instance) {
        // Get menu
        $nav_menu = ! 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\'] . $instance[\'title\'] . $args[\'after_title\'];

        wp_nav_menu( array( \'menu\' => $nav_menu) );

        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\'];
        return $instance;
    }

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

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

        // If no menus exists, direct the user to go and create some.
        if ( !$menus ) {
            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 ( $menus as $menu ) {
                $selected = $nav_menu == $menu->term_id ? \' selected="selected"\' : \'\';
                echo \'<option\'. $selected .\' value="\'. $menu->term_id .\'">\'. $menu->name .\'</option>\';
            }
        ?>
            </select>
        </p>
        <?php
    }
}

add_action( \'widgets_init\', \'myplugin_register_widgets\' );

function myplugin_register_widgets() {

      register_widget( \'MyWidget\' );

}

结束

相关推荐

Prevent widgets removal

我正在用许多小部件构建一个网站。它们是高度定制的。当站点处于活动状态时,几个管理员/编辑器必须编辑这些小部件。现在,我很害怕看到一个小部件(及其配置)可以在一次鼠标移动中完全擦除(将其从侧栏中删除)。有没有什么方法可以防止小部件被删除,同时保持编辑其内容的能力?此外,在我看来,管理中的widget管理页面为“添加widget”模块提供了太多的空间,而为“激活的widget”模块提供的空间不足。这在创建站点时很有用,但在完成站点时却毫无用处。有没有办法切换这些模块的大小?非常感谢