PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.3-beta
16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 All 507 releases
← All changes | extensions/blocks/podcast-player/podcast-player.php +21 -244 13.6.2 → 16.3-beta View file →
@@ -9,13 +9,11 @@
9 9
10 10 namespace Automattic\Jetpack\Extensions\Podcast_Player;
11 11
12 12 use Automattic\Jetpack\Blocks;
13 -use Jetpack_Gutenberg;
14 -use Jetpack_Podcast_Helper;
15 13
16 -if ( ! class_exists( 'Jetpack_Podcast_Helper' ) ) {
17 - require_once JETPACK__PLUGIN_DIR . '/_inc/lib/class-jetpack-podcast-helper.php';
14 +if ( ! defined( 'ABSPATH' ) ) {
15 + exit( 0 );
18 16 }
19 17
20 18 /**
21 19 * Registers the block for use in Gutenberg. This is done via an action so that
@@ -24,12 +22,12 @@
24 22 function register_block() {
25 23 Blocks::jetpack_register_block(
26 24 __DIR__,
27 25 array(
28 - 'render_callback' => __NAMESPACE__ . '\render_block',
26 + 'render_callback' => __NAMESPACE__ . '\render_block',
29 27 // Since Gutenberg #31873.
30 - 'style' => 'wp-mediaelement',
31 -
28 + 'style' => 'wp-mediaelement',
29 + 'render_email_callback' => __NAMESPACE__ . '\render_email',
32 30 )
33 31 );
34 32 }
35 33 add_action( 'init', __NAMESPACE__ . '\register_block' );
@@ -34,25 +32,12 @@
34 32 }
35 33 add_action( 'init', __NAMESPACE__ . '\register_block' );
36 34
37 35 /**
38 - * Returns the error message wrapped in HTML if current user
39 - * has the capability to edit the post. Public visitors will
40 - * never see errors.
36 + * Podcast Player block registration/dependency declaration.
41 37 *
42 - * @param string $message The error message to display.
43 - * @return string
44 - */
45 -function render_error( $message ) {
46 - // Suppress errors for users unable to address them.
47 - if ( ! current_user_can( 'edit_posts' ) ) {
48 - return '';
49 - }
50 - return '<p>' . esc_html( $message ) . '</p>';
51 -}
52 -
53 -/**
54 - * Podcast Player block registration/dependency declaration.
38 + * The render implementation lives in render.php and is only loaded when the
39 + * block is actually rendered, keeping it out of the eager front-end path.
55 40 *
56 41 * @param array $attributes Array containing the Podcast Player block attributes.
57 42 * @param string $content Fallback content - a direct link to RSS, as rendered by save.js.
58 43 * @return string
@@ -57,234 +42,26 @@
57 42 * @param string $content Fallback content - a direct link to RSS, as rendered by save.js.
58 43 * @return string
59 44 */
60 45 function render_block( $attributes, $content ) {
61 - // Don't render an interactive version of the block outside the frontend context.
62 - if ( ! jetpack_is_frontend() ) {
63 - return $content;
64 - }
65 -
66 - // Test for empty URLS.
67 - if ( empty( $attributes['url'] ) ) {
68 - return render_error( __( 'No Podcast URL provided. Please enter a valid Podcast RSS feed URL.', 'jetpack' ) );
69 - }
70 -
71 - // Test for invalid URLs.
72 - if ( ! wp_http_validate_url( $attributes['url'] ) ) {
73 - return render_error( __( 'Your podcast URL is invalid and couldn\'t be embedded. Please double check your URL.', 'jetpack' ) );
74 - }
75 -
76 - if ( ! empty( $attributes['selectedEpisodes'] ) ) {
77 - $guids = array_map(
78 - function ( $episode ) {
79 - return $episode['guid'];
80 - },
81 - $attributes['selectedEpisodes']
82 - );
83 - $player_args = array( 'guids' => $guids );
84 - } else {
85 - $player_args = array();
86 - }
87 -
88 - // Sanitize the URL.
89 - $attributes['url'] = esc_url_raw( $attributes['url'] );
90 - $player_data = ( new Jetpack_Podcast_Helper( $attributes['url'] ) )->get_player_data( $player_args );
91 -
92 - if ( is_wp_error( $player_data ) ) {
93 - return render_error( $player_data->get_error_message() );
94 - }
95 -
96 - return render_player( $player_data, $attributes );
46 + require_once __DIR__ . '/render.php';
47 + return render_block_implementation( $attributes, $content );
97 48 }
98 49
99 50 /**
100 - * Renders the HTML for the Podcast player and tracklist.
51 + * Render podcast player block for email.
101 52 *
102 - * @param array $player_data The player data details.
103 - * @param array $attributes Array containing the Podcast Player block attributes.
104 - * @return string The HTML for the podcast player.
105 - */
106 -function render_player( $player_data, $attributes ) {
107 - // If there are no tracks (it is possible) then display appropriate user facing error message.
108 - if ( empty( $player_data['tracks'] ) ) {
109 - return render_error( __( 'No tracks available to play.', 'jetpack' ) );
110 - }
111 -
112 - // Only use the amount of tracks requested.
113 - $player_data['tracks'] = array_slice(
114 - $player_data['tracks'],
115 - 0,
116 - absint( $attributes['itemsToShow'] )
117 - );
118 -
119 - // Generate a unique id for the block instance.
120 - $instance_id = wp_unique_id( 'jetpack-podcast-player-block-' . get_the_ID() . '-' );
121 - $player_data['playerId'] = $instance_id;
122 -
123 - // Generate object to be used as props for PodcastPlayer.
124 - $player_props = array_merge(
125 - // Add all attributes.
126 - array( 'attributes' => $attributes ),
127 - // Add all player data.
128 - $player_data
129 - );
130 -
131 - $primary_colors = get_colors( 'primary', $attributes, 'color' );
132 - $secondary_colors = get_colors( 'secondary', $attributes, 'color' );
133 - $background_colors = get_colors( 'background', $attributes, 'background-color' );
134 -
135 - $player_classes_name = trim( "{$secondary_colors['class']} {$background_colors['class']}" );
136 - $player_inline_style = trim( "{$secondary_colors['style']} {$background_colors['style']}" );
137 - $player_inline_style .= get_css_vars( $attributes );
138 - $wrapper_attributes = \WP_Block_Supports::get_instance()->apply_block_supports();
139 - $block_classname = Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attributes, array( 'is-default' ) );
140 - $is_amp = Blocks::is_amp_request();
141 -
142 - ob_start();
143 - ?>
144 - <div class="<?php echo esc_attr( $block_classname ); ?>"<?php echo ! empty( $wrapper_attributes['style'] ) ? ' style="' . esc_attr( $wrapper_attributes['style'] ) . '"' : ''; ?> id="<?php echo esc_attr( $instance_id ); ?>">
145 - <section
146 - class="jetpack-podcast-player <?php echo esc_attr( $player_classes_name ); ?>"
147 - style="<?php echo esc_attr( $player_inline_style ); ?>"
148 - >
149 - <?php
150 - render(
151 - 'podcast-header',
152 - array_merge(
153 - $player_props,
154 - array(
155 - 'primary_colors' => $primary_colors,
156 - 'player_id' => $player_data['playerId'],
157 - )
158 - )
159 - );
160 - ?>
161 - <?php if ( count( $player_data['tracks'] ) > 1 ) : ?>
162 - <ol class="jetpack-podcast-player__tracks">
163 - <?php foreach ( $player_data['tracks'] as $track_index => $attachment ) : ?>
164 - <?php
165 - render(
166 - 'playlist-track',
167 - array(
168 - 'is_active' => 0 === $track_index,
169 - 'attachment' => $attachment,
170 - 'primary_colors' => $primary_colors,
171 - 'secondary_colors' => $secondary_colors,
172 - )
173 - );
174 - ?>
175 - <?php endforeach; ?>
176 - </ol>
177 - <?php endif; ?>
178 - </section>
179 - <?php if ( ! $is_amp ) : ?>
180 - <script type="application/json"><?php echo wp_json_encode( $player_props ); ?></script>
181 - <?php endif; ?>
182 - </div>
183 - <?php
184 - /**
185 - * Enqueue necessary scripts and styles.
186 - */
187 - if ( ! $is_amp ) {
188 - wp_enqueue_style( 'wp-mediaelement' );
189 - }
190 - Jetpack_Gutenberg::load_assets_as_required( __DIR__, array( 'mediaelement' ) );
191 -
192 - return ob_get_clean();
193 -}
194 -
195 -/**
196 - * Given the color name, block attributes and the CSS property,
197 - * the function will return an array with the `class` and `style`
198 - * HTML attributes to be used straight in the markup.
53 + * The render implementation lives in render.php and is only loaded when the
54 + * block is actually rendered, keeping it out of the eager front-end path.
199 55 *
200 - * @example
201 - * $color = get_colors( 'secondary', $attributes, 'border-color'
202 - * => array( 'class' => 'has-secondary', 'style' => 'border-color: #333' )
56 + * @since 15.0
203 57 *
204 - * @param string $name Color attribute name, for instance `primary`, `secondary`, ...
205 - * @param array $attrs Block attributes.
206 - * @param string $property Color CSS property, fo instance `color`, `background-color`, ...
207 - * @return array Colors array.
208 - */
209 -function get_colors( $name, $attrs, $property ) {
210 - $attr_color = "{$name}Color";
211 - $attr_custom = 'custom' . ucfirst( $attr_color );
212 -
213 - $color = isset( $attrs[ $attr_color ] ) ? $attrs[ $attr_color ] : null;
214 - $custom_color = isset( $attrs[ $attr_custom ] ) ? $attrs[ $attr_custom ] : null;
215 -
216 - $colors = array(
217 - 'class' => '',
218 - 'style' => '',
219 - );
220 -
221 - if ( $color || $custom_color ) {
222 - $colors['class'] .= "has-{$name}";
223 -
224 - if ( $color ) {
225 - $colors['class'] .= " has-{$color}-{$property}";
226 - } elseif ( $custom_color ) {
227 - $colors['style'] .= "{$property}: {$custom_color};";
228 - }
229 - }
230 -
231 - return $colors;
232 -}
233 -
234 -/**
235 - * It generates a string with CSS variables according to the
236 - * block colors, prefixing each one with `--jetpack-podcast-player'.
58 + * @param string $block_content The original block HTML content.
59 + * @param array $parsed_block The parsed block data including attributes.
60 + * @param object $rendering_context Email rendering context.
237 61 *
238 - * @param array $attrs Podcast Block attributes object.
239 - * @return string CSS variables depending on block colors.
62 + * @return string
240 63 */
241 -function get_css_vars( $attrs ) {
242 - $colors_name = array( 'primary', 'secondary', 'background' );
243 -
244 - $inline_style = '';
245 - foreach ( $colors_name as $color ) {
246 - $hex_color = 'hex' . ucfirst( $color ) . 'Color';
247 - if ( ! empty( $attrs[ $hex_color ] ) ) {
248 - $inline_style .= " --jetpack-podcast-player-{$color}: {$attrs[ $hex_color ]};";
249 - }
250 - }
251 - return $inline_style;
252 -}
253 -
254 -/**
255 - * Render the given template in server-side.
256 - * Important note:
257 - * The $template_props array will be extracted.
258 - * This means it will create a var for each array item.
259 - * Keep it mind when using this param to pass
260 - * properties to the template.
261 - *
262 - * @html-template-var array $template_props
263 - *
264 - * @param string $name Template name, available in `./templates` folder.
265 - * @param array $template_props Template properties. Optional.
266 - * @param bool $print Render template. True as default.
267 - * @return string|null HTML markup or null.
268 - */
269 -function render( $name, $template_props = array(), $print = true ) {
270 - if ( ! strpos( $name, '.php' ) ) {
271 - $name = $name . '.php';
272 - }
273 -
274 - $template_path = __DIR__ . '/templates/' . $name;
275 -
276 - if ( ! file_exists( $template_path ) ) {
277 - return '';
278 - }
279 -
280 - if ( $print ) {
281 - include $template_path;
282 - } else {
283 - ob_start();
284 - include $template_path;
285 - $markup = ob_get_contents();
286 - ob_end_clean();
287 -
288 - return $markup;
289 - }
64 +function render_email( $block_content, array $parsed_block, $rendering_context ) {
65 + require_once __DIR__ . '/render.php';
66 + return render_email_implementation( $block_content, $parsed_block, $rendering_context );
290 67 }