Plugin Directory

Changeset 3689958


Ignore:
Timestamp:
09/10/2026 01:19:12 PM (6 weeks ago)
Author:
voordemensen
Message:

2.1.4: guard wp.data subscriber in admin script (fixes Yoast editor breakage since 2.1.3)

Location:
voordemensen
Files:
4 edited
9 copied

Legend:

Unmodified
Added
Removed
  • voordemensen/tags/2.1.4/js/vdm_adminscript.js

    r3098862 r3689958  
    44  * @fires createNotice
    55*/
    6 const unsubscribe = wp.data.subscribe(function () {
    7     let select = wp.data.select('core/editor');
    8     var isSavingPost = select.isSavingPost();
    9     var isAutosavingPost = select.isAutosavingPost();
    10     var didPostSaveRequestSucceed = select.didPostSaveRequestSucceed();
    11     var EditedPostContent = select.getEditedPostContent();
    12     if (isSavingPost && !isAutosavingPost && didPostSaveRequestSucceed) {
    13         if(EditedPostContent.includes('[vdm') && !jQuery('#voordemensen_event_id').val()) {
     6( function ( wp ) {
     7    if ( ! wp || ! wp.data || typeof wp.data.subscribe !== 'function' ) {
     8        return;
     9    }
     10
     11    var unsubscribe = wp.data.subscribe( function () {
     12        // Other plugins' stores (e.g. Yoast SEO) can emit before 'core/editor' is registered,
     13        // and some editor screens never register it at all. Never throw inside a subscriber:
     14        // an exception here aborts wp.data's listener loop and breaks every other plugin
     15        // that subscribed to the same store.
     16        var editor = wp.data.select( 'core/editor' );
     17        if ( ! editor || typeof editor.isSavingPost !== 'function' ) {
     18            return;
     19        }
     20
     21        if ( ! editor.isSavingPost() || editor.isAutosavingPost() || ! editor.didPostSaveRequestSucceed() ) {
     22            return;
     23        }
     24
     25        var content    = editor.getEditedPostContent() || '';
     26        var eventField = document.getElementById( 'voordemensen_event_id' );
     27        var eventId    = eventField ? eventField.value : '';
     28
     29        if ( content.indexOf( '[vdm' ) !== -1 && ! eventId ) {
    1430            unsubscribe();
    15             jQuery('#voordemensen_event_id').focus();
    16             ( function( wp ) {
    17                 wp.data.dispatch( 'core/notices' ).createNotice(
     31            if ( eventField ) {
     32                eventField.focus();
     33            }
     34            var notices = wp.data.dispatch( 'core/notices' );
     35            if ( notices && typeof notices.createNotice === 'function' ) {
     36                notices.createNotice(
    1837                    'error',
    19                     'Let op: je gebruikt een VoordeMensen-shortcode terwijl deze post niet aan een VoordeMensen Evenement is gekoppeld!', 
     38                    'Let op: je gebruikt een VoordeMensen-shortcode terwijl deze post niet aan een VoordeMensen Evenement is gekoppeld!',
    2039                    {
    2140                        isDismissible: true,
    … …  
    2342                    }
    2443                );
    25             } )( window.wp );
    26         }       
    27     }
    28 });
     44            }
     45        }
     46    } );
     47} )( window.wp );
  • voordemensen/tags/2.1.4/readme.txt

    r3645103 r3689958  
    66Tested up to: 7.1
    77Requires PHP: 7.4
    8 Stable tag: 2.1.3
     8Stable tag: 2.1.4
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
    … …  
    6262== Changelog ==
    6363
     64= 2.1.4 =
     65Fixed: since 2.1.3 the block editor's save-warning script could break other plugins' editor UI (reported with Yoast SEO: its dropdowns no longer opened) with the console error "Cannot read properties of undefined (reading 'isSavingPost')". The script subscribed to wp.data and read the 'core/editor' store unguarded; when another plugin's store updated before 'core/editor' was registered, the callback threw and aborted wp.data's listener loop for everyone. The script now checks that the store exists before using it, declares its wp-data / wp-notices dependencies, and is only loaded in the block editor of a post or page.
     66
    6467= 2.1.3 =
    6568Fixed: the editor save-warning that flags a VoordeMensen shortcode on a post with no linked event never appeared, because its admin script was enqueued under a handle it was not registered with, so the script never loaded. It now works in the block editor.
  • voordemensen/tags/2.1.4/voordemensen.php

    r3645103 r3689958  
    44 * Plugin URI:        https://github.com/VoordeMensen/wordpress-plugin
    55 * Description:       Verbind WordPress met het VoordeMensen kaartverkoopsysteem
    6  * Version:           2.1.3
     6 * Version:           2.1.4
    77 * Requires at least: 5.0
    88 * Requires PHP:      7.4
    … …  
    158158add_action('init', 'voordemensen_register_script');
    159159function voordemensen_register_script(){
    160         wp_register_script( 'vdm_script', plugins_url('/js/vdm_script.js', __FILE__), array('jquery'), '2.1.3', true );
     160        wp_register_script( 'vdm_script', plugins_url('/js/vdm_script.js', __FILE__), array('jquery'), '2.1.4', true );
    161161}
    162162add_action('admin_init', 'voordemensen_register_adminscript');
    163163function voordemensen_register_adminscript() {
    164         wp_register_script( 'vdm_adminscript', plugins_url('/js/vdm_adminscript.js', __FILE__), array('jquery'), '2.1.3', true);
     164        // Uses wp.data (core/editor + core/notices); depend on those handles so load order is guaranteed.
     165        wp_register_script( 'vdm_adminscript', plugins_url('/js/vdm_adminscript.js', __FILE__), array('wp-data', 'wp-notices'), '2.1.4', true);
    165166}
    166167
    … …  
    171172}
    172173
     174// The save-warning script only makes sense in the block editor of a post/page:
     175// enqueue_block_editor_assets fires only when the block editor is loaded, and the
     176// screen check skips the site editor / widgets screen where 'core/editor' does not exist.
     177add_action( 'enqueue_block_editor_assets', 'voordemensen_enqueue_block_editor_script' );
     178function voordemensen_enqueue_block_editor_script() {
     179    $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
     180    if ( $screen && 'post' !== $screen->base ) {
     181        return;
     182    }
     183    wp_enqueue_script( 'vdm_adminscript' );
     184}
     185
    173186function voordemensen_admin_queue( $hook ) {
    174     global $post;
    175     if ( $hook == 'post-new.php' || $hook == 'post.php' ) {
    176                 wp_enqueue_script('vdm_adminscript');
    177     }
    178 
    179187    // Register and enqueue the external CSS file
    180     wp_register_style('voordemensen_admin_style', plugins_url('css/admin-style.css', __FILE__), array(), '2.1.3');
     188    wp_register_style('voordemensen_admin_style', plugins_url('css/admin-style.css', __FILE__), array(), '2.1.4');
    181189    wp_enqueue_style('voordemensen_admin_style');
    182190}
  • voordemensen/trunk/js/vdm_adminscript.js

    r3098862 r3689958  
    44  * @fires createNotice
    55*/
    6 const unsubscribe = wp.data.subscribe(function () {
    7     let select = wp.data.select('core/editor');
    8     var isSavingPost = select.isSavingPost();
    9     var isAutosavingPost = select.isAutosavingPost();
    10     var didPostSaveRequestSucceed = select.didPostSaveRequestSucceed();
    11     var EditedPostContent = select.getEditedPostContent();
    12     if (isSavingPost && !isAutosavingPost && didPostSaveRequestSucceed) {
    13         if(EditedPostContent.includes('[vdm') && !jQuery('#voordemensen_event_id').val()) {
     6( function ( wp ) {
     7    if ( ! wp || ! wp.data || typeof wp.data.subscribe !== 'function' ) {
     8        return;
     9    }
     10
     11    var unsubscribe = wp.data.subscribe( function () {
     12        // Other plugins' stores (e.g. Yoast SEO) can emit before 'core/editor' is registered,
     13        // and some editor screens never register it at all. Never throw inside a subscriber:
     14        // an exception here aborts wp.data's listener loop and breaks every other plugin
     15        // that subscribed to the same store.
     16        var editor = wp.data.select( 'core/editor' );
     17        if ( ! editor || typeof editor.isSavingPost !== 'function' ) {
     18            return;
     19        }
     20
     21        if ( ! editor.isSavingPost() || editor.isAutosavingPost() || ! editor.didPostSaveRequestSucceed() ) {
     22            return;
     23        }
     24
     25        var content    = editor.getEditedPostContent() || '';
     26        var eventField = document.getElementById( 'voordemensen_event_id' );
     27        var eventId    = eventField ? eventField.value : '';
     28
     29        if ( content.indexOf( '[vdm' ) !== -1 && ! eventId ) {
    1430            unsubscribe();
    15             jQuery('#voordemensen_event_id').focus();
    16             ( function( wp ) {
    17                 wp.data.dispatch( 'core/notices' ).createNotice(
     31            if ( eventField ) {
     32                eventField.focus();
     33            }
     34            var notices = wp.data.dispatch( 'core/notices' );
     35            if ( notices && typeof notices.createNotice === 'function' ) {
     36                notices.createNotice(
    1837                    'error',
    19                     'Let op: je gebruikt een VoordeMensen-shortcode terwijl deze post niet aan een VoordeMensen Evenement is gekoppeld!', 
     38                    'Let op: je gebruikt een VoordeMensen-shortcode terwijl deze post niet aan een VoordeMensen Evenement is gekoppeld!',
    2039                    {
    2140                        isDismissible: true,
    … …  
    2342                    }
    2443                );
    25             } )( window.wp );
    26         }       
    27     }
    28 });
     44            }
     45        }
     46    } );
     47} )( window.wp );
  • voordemensen/trunk/readme.txt

    r3645103 r3689958  
    66Tested up to: 7.1
    77Requires PHP: 7.4
    8 Stable tag: 2.1.3
     8Stable tag: 2.1.4
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
    … …  
    6262== Changelog ==
    6363
     64= 2.1.4 =
     65Fixed: since 2.1.3 the block editor's save-warning script could break other plugins' editor UI (reported with Yoast SEO: its dropdowns no longer opened) with the console error "Cannot read properties of undefined (reading 'isSavingPost')". The script subscribed to wp.data and read the 'core/editor' store unguarded; when another plugin's store updated before 'core/editor' was registered, the callback threw and aborted wp.data's listener loop for everyone. The script now checks that the store exists before using it, declares its wp-data / wp-notices dependencies, and is only loaded in the block editor of a post or page.
     66
    6467= 2.1.3 =
    6568Fixed: the editor save-warning that flags a VoordeMensen shortcode on a post with no linked event never appeared, because its admin script was enqueued under a handle it was not registered with, so the script never loaded. It now works in the block editor.
  • voordemensen/trunk/voordemensen.php

    r3645103 r3689958  
    44 * Plugin URI:        https://github.com/VoordeMensen/wordpress-plugin
    55 * Description:       Verbind WordPress met het VoordeMensen kaartverkoopsysteem
    6  * Version:           2.1.3
     6 * Version:           2.1.4
    77 * Requires at least: 5.0
    88 * Requires PHP:      7.4
    … …  
    158158add_action('init', 'voordemensen_register_script');
    159159function voordemensen_register_script(){
    160         wp_register_script( 'vdm_script', plugins_url('/js/vdm_script.js', __FILE__), array('jquery'), '2.1.3', true );
     160        wp_register_script( 'vdm_script', plugins_url('/js/vdm_script.js', __FILE__), array('jquery'), '2.1.4', true );
    161161}
    162162add_action('admin_init', 'voordemensen_register_adminscript');
    163163function voordemensen_register_adminscript() {
    164         wp_register_script( 'vdm_adminscript', plugins_url('/js/vdm_adminscript.js', __FILE__), array('jquery'), '2.1.3', true);
     164        // Uses wp.data (core/editor + core/notices); depend on those handles so load order is guaranteed.
     165        wp_register_script( 'vdm_adminscript', plugins_url('/js/vdm_adminscript.js', __FILE__), array('wp-data', 'wp-notices'), '2.1.4', true);
    165166}
    166167
    … …  
    171172}
    172173
     174// The save-warning script only makes sense in the block editor of a post/page:
     175// enqueue_block_editor_assets fires only when the block editor is loaded, and the
     176// screen check skips the site editor / widgets screen where 'core/editor' does not exist.
     177add_action( 'enqueue_block_editor_assets', 'voordemensen_enqueue_block_editor_script' );
     178function voordemensen_enqueue_block_editor_script() {
     179    $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
     180    if ( $screen && 'post' !== $screen->base ) {
     181        return;
     182    }
     183    wp_enqueue_script( 'vdm_adminscript' );
     184}
     185
    173186function voordemensen_admin_queue( $hook ) {
    174     global $post;
    175     if ( $hook == 'post-new.php' || $hook == 'post.php' ) {
    176                 wp_enqueue_script('vdm_adminscript');
    177     }
    178 
    179187    // Register and enqueue the external CSS file
    180     wp_register_style('voordemensen_admin_style', plugins_url('css/admin-style.css', __FILE__), array(), '2.1.3');
     188    wp_register_style('voordemensen_admin_style', plugins_url('css/admin-style.css', __FILE__), array(), '2.1.4');
    181189    wp_enqueue_style('voordemensen_admin_style');
    182190}
Note: See TracChangeset for help on using the changeset viewer.