web-dev-qa-db-ja.com

単一のプラグインでWordpressの複数のウィジェット

私のプラグインでは2つのウィジェットを作成する必要があります。一つは社会的ランク、もう一つはプロフィールランクです。

これは私がここで使用しているコードです。

    <?php
    add_action( 'widgets_init', 'src_load_widgets' );

function src_load_widgets() {
    register_widget( 'Widget_SRC' );
}
function src_load_widgets() {
    register_widget( 'Widget_Rank ' );
}

class Widget_SRC extends WP_Widget {

    function Widget_SRC() {

        $widget_ops = array( 'classname' => 'src', 'description' => __('Several social networks counts and ranking system', 'src') );       
        $control_ops = array( 'width' => 300, 'height' => 350, 'id_base' => 'social-rank' );        
        $this->WP_Widget( 'social-rank', __('Social Rank', 'src'), $widget_ops, $control_ops );
    }


    function widget( $args, $instance ) {
        extract( $args );   
        $title = apply_filters('widget_title', $instance['title'] );    
        echo $before_widget;

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

        echo do_shortcode('[SocialRank]');      

        echo $after_widget;
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;

        $instance['title'] = strip_tags( $new_instance['title'] );
        return $instance;
    }

    function form( $instance ) {

        $defaults = array( 'title' => __('Social Rank', 'src'));
        $instance = wp_parse_args( (array) $instance, $defaults ); ?>
        <!-- Widget Title: Text Input -->
        <p>
            <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Title:', 'hybrid'); ?></label>
            <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" style="width:100%;" />
        </p>        

    <?php
    }
}
        class Widget_Rank extends WP_Widget {

            /**
             * Widget setup.
             */
            function Widget_Rank() {
                /* Widget settings. */
                $widget_ops = array( 'classname' => 'rank', 'description' => __('Display profile rank based on vote & social counts.', 'rank') );

                /* Widget control settings. */
                $control_ops = array( 'width' => 300, 'height' => 350, 'id_base' => 'profile-rank' );

                /* Create the widget. */
                $this->WP_Widget( 'profile-rank', __('Profile Rank', 'rank'), $widget_ops, $control_ops );
            }

            /**
             * How to display the widget on the screen.
             */
            function widget( $args, $instance ) {
                extract( $args );

                /* Our variables from the widget settings. */
                $title = apply_filters('widget_title', $instance['title'] );

                /* Before widget (defined by themes). */
                echo $before_widget;

                /* Display the widget title if one was input (before and after defined by themes). */
                if ( $title )
                    echo $before_title . $title . $after_title;

                echo do_shortcode('[SocialRank]');

                /* After widget (defined by themes). */
                echo $after_widget;
            }

            /**
             * Update the widget settings.
             */
            function update( $new_instance, $old_instance ) {
                $instance = $old_instance;

                /* Strip tags for title and name to remove HTML (important for text inputs). */
                $instance['title'] = strip_tags( $new_instance['title'] );
                return $instance;
            }

            /**
             * Displays the widget settings controls on the widget panel.
             * Make use of the get_field_id() and get_field_name() function
             * when creating your form elements. This handles the confusing stuff.
             */
            function form( $instance ) {

                /* Set up some default widget settings. */
                $defaults = array( 'title' => __('Profile Rank', 'rank'));
                $instance = wp_parse_args( (array) $instance, $defaults ); ?>

                <!-- Widget Title: Text Input -->
                <p>
                    <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Title:', 'hybrid'); ?></label>
                    <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" style="width:100%;" />
                </p>        

            <?php
            }
        }
         ?>

しかし、それは私に2番目のウィジェットを表示していません。私はこれを見つけたがそれを解決する方法を得ることができません https://stackoverflow.com/questions/5247302/php-namespace-5-3-and-wordpress-widget/5247436#5247436

2
Ajay Patel

1つのファイルに複数のウィジェットを登録してもまったく問題ありません。ウィジェットは別々のクラスです。他のプログラミング言語とは異なり、PHPは1つのファイル内で2つのクラスを宣言しても問題ありません。

add_action( 'widgets_init', 'src_load_widgets' );

function src_load_widgets() {
    register_widget( 'Widget_SRC' );
    register_widget( 'Widget_Rank ' );
}

class Widget_SRC extends WP_Widget {
    // ...
}

class Widget_Rank extends WP_Widget {
    // ...
}
5
soulseekah

ああ、私の間違い

function load_widgets() {
    register_widget( 'Widget_SRC' );
    register_widget( 'Widget_Rank' );
}
0
Ajay Patel