views:

84

answers:

1

Hello,

Hope somebody can help me out.

I'm trying to use a widget within a plugin in wordpress and I'm seeing this error within the widget box:

Warning: extract() [function.extract]: First argument should be an array in /nfs/c03/h04/mnt/57957/domains/rab.qbessi.com/html/wp-content/plugins/register-plus/dash_widget.php on line 24

This is the code from Line 24:

    // Output the widget contents
    function widget( $args ) {
        extract( $args, EXTR_SKIP );

Here's the dash_widget.php code

<?php
if( !class_exists('RegisterPlusWidget') ){
    class RegisterPlusWidget{
        function RegisterPlusWidget() { //contructor
            // Add the widget to the dashboard
            add_action( 'wp_dashboard_setup', array($this, 'register_widget') );
            add_filter( 'wp_dashboard_widgets', array($this, 'add_widget') );       
        }
        function register_widget() {
            wp_register_sidebar_widget( 'regplus_invite_tracking', __( 'Invitation Code Tracking', 'regplus' ), array($this, 'widget'), array( 'settings' => 'options-general.php?page=register-plus' ) );
        }
        // Modifies the array of dashboard widgets and adds this plugin's
        function add_widget( $widgets ) {
            global $wp_registered_widgets;

            if ( !isset($wp_registered_widgets['regplus_invite_tracking']) ) return $widgets;

            array_splice( $widgets, 2, 0, 'regplus_invite_tracking' );

            return $widgets;
        }
        // Output the widget contents
        function widget( $args ) {
            extract( $args, EXTR_SKIP );

            echo $before_widget;

            echo $before_title;
            echo $widget_name;
            echo $after_title;

            global $wpdb;
            $regplus = get_option( 'register_plus' );
            $codes = $regplus['codepass'];
            $usercodes = array();
            foreach($codes as $code){
                $users = $wpdb->get_results( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key='invite_code' AND meta_value='$code'" );
                echo '<h3>' . $code . ': <small style="font-weight:normal">' . count($users) . ' Users Registered.</small></h3>';
            }       
            echo $after_widget;
        }
    }
} # End Class RegisterPlusWidget

// Start this plugin once all other plugins are fully loaded
add_action( 'plugins_loaded', create_function( '', 'global $regplus_widget; $regplus_widget = new RegisterPlusWidget();' ) );
?>
+1  A: 

The widget() function is being called with no parameters. Why, is hard to tell without digging deeply into the plugin. You should ask the plugin's author. You can try adding

// Output the widget contents
function widget( $args ) {
    if (is_array($args))  // Add this
    extract( $args, EXTR_SKIP );

and see whether the output still makes sense then. That effectively just suppresses the action that causes the warning. If it's a badly programmed plugin that was developed with warnings turned off, that already may do the trick.

Pekka
In order to live in the spirit of WPs horrible code base, he might just as well slap a @ in front ;)
Gordon
@Gordon: You're right, that would at least have been consistent :)
Pekka
THANK YOU! it worked just fine :)!
Qbessi