• When this plugin is activated, front-end ajax calls die because of a missing function.

    Example error message:
    [26-Mar-2023 12:04:42 UTC] PHP Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid callback, function “disable_gutenberg_register_settings” not found or invalid function name in /mnt/web208/b3/15/51893315/htdocs/opajaap/betatest/wp-includes/class-wp-hook.php:308

    PHP version 8.0.28
    WP version 6.2-RC4

Viewing 9 replies - 1 through 9 (of 9 total)
  • Plugin Author Jeff Starr

    (@specialk)

    Hi Jacob, glad to help. I am not seeing any error on latest WordPress (testing on PHP 8.0, 8.1, and 8.2). Can you provide steps to repeat the error on *default* WP install? That way I can investigate and try to resolve any issue asap. Thank you

    Thread Starter Jacob N. Breetvelt

    (@opajaap)

    The problem is an inconsistency between
    1. when action hook admin_init is executed and
    2. the result of the function is_admin().

    There are basically two ways to do a frontend ajax call:

    1. do a http call to http(s)://<website>/wp-admin/admin-alax.php with the right query parameters and, of course, having created an extension to the ajax options.
    This method works always IF there is not a ‘security’ plugin that denies http access to the files in wp-admin.
    The second problem with this method is that it is against the coding rules.

    2. do a redirection so e.g. https://mysite.com/myajx/?myquery_args will trigger the load of admin_ajax (because of myajx) and replacing myajx to invoke the ajax proc. This method does not violate the wp coding rules and works always EXCEPT:
    in this case is_admin() returns false while the hook admin_init will be executed.

    A simple plugin (by me) is
    https://www.ads-software.com/plugins/page-load-ajax/
    but what concerns me most is my more important plugin
    https://www.ads-software.com/plugins/wp-photo-album-plus/
    but it will be more work for you to create a test situation.

    Because i rather good understand why and how it goes wrong, i provided the following fix for you:

    in disable-gutenberg.php line 40

    change:
    if (!class_exists('DisableGutenberg')) {

    into:
    if (is_admin() && !class_exists('DisableGutenberg')) {

    and it is fixed. Frontend ajax in the right way (by redirection) works without the fatal error, and the gutenberg editor is disabled (also the widgets).

    BTW there are more ways to prove the inconsistency of is_admin() and admin_init:
    If you put this code in the activation screen ( function form($instance) ) of a classic widget:
    echo is_admin()?'is_admin() is true':'is_admin() is false';
    and open it in a gutenberg widget screen, it prints:
    is_admin() is false while it reports true in a classic widget activatiuon screen.

    Hope this helps.

    Plugin Author Jeff Starr

    (@specialk)

    Thanks, I will take a look at this and see if any changes are necessary. To be honest, if I can’t repeat the issue out of the box on default WordPress, probably won’t be making any changes. Thanks again, and let me know if any further infos, etc. Glad to help anytime.

    Thread Starter Jacob N. Breetvelt

    (@opajaap)

    To reproduce the problem do the following:

    0 De-activate all plugins
    1 Install and activate plugin https://www.ads-software.com/plugins/wp-photo-album-plus/
    2 On the dashboard go to Photo Albums -> Albums
    3 Click the button Add new, the page will reload.
    4 Click the button Upload to this album, the upoload page will open.
    5 Upload 2 (or more) photos (.jpg) at once.
    6 Create a page with the content: [wppa]
    7 Open the page, you will see – what we call – an album cover, showing a thumbnail image of one of the photos you just uploaded and two links: See .. photos and Slideshow
    8 Click the Slidesow link or the other link or the image and a spinner pops up and a little later the corresponding display.
    9 Activate the Disable Gutenberg plugin
    10 Re-open the page and click a link or the image and you will get an alert box telling yopu:

    Unexpected output: 
    Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid ca...

    , being the first 100 chars of:

    Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid callback, function “disable_gutenberg_register_settings” not found or invalid function name in /…/class-wp-hook.php:308

    11 Install my patch to your plugin and do it again, it will work like before the Disable Gutenbverg plugin was activated

    Plugin Author Jeff Starr

    (@specialk)

    Ok thanks. Will look into this and try to resolve for the next update.

    Thread Starter Jacob N. Breetvelt

    (@opajaap)

    Sorry

    Plugin Author Jeff Starr

    (@specialk)

    Hey Jacob, I tried looking into this, got to step 2 and then stuck on spinning wheel on plugin screen. Here is a screenshot of what I’m seeing. Also checked the error log while the wheel was spinning, got these errors associated with the photo album plugin:

    PHP Deprecated: Automatic conversion of false to array is deprecated in /wp-content/plugins/wp-photo-album-plus/wppa-adminbar.php on line 38
    
    PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 122880 bytes) in /wp-includes/functions.php on line 7030

    Also the proposed solution of changing code to this:

    if (is_admin() && !class_exists('DisableGutenberg')) {

    ..would cause breakage elsewhere, and so is not recommended.

    Let me know if you have any further ideas, I want to help however is possible. Thank you.

    Thread Starter Jacob N. Breetvelt

    (@opajaap)

    What is your php version? I can not reproduce the warning.
    You can fix it by changing line 18 of wppa-adminbar.php from $menu_items = false; to $menu_items = array();

    The fatal error is also not reproduceable on my testsite.

    In the mean time i did some further investigation and the incosistency is (e.g., therte are more):

    In disable-gutenberg.php line 60 reads:
    add_action('admin_init', 'disable_gutenberg_register_settings');

    The function disable_gutenberg_register_settings() is located in
    …/inc/settings-register.php that is only included in line 99 of disable-gutenberg.php like:

    
    if (is_admin()) {
    ...
    ...
         require_once DISABLE_GUTENBERG_DIR .'inc/settings-register.php';
    ...
    }
    

    So it can be called when the admin_init hook is executed while is_admin() does not yet returns true.

    I did the following: changed line 60 into:
    add_action('admin_init', 'disable_gutenberg_register_settings', 999);

    Now i get the same error on the next admin_init item: 'disable_gutenberg_reset_options' as expected.

    Changing them all does the original error come back so that is not a solution.

    I could get it working only when ‘is_admin() {‘ on lie 95 and its corresponding } is removed.

    In this situation frontend ajax works correcxtly and the editor is set to classic and the widgets also.

    If there is no important reason for placing the 4 require_once’s inside is_admin(){} i would remove it

    Plugin Author Jeff Starr

    (@specialk)

    We develop our plugins on multiple versions of PHP, currently that includes 7.4, 8.0, 8.1, and 8.2.

    I appreciate all the information, and hopefully it will be useful for others who are looking for it.

    Thanks @opajaap, and feel free to post again with any further information, glad to help anytime.

Viewing 9 replies - 1 through 9 (of 9 total)
  • The topic ‘Fatal php error’ is closed to new replies.