web-dev-qa-db-ja.com

カスタムメニューウィジェットの登録方法

カスタムメニューウィジェットを wp_register_sidebar_widget でプログラム的に登録しようとしていますが、ワードプレスには表示されません。私はそのメソッドのリモート呼び出しを使用しています(xml-rpc)。コーデックスを参照して、私はそのメソッドにそのようなパラメータを渡しています:

wp_register_sidebar_widget(
    'custom_menu_widget-1',
    'My name',
    'WP_Nav_Menu_Widget',
    array( 'description' => 'blogroll' )
);

「私の名前」という名前のカスタムメニューウィジェットを作成する必要がありますが、何も登録されていません。私は3番目のパラメータ$output_callbackが間違っているかもしれないと思いますが、どこにもカスタムメニューのためのコールバックがあるべきであることがわかりません。その呼び出しから出力もエラーもないので、何が問題なのかわかりません。私は何かを見逃すかもしれないか、カスタムメニューウィジェットを登録する別の方法がありますか? function.phpを編集したくない、wpメソッドを使って標準のカスタムメニューウィジェットを登録したいだけです。

3
bigwolk

このコードを試してください(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' );

}
5
Amino