Conditionally dequeue dependency of scripts

Solution 1:

Here we will dequeue and deregister elementor-dialog and elementor-frontend, then we will re-register elementor-frontend without the elementor-dialog dependency:

// This needs to fire after priority 5 which is where Elementor
// handles enqueueing scripts. We're ok since the default is 10.
add_action( 'wp_enqueue_scripts', 'wpse_elementor_frontend_scripts' );
function wpse_elementor_frontend_scripts() {
    // Optionally add guard clauses such as checking if( ! is_singular('cpt') )...

    // Bail if Elementor is not available.
    if ( ! defined( 'ELEMENTOR_VERSION' ) ) {
        return;
    }

    // Dequeue and deregister elementor-dialog
    wp_dequeue_script( 'elementor-dialog' );
    wp_deregister_script( 'elementor-dialog' );

    // Dequeue and deregister elementor-frontend
    wp_dequeue_script( 'elementor-frontend' );
    wp_deregister_script( 'elementor-frontend' );

    // Re-register elementor-frontend without the elementor-dialog dependency.
    $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
    wp_register_script(
            'elementor-frontend',
            ELEMENTOR_ASSETS_URL . 'js/frontend' . $suffix . '.js',
            [
                //'elementor-dialog', // <-- We removed this
                'elementor-waypoints',
                'jquery-swiper',
            ],
            ELEMENTOR_VERSION,
            true
        );

    // debugging... 
    //$scripts = wp_scripts();
    //exit ( print_r( $scripts ) );
}

Solution 2:

In this solution, we will use wp_scripts() to modify the $wp_scripts global and then safely deregister elementor-dialog.

We will remove the elementor-dialog dependency from the elementor-frontend handle, then dequeue the elementor-dialog script which is enqueued separately by the Elementor\Frontend class.

/**
 * The Elementor\Frontend class runs its register_scripts() method on
 * wp_enqueue_scripts at priority 5, so we want to hook in after this has taken place.
 */
add_action( 'wp_enqueue_scripts', 'wpse_elementor_frontend_scripts_modifier', 6 );
function wpse_elementor_frontend_scripts_modifier() {

    // Customize guard clauses to bail if we don't want to run this code.
    /*if ( ! is_singular( 'cpt' ) ) {
        return;
    }*/

    // Get all scripts.
    $scripts = wp_scripts();

    // Bail if something went wrong.
    if ( ! ( $scripts instanceof WP_Scripts ) ) {
        return;
    }

    // Array of handles to remove.
    $handles_to_remove = [
        'elementor-dialog',
    ];

    // Flag indicating if we have removed the handles.
    $handles_updated = false;

    // Remove desired handles from the elementor-frontend script. 
    foreach ( $scripts->registered as $dependency_object_id => $dependency_object ) {

        if ( 'elementor-frontend' === $dependency_object_id ) {

            // Bail if something went wrong.
            if ( ! ( $dependency_object instanceof _WP_Dependency ) ) {
                return;
            }

            // Bail if there are no dependencies for some reason.
            if ( empty( $dependency_object->deps ) ) {
                return;
            }

            // Do the handle removal.
            foreach ( $dependency_object->deps as $dep_key => $handle ) {
                if ( in_array( $handle, $handles_to_remove ) ) {
                    unset( $dependency_object->deps[ $dep_key ] );
                    $dependency_object->deps = array_values( $dependency_object->deps );  // "reindex" array
                    $handles_updated = true;
                }
            }
        }
    }

    // If we have updated the handles, dequeue the relevant dependencies which
    // were enqueued separately Elementor\Frontend.
    if ( $handles_updated ) {
        wp_dequeue_script( 'elementor-dialog' );
        wp_deregister_script( 'elementor-dialog' );
    }
}

By modifying elementor-frontend before dequeueing elementor-dialog, we will not unintentionally dequeue elementor-frontend when we dequeue elementor-dialog.

When testing this code, I inspected the $wp_scripts global (via wp_scripts()) to ensure that the desired results took effect. E.g.

$scripts = wp_scripts();
print_r( $scripts ); 

Relevant part of $scripts before modification:

...

[elementor-dialog] => _WP_Dependency Object
(
    [handle] => elementor-dialog
    [src] => http://example.com/wp-content/plugins/elementor/assets/lib/dialog/dialog.js
    [deps] => Array
            (
                    [0] => jquery-ui-position
            )

    [ver] => 4.1.0
    [args] => 
    [extra] => Array
            (
                    [group] => 1
            )

)

[elementor-frontend] => _WP_Dependency Object
(
    [handle] => elementor-frontend
    [src] => http://example.com/wp-content/plugins/elementor/assets/js/frontend.js
    [deps] => Array
            (
                    [0] => elementor-dialog
                    [1] => elementor-waypoints
                    [2] => jquery-swiper
            )

    [ver] => 1.9.7
    [args] => 
    [extra] => Array
            (
                    [group] => 1
            )

)

...

Relevant part of $scripts after modification:

(Note that the elementor-dialog node has now been removed.)

...
[elementor-frontend] => _WP_Dependency Object
(
    [handle] => elementor-frontend
    [src] => http://example.com/wp-content/plugins/elementor/assets/js/frontend.js
    [deps] => Array
            (
                    [0] => elementor-waypoints
                    [1] => jquery-swiper
            )

    [ver] => 1.9.7
    [args] => 
    [extra] => Array
            (
                    [group] => 1
            )

)
...

Leave a Comment