|
1 <?php |
|
2 /** |
|
3 * Server-side rendering of the `core/legacy-widget` block. |
|
4 * |
|
5 * @package WordPress |
|
6 */ |
|
7 |
|
8 /** |
|
9 * Renders the 'core/legacy-widget' block. |
|
10 * |
|
11 * @param array $attributes The block attributes. |
|
12 * |
|
13 * @return string Rendered block. |
|
14 */ |
|
15 function render_block_core_legacy_widget( $attributes ) { |
|
16 global $wp_widget_factory; |
|
17 |
|
18 if ( isset( $attributes['id'] ) ) { |
|
19 $sidebar_id = wp_find_widgets_sidebar( $attributes['id'] ); |
|
20 return wp_render_widget( $attributes['id'], $sidebar_id ); |
|
21 } |
|
22 |
|
23 if ( ! isset( $attributes['idBase'] ) ) { |
|
24 return ''; |
|
25 } |
|
26 |
|
27 $id_base = $attributes['idBase']; |
|
28 if ( method_exists( $wp_widget_factory, 'get_widget_key' ) && method_exists( $wp_widget_factory, 'get_widget_object' ) ) { |
|
29 $widget_key = $wp_widget_factory->get_widget_key( $id_base ); |
|
30 $widget_object = $wp_widget_factory->get_widget_object( $id_base ); |
|
31 } else { |
|
32 /* |
|
33 * This file is copied from the published @wordpress/widgets package when WordPress |
|
34 * Core is built. Because the package is a dependency of both WordPress Core and the |
|
35 * Gutenberg plugin where the block editor is developed, this fallback condition is |
|
36 * required until the minimum required version of WordPress for the plugin is raised |
|
37 * to 5.8. |
|
38 */ |
|
39 $widget_key = gutenberg_get_widget_key( $id_base ); |
|
40 $widget_object = gutenberg_get_widget_object( $id_base ); |
|
41 } |
|
42 |
|
43 if ( ! $widget_key || ! $widget_object ) { |
|
44 return ''; |
|
45 } |
|
46 |
|
47 if ( isset( $attributes['instance']['encoded'], $attributes['instance']['hash'] ) ) { |
|
48 $serialized_instance = base64_decode( $attributes['instance']['encoded'] ); |
|
49 if ( wp_hash( $serialized_instance ) !== $attributes['instance']['hash'] ) { |
|
50 return ''; |
|
51 } |
|
52 $instance = unserialize( $serialized_instance ); |
|
53 } else { |
|
54 $instance = array(); |
|
55 } |
|
56 |
|
57 $args = array( |
|
58 'widget_id' => $widget_object->id, |
|
59 'widget_name' => $widget_object->name, |
|
60 ); |
|
61 |
|
62 ob_start(); |
|
63 the_widget( $widget_key, $instance, $args ); |
|
64 return ob_get_clean(); |
|
65 } |
|
66 |
|
67 /** |
|
68 * Registers the 'core/legacy-widget' block. |
|
69 */ |
|
70 function register_block_core_legacy_widget() { |
|
71 register_block_type_from_metadata( |
|
72 __DIR__ . '/legacy-widget', |
|
73 array( |
|
74 'render_callback' => 'render_block_core_legacy_widget', |
|
75 ) |
|
76 ); |
|
77 } |
|
78 |
|
79 add_action( 'init', 'register_block_core_legacy_widget' ); |
|
80 |
|
81 /** |
|
82 * Intercepts any request with legacy-widget-preview in the query param and, if |
|
83 * set, renders a page containing a preview of the requested Legacy Widget |
|
84 * block. |
|
85 */ |
|
86 function handle_legacy_widget_preview_iframe() { |
|
87 if ( empty( $_GET['legacy-widget-preview'] ) ) { |
|
88 return; |
|
89 } |
|
90 |
|
91 if ( ! current_user_can( 'edit_theme_options' ) ) { |
|
92 return; |
|
93 } |
|
94 |
|
95 define( 'IFRAME_REQUEST', true ); |
|
96 |
|
97 ?> |
|
98 <!doctype html> |
|
99 <html <?php language_attributes(); ?>> |
|
100 <head> |
|
101 <meta charset="<?php bloginfo( 'charset' ); ?>" /> |
|
102 <meta name="viewport" content="width=device-width, initial-scale=1" /> |
|
103 <link rel="profile" href="https://gmpg.org/xfn/11" /> |
|
104 <?php wp_head(); ?> |
|
105 <style> |
|
106 /* Reset theme styles */ |
|
107 html, body, #page, #content { |
|
108 padding: 0 !important; |
|
109 margin: 0 !important; |
|
110 } |
|
111 </style> |
|
112 </head> |
|
113 <body <?php body_class(); ?>> |
|
114 <div id="page" class="site"> |
|
115 <div id="content" class="site-content"> |
|
116 <?php |
|
117 $registry = WP_Block_Type_Registry::get_instance(); |
|
118 $block = $registry->get_registered( 'core/legacy-widget' ); |
|
119 echo $block->render( $_GET['legacy-widget-preview'] ); |
|
120 ?> |
|
121 </div><!-- #content --> |
|
122 </div><!-- #page --> |
|
123 <?php wp_footer(); ?> |
|
124 </body> |
|
125 </html> |
|
126 <?php |
|
127 |
|
128 exit; |
|
129 } |
|
130 |
|
131 // Use admin_init instead of init to ensure get_current_screen function is already available. |
|
132 // This isn't strictly required, but enables better compatibility with existing plugins. |
|
133 // See: https://github.com/WordPress/gutenberg/issues/32624. |
|
134 add_action( 'admin_init', 'handle_legacy_widget_preview_iframe', 20 ); |