@@ -799,6 +799,40 @@ public static function generate_condition_key( $rule ) {
799
799
return $ rule ['major ' ] . ': ' . $ rule ['minor ' ];
800
800
}
801
801
802
+ /**
803
+ * Normalize widget `content` into a string suitable for block scanning.
804
+ *
805
+ * @since $$next-version$$
806
+ *
807
+ * @param mixed $content The widget instance 'content' value.
808
+ * @return string|false Normalized string content or false if none.
809
+ */
810
+ private static function normalize_widget_content ( $ content ) {
811
+ if ( empty ( $ content ) ) {
812
+ return false ;
813
+ }
814
+
815
+ if ( is_string ( $ content ) ) {
816
+ return $ content ;
817
+ }
818
+
819
+ if ( ! is_array ( $ content ) ) {
820
+ return false ;
821
+ }
822
+
823
+ if ( isset ( $ content ['content ' ] ) && is_string ( $ content ['content ' ] ) ) {
824
+ return $ content ['content ' ];
825
+ }
826
+
827
+ if ( isset ( $ content [0 ] ) && is_array ( $ content [0 ] ) && isset ( $ content [0 ]['blockName ' ] ) ) {
828
+ // Looks like a parsed blocks array.
829
+ return serialize_blocks ( $ content );
830
+ }
831
+
832
+ // Unknown array shape: treat as no visibility rules.
833
+ return false ;
834
+ }
835
+
802
836
/**
803
837
* Determine whether the widget should be displayed based on conditions set by the user.
804
838
*
@@ -826,36 +860,45 @@ public static function filter_widget( $instance ) {
826
860
return $ instance ;
827
861
}
828
862
return false ;
829
- } elseif ( ! empty ( $ instance ['content ' ] ) && has_blocks ( $ instance ['content ' ] ) ) {
830
- $ scanner = Block_Scanner::create ( $ instance ['content ' ] );
831
- if ( ! $ scanner ) {
832
- // No Rules: Display widget.
833
- return $ instance ;
834
- }
863
+ }
835
864
836
- // Find the first block that opens
837
- while ( $ scanner ->next_delimiter () ) {
838
- if ( ! $ scanner ->opens_block () ) {
839
- continue ;
840
- }
865
+ if ( empty ( $ instance ['content ' ] ) ) {
866
+ return $ instance ;
867
+ }
868
+ $ content = self ::normalize_widget_content ( isset ( $ instance ['content ' ] ) ? $ instance ['content ' ] : null );
841
869
842
- $ attributes = $ scanner ->allocate_and_return_parsed_attributes ();
870
+ if ( false === $ content || ! has_blocks ( $ content ) ) {
871
+ // No visibility found.
872
+ return $ instance ;
873
+ }
843
874
844
- if ( ! is_array ( $ attributes ) || empty ( $ attributes ['conditions ' ]['rules ' ] ) ) {
845
- // No Rules: Display widget.
846
- return $ instance ;
847
- }
875
+ $ scanner = Block_Scanner::create ( $ content );
876
+ if ( ! $ scanner ) {
877
+ // No Rules: Display widget.
878
+ return $ instance ;
879
+ }
848
880
849
- if ( self ::filter_widget_check_conditions ( $ attributes ['conditions ' ] ) ) {
850
- // Rules passed checks: Display widget.
851
- return $ instance ;
852
- }
881
+ // Find the first block that opens
882
+ while ( $ scanner ->next_delimiter () ) {
883
+ if ( ! $ scanner ->opens_block () ) {
884
+ continue ;
885
+ }
886
+
887
+ $ attributes = $ scanner ->allocate_and_return_parsed_attributes ();
853
888
854
- // Rules failed checks: Hide widget.
855
- return false ;
889
+ if ( ! is_array ( $ attributes ) || empty ( $ attributes ['conditions ' ]['rules ' ] ) ) {
890
+ // No Rules: Display widget.
891
+ return $ instance ;
856
892
}
857
- }
858
893
894
+ if ( self ::filter_widget_check_conditions ( $ attributes ['conditions ' ] ) ) {
895
+ // Rules passed checks: Display widget.
896
+ return $ instance ;
897
+ }
898
+
899
+ // Rules failed checks: Hide widget.
900
+ return false ;
901
+ }
859
902
// No visibility found.
860
903
return $ instance ;
861
904
}
0 commit comments