Jump to content

Error with an old Wordpress Template upgrade to PHP 8


Kargano
 Share

Recommended Posts

Hello all,
I have for a customer site still an old WP template and have trouble converting from PHP 7 to PHP 8.

I get the following error: Uncaught ArgumentCountError: Too few arguments to function .

I was able to reduce the error to this PHP file.

<?php
// widget extra options
global $theme_widgets_style;
$theme_widgets_style = array(
    'default' => __('sidebar default', THEME_NS),
    'block'   => __('block', THEME_NS),
    'post'    => __('post', THEME_NS),
    'simple'  => __('simple text', THEME_NS)
);

function theme_get_widget_style($id, $style = null) {

    $result = theme_get_widget_meta_option($id, 'theme_widget_styles');
    global $theme_widgets_style;
    if (!in_array($result, array_keys($theme_widgets_style))) {
        $result = 'default';
    }
    if ($style != null) {
        if (!in_array($style, array('block', 'post', 'simple'))) {
            $style = 'block';
        }
        if ($result == 'default') {
            $result = $style;
        }
    }
    return $result;
}

function theme_set_widget_style($id, $style) {
    global $theme_widgets_style;
    if (!in_array($style, array_keys($theme_widgets_style))) {
        $style = 'default';
    }
    theme_set_widget_meta_option($id, 'theme_widget_styles', $style);
}

function theme_widget_expand_control($id) {
    global $wp_registered_widget_controls;
    $controls = &$wp_registered_widget_controls[$id];
    if (!is_array($controls['params'])) {
        $controls['params'] = array($controls['params']);
    }
    $controls['params'][] = $id;
    if (isset($controls['callback'])) {
        $controls['callback_redirect'] = $controls['callback'];
    }
    $controls['callback'] = 'theme_widget_extra_control';
}

function theme_update_widget_additional($instance) {
    global $theme_widget_meta_options;
    foreach ($theme_widget_meta_options as $value) {
        $id = theme_get_array_value($value, 'id');
        $val = stripslashes(theme_get_array_value($_POST, $id));
        $type = theme_get_array_value($value, 'type');
        $options = theme_get_array_value($value, 'options');
        switch ($type) {
            case 'checkbox':
                $val = ($val ? 1 : 0);
                break;
            case 'numeric':
                $val = (int) $val;
                break;
            case 'select':
                if (!in_array($val, array_keys($options))) {
                    $val = reset(array_keys($options));
                }
                break;
        }
        $instance[$id] = $val;
    }
    return $instance;
}
function theme_widget_process_control() {
    global $wp_registered_widget_controls;
    if ('post' == strtolower($_SERVER['REQUEST_METHOD']) && isset($_POST['widget-id'])) {
        theme_widget_expand_control($_POST['widget-id']);
        return;
    }
    foreach ($wp_registered_widget_controls as $id => $widget) {
        theme_widget_expand_control($id);
    }
}

function theme_widget_extra_control() {
    global $wp_registered_widget_controls, $theme_widgets_style, $theme_widget_meta_options;
    $_theme_widget_meta_options = $theme_widget_meta_options;
    $params = func_get_args();
    $widget_id = $params[count($params) - 1]; // see theme_widget_expand_control func
    $widget_controls = theme_get_array_value($wp_registered_widget_controls, $widget_id, array());
    if (isset($widget_controls['callback_redirect'])) {
        $callback = $widget_controls['callback_redirect'];
        if (is_callable($callback)) {
            call_user_func_array($callback, $params);
        }
    }
    if (!preg_match('/^(.*[^-])-([0-9]+)$/', $widget_id, $matches) || !isset($matches[1]) || !isset($matches[2])) {
        return false;
    }
    $id = $matches[1] . '-' . $params[0]['number'];
    
    ?>
    <h3 style="margin-bottom:3px;"><?php _e('Theme Options', THEME_NS); ?></h3>
    <?php
    theme_print_meta_box($id, $_theme_widget_meta_options);
}

// widgets

class VMenuWidget extends WP_Widget {

    function VMenuWidget() {
        $widget_ops = array('classname' => 'vmenu', 'description' => __('Use this widget to add one of your custom menus as a widget.', THEME_NS));
        parent::WP_Widget(false, __('Vertical Menu', THEME_NS), $widget_ops);
    }

    function widget($args, $instance) {
        extract($args);
        $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base);
        echo $before_widget;
        echo $before_title . $title . $after_title;
        echo theme_get_menu(array(
            'source' => $instance['source'],
            'depth'  => theme_get_option('theme_vmenu_depth'),
            'menu'   => wp_get_nav_menu_object($instance['nav_menu']),
            'class'  => ''
        ));
        echo $after_widget;
    }

    function update($new_instance, $old_instance) {
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['source'] = $new_instance['source'];
        $instance['nav_menu'] = (int) $new_instance['nav_menu'];
        return $instance;
    }

    function form($instance) {
        //Defaults
        $instance = wp_parse_args((array) $instance, array('title' => '', 'source' => 'Pages', 'nav_menu' => ''));
        $title = esc_attr($instance['title']);
        $source = $instance['source'];
        $nav_menu = $instance['nav_menu'];

        // Get menus
        $menus = get_terms('nav_menu', array('hide_empty' => false));
        $sources = array(
                      'Pages' => __('Pages', THEME_NS), 
                      'Categories' => __('Categories', THEME_NS), 
                      'Custom Menu' => __('Custom Menu', THEME_NS)
                      );
        ?>
        <p>
            <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', THEME_NS) ?></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('source'); ?>"><?php echo __('Source', THEME_NS) . ':'; ?></label>
        <select class="widefat" id="<?php echo $this->get_field_id('source'); ?>" name="<?php echo $this->get_field_name('source'); ?>" onchange="var s = jQuery('.p-<?php echo $this->get_field_id('nav_menu'); ?>'); if (this.value == 'Custom Menu') s.show(); else s.hide();">
        <?php
        foreach ($sources as $s => $t ) {
            $selected = ($source == $s ? ' selected="selected"' : '');
            echo '<option' . $selected . ' value="' . $s . '">' . $t . '</option>';
        }
        ?>
        </select>
        </p>
        <p class="p-<?php echo $this->get_field_id('nav_menu'); ?>" <?php if ($source !== 'Custom Menu') echo ' style="display:none"' ?>>
        <?php
        // If no menus exists, direct the user to go and create some.
        if (!$menus) {
            printf(__('No menus have been created yet. <a href="%s">Create some</a>.', THEME_NS), admin_url('nav-menus.php'));
        } else {
            ?>
            <label for="<?php echo $this->get_field_id('nav_menu'); ?>"><?php _e('Select Menu:', THEME_NS); ?></label><br />
            <select class="widefat" 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>
            <?php
        }
        ?>
        </p>
        <?php
    }

}

class LoginWidget extends WP_Widget {

    function LoginWidget() {
        $widget_ops = array('classname' => 'login', 'description' => __('Login form', THEME_NS));
        $this->WP_Widget(false, __('Login', THEME_NS), $widget_ops);
    }

    function widget($args, $instance) {
        global $user_ID, $user_identity, $user_level, $user_email, $user_login;
        extract($args);
        echo $before_widget;
        echo $before_title;
        if ($user_ID):
            echo $user_identity;
            echo $after_title;
            ?>
            <ul>
            <li><a href="<?php echo esc_url( site_url() ) ?>/wp-admin/"><?php _e('Dashboard', THEME_NS); ?></a></li>
            <?php if ($user_level >= 1): ?>
                <li><a href="<?php echo esc_url( site_url() ) ?>/wp-admin/post-new.php"><?php _e('Publish', THEME_NS); ?></a></li>
                <li><a href="<?php echo esc_url( site_url() ) ?>/wp-admin/edit-comments.php"><?php _e('Comments', THEME_NS); ?></a></li>
            <?php endif; ?>
            <li><a href="<?php echo wp_logout_url() ?>&amp;redirect_to=<?php echo urlencode(theme_get_current_url()); ?>"><?php _e("Log out", THEME_NS); ?></a></li>
            </ul>
        <?php
        else:
            _e('Log In', THEME_NS);
            echo $after_title;
            ?>
            <form action="<?php echo esc_url( site_url() ) ?>/wp-login.php" method="post" name="login" id="form-login">
                <fieldset class="input" style="border: 0 none;">
                    <p id="form-login-username">
                        <label for="log"><?php _e('Username', THEME_NS) ?></label>
                        <br>
                        <input type="text" name="log" id="log" value="<?php echo esc_attr(stripslashes($user_login), 1) ?>" size="20" />
                    </p>
                    <p id="form-login-password">
                        <label for="pwd"><?php _e("Password", THEME_NS); ?></label>
                        <br>
                        <input type="password" name="pwd" id="pwd" size="20" /><br />
                    </p>
                    <p id="form-login-remember">
                        <label for="rememberme"><?php _e('Remember Me', THEME_NS); ?></label>
                        <input name="rememberme" id="rememberme" type="checkbox" checked="checked" value="forever" />
                    </p>
                    <input class="art-button" type="submit" name="submit" value="<?php echo esc_attr(__('Log In', THEME_NS)); ?>" />
                </fieldset>
                <input type="hidden" name="redirect_to" value="<?php echo theme_get_current_url(); ?>"/>
            </form>
            <ul>
                <?php if (get_option('users_can_register')) { ?>
                <li><a href="<?php echo esc_url( site_url() ) ?>/wp-register.php"><?php _e("Register", THEME_NS); ?></a></li>
                <?php } ?>
                <li><a href="<?php echo esc_url( site_url() ) ?>/wp-login.php?action=lostpassword"><?php _e("Lost your password?", THEME_NS); ?></a></li>
            </ul>
        <?php endif;
        echo $after_widget;
    }
}

// init widgets
function artWidgetsInit() {
    register_widget('VMenuWidget');
    register_widget('LoginWidget');
}

add_action('widgets_init', 'artWidgetsInit');

I suspect the error is in these lines

function form($instance) {
        //Defaults
        $instance = wp_parse_args((array) $instance, array('title' => '', 'source' => 'Pages', 'nav_menu' => ''));
        $title = esc_attr($instance['title']);
        $source = $instance['source'];
        $nav_menu = $instance['nav_menu'];


Does anyone have a tip for me ? Or would tell me how much it costs to make it compatible?
I have searched for quite a long time, but have not found anything.

Best regards
Kargano

Link to comment
Share on other sites

The error is that some code is calling a function with the wrong number of arguments. The two function calls in the code you think seem to be correct.

There should have been an exact filename and line number in the error for the calling code. That will tell you where to look. Then check what function(s) it's trying to call and why it's doing so incorrectly.

Link to comment
Share on other sites

Thanks for the answer.

The problem is that the constructor gives an error.

This is the whole error message.

[06-Sep-2021 08:50:12 UTC] PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function WP_Widget::__construct(), 0 passed in /****/****.com/rebuild.****.com/wp-includes/class-wp-widget-factory.php on line 61 and at least 2 expected in /****/****.com/rebuild.****.com/wp-includes/class-wp-widget.php:162
Stack trace:
#0 /****/****.com/rebuild.****.com/wp-includes/class-wp-widget-factory.php(61): WP_Widget->__construct()
#1 /****/****.com/rebuild.****.com/wp-includes/widgets.php(115): WP_Widget_Factory->register('VMenuWidget')
#2 /****/****.com/rebuild.****.com/wp-content/themes/oldtheme/library/widgets.php(255): register_widget('VMenuWidget')
#3 /****/****.com/rebuild.****.com/wp-includes/class-wp-hook.php(303): artWidgetsInit('')
#4 /****/****.com/rebuild.****.com/wp-includes/class-wp-hook.php(327): WP_Hook->apply_filters('', Array)
#5 /****/****.com/rebuild.****.com/wp-includes/plugin.php(470): WP_Hook->do_action(Array)
#6 /****/****.com/rebuild.****.com/wp-includes/widgets.php(1809): do_action('widgets_init')
#7 /****/****.com/rebuild.****.com/wp-includes/class-wp-hook.php(303): wp_widgets_init('')
#8 /****/****.com/rebuild.****.com/wp-includes/class-wp-hook.php(327): WP_Hook->apply_filters(NULL, Array)
#9 /****/****.com/rebuild.****.com/wp-includes/plugin.php(470): WP_Hook->do_action(Array)
#10 /****/****.com/rebuild.****.com/wp-settings.php(578): do_action('init')
#11 /****/****.com/rebuild.****.com/wp-config.php(85): require_once('/home/httpd/vho...')
#12 /****/****.com/rebuild.****.com/wp-load.php(50): require_once('/home/httpd/vho...')
#13 /****/****.com/rebuild.****.com/wp-blog-header.php(13): require_once('/home/httpd/vho...')
#14 /****/****.com/rebuild.****.com/index.php(17): require('/home/httpd/vho...')
#15 {main}
  thrown in /****/****.com/rebuild.****.com/wp-includes/class-wp-widget.php on line 162

And when I rename the PHP file I have no error anymore.

I have also found this Info https://www.php.net/manual/de/migration71.incompatible.php this was the reason for me to think the error was the line i posted.

But thank you very much.

Edited by Kargano
Link to comment
Share on other sites

#2 /****/****.com/rebuild.****.com/wp-content/themes/oldtheme/library/widgets.php(255): register_widget('VMenuWidget')

That code seems to be incorrect because VMenuWidget does not have a __construct which the WordPress documentation says it needs to have.

See if there's an update to whatever theme to be compatible with recent WP versions.

Link to comment
Share on other sites

Yes i know. and there is no update. The widgets.php is the file i have postet the code on start of this topic.

This was the reason that i think the error is on this.

And it is only appear as soon i switch from php 7.4 to php 8

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.