@@ -566,17 +566,75 @@ public function panels_data_migrations( $panels_data ) {
566566 return $ panels_data ;
567567 }
568568
569+ /**
570+ * Remove style entries that are not arrays from a layout.
571+ *
572+ * A style is an array of settings. Anything else stored under the key, a
573+ * null, an empty string, a number, cannot be rendered or sanitized, and a
574+ * null crashes the builder's style checks when the layout is loaded. Only
575+ * the three style locations are touched: `widgets[*][panels_info][style]`,
576+ * `grids[*][style]` and `grid_cells[*][style]`. Items that are not arrays
577+ * are left alone. Running it twice gives the same result, so it is safe to
578+ * call both before and after filters that may write a style.
579+ *
580+ * @param mixed $panels_data The layout. Returned unchanged unless it is an array.
581+ *
582+ * @return mixed
583+ */
584+ public function remove_invalid_styles ( $ panels_data ) {
585+ if ( ! is_array ( $ panels_data ) ) {
586+ return $ panels_data ;
587+ }
588+
589+ if ( ! empty ( $ panels_data ['widgets ' ] ) && is_array ( $ panels_data ['widgets ' ] ) ) {
590+ foreach ( $ panels_data ['widgets ' ] as $ i => $ widget ) {
591+ if (
592+ ! is_array ( $ widget ) ||
593+ empty ( $ widget ['panels_info ' ] ) ||
594+ ! is_array ( $ widget ['panels_info ' ] ) ||
595+ ! array_key_exists ( 'style ' , $ widget ['panels_info ' ] )
596+ ) {
597+ continue ;
598+ }
599+
600+ if ( ! is_array ( $ widget ['panels_info ' ]['style ' ] ) ) {
601+ unset( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] );
602+ }
603+ }
604+ }
605+
606+ foreach ( array ( 'grids ' , 'grid_cells ' ) as $ list ) {
607+ if ( empty ( $ panels_data [ $ list ] ) || ! is_array ( $ panels_data [ $ list ] ) ) {
608+ continue ;
609+ }
610+
611+ foreach ( $ panels_data [ $ list ] as $ i => $ item ) {
612+ if ( ! is_array ( $ item ) || ! array_key_exists ( 'style ' , $ item ) ) {
613+ continue ;
614+ }
615+
616+ if ( ! is_array ( $ item ['style ' ] ) ) {
617+ unset( $ panels_data [ $ list ][ $ i ]['style ' ] );
618+ }
619+ }
620+ }
621+
622+ return $ panels_data ;
623+ }
624+
569625 /**
570626 * Sanitize the style fields in panels_data
571627 *
572628 * @return mixed
573629 */
574630 public function sanitize_all ( $ panels_data ) {
575631 $ panels_data = apply_filters ( 'siteorigin_panels_data_migration ' , $ panels_data );
632+ $ panels_data = $ this ->remove_invalid_styles ( $ panels_data );
633+
576634 if ( ! empty ( $ panels_data ['widgets ' ] ) ) {
577635 // Sanitize the widgets
578636 for ( $ i = 0 ; $ i < count ( $ panels_data ['widgets ' ] ); $ i ++ ) {
579- if ( empty ( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ] ) ) {
637+ if ( ! is_array ( $ panels_data [ ' widgets ' ][ $ i ] ) || empty ( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ] ) ) {
580638 continue ;
581639 }
582640
@@ -586,51 +644,42 @@ public function sanitize_all( $panels_data ) {
586644 );
587645 }
588646
589- if ( isset ( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] ) ) {
590- if ( is_null ( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] ) || ! is_array ( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] ) ) {
591- unset( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] );
592- } elseif ( empty ( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] ) ) {
593- continue ;
594- } else {
595- $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] = $ this ->sanitize_style_fields ( 'widget ' , $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] );
596- }
647+ if ( empty ( $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] ) ) {
648+ continue ;
597649 }
650+
651+ $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] = $ this ->sanitize_style_fields ( 'widget ' , $ panels_data ['widgets ' ][ $ i ]['panels_info ' ]['style ' ] );
598652 }
599653 }
600654
601655 if ( ! empty ( $ panels_data ['grids ' ] ) ) {
602656 // The rows
603657 for ( $ i = 0 ; $ i < count ( $ panels_data ['grids ' ] ); $ i ++ ) {
658+ if ( ! is_array ( $ panels_data ['grids ' ][ $ i ] ) ) {
659+ continue ;
660+ }
661+
604662 if ( ! empty ( $ panels_data ['grids ' ][ $ i ]['label ' ] ) ) {
605663 $ panels_data ['grids ' ][ $ i ]['label ' ] = sanitize_text_field (
606664 $ panels_data ['grids ' ][ $ i ]['label ' ]
607665 );
608666 }
609667
610- if ( isset ( $ panels_data ['grids ' ][ $ i ]['style ' ] ) ) {
611- if ( is_null ( $ panels_data ['grids ' ][ $ i ]['style ' ] ) || ! is_array ( $ panels_data ['grids ' ][ $ i ]['style ' ] ) ) {
612- unset( $ panels_data ['grids ' ][ $ i ]['style ' ] );
613- } elseif ( empty ( $ panels_data ['grids ' ][ $ i ]['style ' ] ) ) {
614- continue ;
615- } else {
616- $ panels_data ['grids ' ][ $ i ]['style ' ] = $ this ->sanitize_style_fields ( 'row ' , $ panels_data ['grids ' ][ $ i ]['style ' ] );
617- }
668+ if ( empty ( $ panels_data ['grids ' ][ $ i ]['style ' ] ) ) {
669+ continue ;
618670 }
671+ $ panels_data ['grids ' ][ $ i ]['style ' ] = $ this ->sanitize_style_fields ( 'row ' , $ panels_data ['grids ' ][ $ i ]['style ' ] );
619672 }
620673 }
621674
622675 if ( ! empty ( $ panels_data ['grid_cells ' ] ) ) {
623676 // And finally, the cells
624677 for ( $ i = 0 ; $ i < count ( $ panels_data ['grid_cells ' ] ); $ i ++ ) {
625- if ( isset ( $ panels_data ['grid_cells ' ][ $ i ]['style ' ] ) ) {
626- if ( is_null ( $ panels_data ['grid_cells ' ][ $ i ]['style ' ] ) || ! is_array ( $ panels_data ['grid_cells ' ][ $ i ]['style ' ] ) ) {
627- unset( $ panels_data ['grid_cells ' ][ $ i ]['style ' ] );
628- } elseif ( empty ( $ panels_data ['grid_cells ' ][ $ i ]['style ' ] ) ) {
629- continue ;
630- } else {
631- $ panels_data ['grid_cells ' ][ $ i ]['style ' ] = $ this ->sanitize_style_fields ( 'cell ' , $ panels_data ['grid_cells ' ][ $ i ]['style ' ] );
632- }
678+ if ( ! is_array ( $ panels_data ['grid_cells ' ][ $ i ] ) || empty ( $ panels_data ['grid_cells ' ][ $ i ]['style ' ] ) ) {
679+ continue ;
633680 }
681+
682+ $ panels_data ['grid_cells ' ][ $ i ]['style ' ] = $ this ->sanitize_style_fields ( 'cell ' , $ panels_data ['grid_cells ' ][ $ i ]['style ' ] );
634683 }
635684 }
636685
0 commit comments