web-dev-qa-db-fra.com

Comment enregistrer un widget de menu personnalisé

J'essaie d'enregistrer un widget de menu personnalisé par programme avec wp_register_sidebar_widget , mais il n'apparaît pas dans wordpress. J'utilise l'appel à distance de cette méthode (xml-rpc). En faisant référence au codex, je passe les paramètres comme ça à cette méthode:

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

Il devrait créer un widget de menu personnalisé nommé "Mon nom", mais il n'enregistre rien. Je pense que le troisième paramètre $output_callback est peut-être erroné, mais je ne trouve nulle part le type de rappel à utiliser pour les menus personnalisés. Je n'ai aucune sortie ou erreur de cet appel, donc je ne peux pas voir ce qui ne va pas. Peut-être que quelque chose me manque ou qu'il existe un autre moyen d'enregistrer un widget de menu personnalisé? Je ne veux pas éditer function.php, je veux juste enregistrer un widget de menu personnalisé standard en utilisant les méthodes wp.

3
bigwolk

Essayez ce code (dans 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