Diff: STRATO-apps/wordpress_03/app/wp-includes/blocks/legacy-widget.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
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 + * @since 5.8.0
12 + *
13 + * @global WP_Widget_Factory $wp_widget_factory.
14 + *
15 + * @param array $attributes The block attributes.
16 + *
17 + * @return string Rendered block.
18 + */
19 + function render_block_core_legacy_widget( $attributes ) {
20 + global $wp_widget_factory;
21 +
22 + if ( isset( $attributes['id'] ) ) {
23 + $sidebar_id = wp_find_widgets_sidebar( $attributes['id'] );
24 + return wp_render_widget( $attributes['id'], $sidebar_id );
25 + }
26 +
27 + if ( ! isset( $attributes['idBase'] ) ) {
28 + return '';
29 + }
30 +
31 + $id_base = $attributes['idBase'];
32 + $widget_key = $wp_widget_factory->get_widget_key( $id_base );
33 + $widget_object = $wp_widget_factory->get_widget_object( $id_base );
34 +
35 + if ( ! $widget_key || ! $widget_object ) {
36 + return '';
37 + }
38 +
39 + if ( isset( $attributes['instance']['encoded'], $attributes['instance']['hash'] ) ) {
40 + $serialized_instance = base64_decode( $attributes['instance']['encoded'] );
41 + if ( ! hash_equals( wp_hash( $serialized_instance ), (string) $attributes['instance']['hash'] ) ) {
42 + return '';
43 + }
44 + $instance = unserialize( $serialized_instance );
45 + } else {
46 + $instance = array();
47 + }
48 +
49 + $args = array(
50 + 'widget_id' => $widget_object->id,
51 + 'widget_name' => $widget_object->name,
52 + );
53 +
54 + ob_start();
55 + the_widget( $widget_key, $instance, $args );
56 + return ob_get_clean();
57 + }
58 +
59 + /**
60 + * Registers the 'core/legacy-widget' block.
61 + *
62 + * @since 5.8.0
63 + */
64 + function register_block_core_legacy_widget() {
65 + register_block_type_from_metadata(
66 + __DIR__ . '/legacy-widget',
67 + array(
68 + 'render_callback' => 'render_block_core_legacy_widget',
69 + )
70 + );
71 + }
72 +
73 + add_action( 'init', 'register_block_core_legacy_widget' );
74 +
75 + /**
76 + * Intercepts any request with legacy-widget-preview in the query param and, if
77 + * set, renders a page containing a preview of the requested Legacy Widget
78 + * block.
79 + *
80 + * @since 5.8.0
81 + */
82 + function handle_legacy_widget_preview_iframe() {
83 + if ( empty( $_GET['legacy-widget-preview'] ) ) {
84 + return;
85 + }
86 +
87 + if ( ! current_user_can( 'edit_theme_options' ) ) {
88 + return;
89 + }
90 +
91 + define( 'IFRAME_REQUEST', true );
92 +
93 + ?>
94 + <!doctype html>
95 + <html <?php language_attributes(); ?>>
96 + <head>
97 + <meta charset="<?php bloginfo( 'charset' ); ?>" />
98 + <meta name="viewport" content="width=device-width, initial-scale=1" />
99 + <link rel="profile" href="https://gmpg.org/xfn/11" />
100 + <?php wp_head(); ?>
101 + <style>
102 + /* Reset theme styles */
103 + html, body, #page, #content {
104 + padding: 0 !important;
105 + margin: 0 !important;
106 + }
107 +
108 + /* Hide root level text nodes */
109 + body {
110 + font-size: 0 !important;
111 + }
112 +
113 + /* Hide non-widget elements */
114 + body *:not(#page):not(#content):not(.widget):not(.widget *) {
115 + display: none !important;
116 + font-size: 0 !important;
117 + height: 0 !important;
118 + left: -9999px !important;
119 + max-height: 0 !important;
120 + max-width: 0 !important;
121 + opacity: 0 !important;
122 + pointer-events: none !important;
123 + position: absolute !important;
124 + top: -9999px !important;
125 + transform: translate(-9999px, -9999px) !important;
126 + visibility: hidden !important;
127 + z-index: -999 !important;
128 + }
129 +
130 + /* Restore widget font-size */
131 + .widget {
132 + font-size: var(--global--font-size-base);
133 + }
134 + </style>
135 + </head>
136 + <body <?php body_class(); ?>>
137 + <div id="page" class="site">
138 + <div id="content" class="site-content">
139 + <?php
140 + $registry = WP_Block_Type_Registry::get_instance();
141 + $block = $registry->get_registered( 'core/legacy-widget' );
142 + echo $block->render( $_GET['legacy-widget-preview'] );
143 + ?>
144 + </div><!-- #content -->
145 + </div><!-- #page -->
146 + <?php wp_footer(); ?>
147 + </body>
148 + </html>
149 + <?php
150 +
151 + exit;
152 + }
153 +
154 + // Use admin_init instead of init to ensure get_current_screen function is already available.
155 + // This isn't strictly required, but enables better compatibility with existing plugins.
156 + // See: https://github.com/WordPress/gutenberg/issues/32624.
157 + add_action( 'admin_init', 'handle_legacy_widget_preview_iframe', 20 );
158 +