PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta
16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-videopress / src / class-video-block-email-renderer.php
jetpack / jetpack_vendor / automattic / jetpack-videopress / src Last commit date
js 2 months ago tus 1 month ago videopress-divi 2 months ago videopress-divi-5 2 months ago class-access-control.php 3 months ago class-admin-ui.php 3 weeks ago class-ajax.php 1 month ago class-attachment-handler.php 1 month ago class-block-editor-content.php 1 month ago class-block-editor-extensions.php 1 month ago class-block-replacement.php 9 months ago class-caption-tracks.php 1 month ago class-data.php 1 month ago class-divi.php 2 months ago class-initial-state.php 1 month ago class-initializer.php 1 month ago class-jwt-token-bridge.php 2 years ago class-module-control.php 3 years ago class-options.php 2 years ago class-package-version.php 3 weeks ago class-plan.php 2 years ago class-rest-controller.php 1 month ago class-site.php 3 years ago class-stats.php 1 year ago class-status.php 9 months ago class-upload-exception.php 3 years ago class-uploader-rest-endpoints.php 9 months ago class-uploader.php 1 month ago class-utils.php 4 months ago class-video-block-email-renderer.php 2 months ago class-videopress-rest-api-v1-features.php 6 months ago class-videopress-rest-api-v1-settings.php 1 month ago class-videopress-rest-api-v1-site.php 2 years ago class-videopress-rest-api-v1-stats.php 3 years ago class-videopresstoken.php 1 month ago class-wpcom-rest-api-v2-attachment-field-videopress.php 9 months ago class-wpcom-rest-api-v2-attachment-videopress-data.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress-caption-tracks.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress.php 1 month ago class-xmlrpc.php 1 month ago utility-functions.php 1 month ago
class-video-block-email-renderer.php
131 lines
1 <?php
2 /**
3 * VideoPress video block email renderer class.
4 *
5 * @package automattic/jetpack-videopress
6 */
7
8 namespace Automattic\Jetpack\VideoPress;
9
10 /**
11 * Handles rendering VideoPress video blocks for email contexts.
12 */
13 class Video_Block_Email_Renderer {
14
15 /**
16 * Render VideoPress video block for email.
17 *
18 * @param string $block_content The original block HTML content.
19 * @param array $parsed_block The parsed block data including attributes.
20 * @param object $rendering_context Email rendering context.
21 *
22 * @return string
23 */
24 public static function render( $block_content, $parsed_block, $rendering_context ) {
25 // Validate input parameters and required dependencies.
26 if ( ! isset( $parsed_block['attrs'] ) || ! is_array( $parsed_block['attrs'] ) ||
27 ! class_exists( '\Automattic\WooCommerce\EmailEditor\Integrations\Core\Renderer\Blocks\Embed' ) ) {
28 return '';
29 }
30
31 $attributes = $parsed_block['attrs'];
32
33 // Get the VideoPress URL from the guid attribute.
34 $videopress_url = self::get_videopress_url( $attributes );
35
36 if ( empty( $videopress_url ) ) {
37 return '';
38 }
39
40 // For private videos, render a simple link to the post since the video isn't accessible on VideoPress.
41 // The isPrivate attribute is pre-computed by the block editor based on video and site settings.
42 if ( isset( $attributes['isPrivate'] ) && true === $attributes['isPrivate'] ) {
43 return self::render_link( $parsed_block );
44 }
45
46 // Create a mock embed block structure that WooCommerce's embed renderer can handle.
47 // The embed renderer will detect VideoPress from the URL and render it appropriately.
48 $mock_embed_block = array(
49 'blockName' => 'core/embed',
50 'attrs' => array(
51 'url' => $videopress_url,
52 'providerNameSlug' => 'videopress',
53 ),
54 'innerHTML' => sprintf(
55 '<figure class="wp-block-embed is-type-video is-provider-videopress"><div class="wp-block-embed__wrapper">%s</div></figure>',
56 esc_url( $videopress_url )
57 ),
58 );
59
60 // Preserve email_attrs if present (used for spacing/width calculations).
61 if ( ! empty( $parsed_block['email_attrs'] ) ) {
62 $mock_embed_block['email_attrs'] = $parsed_block['email_attrs'];
63 }
64
65 // Use WooCommerce's core embed renderer.
66 // @phan-suppress-next-line PhanUndeclaredClassMethod -- Optional WooCommerce dependency, checked with class_exists() above.
67 $woo_embed_renderer = new \Automattic\WooCommerce\EmailEditor\Integrations\Core\Renderer\Blocks\Embed();
68
69 // @phan-suppress-next-line PhanUndeclaredClassMethod -- Optional WooCommerce dependency, checked with class_exists() above.
70 return $woo_embed_renderer->render( $mock_embed_block['innerHTML'], $mock_embed_block, $rendering_context );
71 }
72
73 /**
74 * Render a simple link for private VideoPress videos in emails.
75 * Links to the post containing the video since private videos aren't accessible on VideoPress.
76 *
77 * @param array $parsed_block The parsed block data.
78 *
79 * @return string The rendered link HTML.
80 */
81 private static function render_link( $parsed_block ) {
82 $post_url = get_the_permalink();
83
84 if ( empty( $post_url ) ) {
85 return '';
86 }
87
88 $link_text = __( 'Visit the post to watch the video', 'jetpack-videopress-pkg' );
89
90 $link_html = sprintf(
91 '<a href="%s" target="_blank" rel="noopener noreferrer">%s</a>',
92 esc_url( $post_url ),
93 esc_html( $link_text )
94 );
95
96 // Wrap with spacing if email_attrs are present.
97 $email_attrs = $parsed_block['email_attrs'] ?? array();
98 if ( ! empty( $email_attrs['padding'] ) ) {
99 $link_html = sprintf(
100 '<p style="padding: %s;">%s</p>',
101 esc_attr( $email_attrs['padding'] ),
102 $link_html
103 );
104 }
105
106 return $link_html;
107 }
108
109 /**
110 * Get the VideoPress URL from block attributes for email rendering.
111 *
112 * @param array $attributes Block attributes.
113 *
114 * @return string VideoPress URL or empty string.
115 */
116 private static function get_videopress_url( $attributes ) {
117 // Construct URL from guid attribute.
118 if ( ! empty( $attributes['guid'] ) ) {
119 $guid = $attributes['guid'];
120
121 // VideoPress guids are alphanumeric only (e.g., "nfbj0J36").
122 // Validate format to prevent any injection issues.
123 if ( preg_match( '/^[a-zA-Z0-9]+$/', $guid ) ) {
124 return 'https://videopress.com/v/' . $guid;
125 }
126 }
127
128 return '';
129 }
130 }
131