Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/elemento.../includes
File: embed.php
<?php
[0] Fix | Delete
namespace Elementor;
[1] Fix | Delete
[2] Fix | Delete
if ( ! defined( 'ABSPATH' ) ) {
[3] Fix | Delete
exit; // Exit if accessed directly.
[4] Fix | Delete
}
[5] Fix | Delete
[6] Fix | Delete
/**
[7] Fix | Delete
* Elementor embed.
[8] Fix | Delete
*
[9] Fix | Delete
* Elementor embed handler class is responsible for Elementor embed functionality.
[10] Fix | Delete
* The class holds the supported providers with their embed patters, and handles
[11] Fix | Delete
* their custom properties to create custom HTML with the embedded content.
[12] Fix | Delete
*
[13] Fix | Delete
* @since 1.5.0
[14] Fix | Delete
*/
[15] Fix | Delete
class Embed {
[16] Fix | Delete
[17] Fix | Delete
/**
[18] Fix | Delete
* Provider match masks.
[19] Fix | Delete
*
[20] Fix | Delete
* Holds a list of supported providers with their URL structure in a regex format.
[21] Fix | Delete
*
[22] Fix | Delete
* @since 1.5.0
[23] Fix | Delete
* @access private
[24] Fix | Delete
* @static
[25] Fix | Delete
*
[26] Fix | Delete
* @var array Provider URL structure regex.
[27] Fix | Delete
*/
[28] Fix | Delete
private static $provider_match_masks = [
[29] Fix | Delete
'youtube' => '/^.*(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/(?:(?:watch)?\?(?:.*&)?vi?=|(?:embed|v|vi|user|shorts)\/))([^\?&\"\'>]+)/',
[30] Fix | Delete
'vimeo' => '/^.*vimeo\.com\/(?:[a-z]*\/)*([‌​0-9]{6,11})[?]?.*/',
[31] Fix | Delete
'dailymotion' => '/^.*dailymotion.com\/(?:video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/',
[32] Fix | Delete
'videopress' => [
[33] Fix | Delete
'/^(?:http(?:s)?:\/\/)?videos\.files\.wordpress\.com\/([a-zA-Z\d]{8,})\//i',
[34] Fix | Delete
'/^(?:http(?:s)?:\/\/)?(?:www\.)?video(?:\.word)?press\.com\/(?:v|embed)\/([a-zA-Z\d]{8,})(.+)?/i',
[35] Fix | Delete
],
[36] Fix | Delete
];
[37] Fix | Delete
[38] Fix | Delete
/**
[39] Fix | Delete
* Embed patterns.
[40] Fix | Delete
*
[41] Fix | Delete
* Holds a list of supported providers with their embed patters.
[42] Fix | Delete
*
[43] Fix | Delete
* @since 1.5.0
[44] Fix | Delete
* @access private
[45] Fix | Delete
* @static
[46] Fix | Delete
*
[47] Fix | Delete
* @var array Embed patters.
[48] Fix | Delete
*/
[49] Fix | Delete
private static $embed_patterns = [
[50] Fix | Delete
'youtube' => 'https://www.youtube{NO_COOKIE}.com/embed/{VIDEO_ID}?feature=oembed',
[51] Fix | Delete
'vimeo' => 'https://player.vimeo.com/video/{VIDEO_ID}#t={TIME}',
[52] Fix | Delete
'dailymotion' => 'https://dailymotion.com/embed/video/{VIDEO_ID}',
[53] Fix | Delete
'videopress' => 'https://videopress.com/embed/{VIDEO_ID}',
[54] Fix | Delete
];
[55] Fix | Delete
[56] Fix | Delete
/**
[57] Fix | Delete
* Get video properties.
[58] Fix | Delete
*
[59] Fix | Delete
* Retrieve the video properties for a given video URL.
[60] Fix | Delete
*
[61] Fix | Delete
* @since 1.5.0
[62] Fix | Delete
* @access public
[63] Fix | Delete
* @static
[64] Fix | Delete
*
[65] Fix | Delete
* @param string $video_url Video URL.
[66] Fix | Delete
*
[67] Fix | Delete
* @return null|array The video properties, or null.
[68] Fix | Delete
*/
[69] Fix | Delete
public static function get_video_properties( $video_url ) {
[70] Fix | Delete
foreach ( self::$provider_match_masks as $provider => $match_mask ) {
[71] Fix | Delete
if ( ! is_array( $match_mask ) ) {
[72] Fix | Delete
$match_mask = [ $match_mask ];
[73] Fix | Delete
}
[74] Fix | Delete
[75] Fix | Delete
foreach ( $match_mask as $mask ) {
[76] Fix | Delete
if ( preg_match( $mask, $video_url, $matches ) ) {
[77] Fix | Delete
return [
[78] Fix | Delete
'provider' => $provider,
[79] Fix | Delete
'video_id' => $matches[1],
[80] Fix | Delete
];
[81] Fix | Delete
}
[82] Fix | Delete
}
[83] Fix | Delete
}
[84] Fix | Delete
[85] Fix | Delete
return null;
[86] Fix | Delete
}
[87] Fix | Delete
[88] Fix | Delete
/**
[89] Fix | Delete
* Get embed URL.
[90] Fix | Delete
*
[91] Fix | Delete
* Retrieve the embed URL for a given video.
[92] Fix | Delete
*
[93] Fix | Delete
* @since 1.5.0
[94] Fix | Delete
* @access public
[95] Fix | Delete
* @static
[96] Fix | Delete
*
[97] Fix | Delete
* @param string $video_url Video URL.
[98] Fix | Delete
* @param array $embed_url_params Optional. Embed parameters. Default is an
[99] Fix | Delete
* empty array.
[100] Fix | Delete
* @param array $options Optional. Embed options. Default is an
[101] Fix | Delete
* empty array.
[102] Fix | Delete
*
[103] Fix | Delete
* @return null|array The video properties, or null.
[104] Fix | Delete
*/
[105] Fix | Delete
public static function get_embed_url( $video_url, array $embed_url_params = [], array $options = [] ) {
[106] Fix | Delete
$video_properties = self::get_video_properties( $video_url );
[107] Fix | Delete
[108] Fix | Delete
if ( ! $video_properties ) {
[109] Fix | Delete
return null;
[110] Fix | Delete
}
[111] Fix | Delete
[112] Fix | Delete
$embed_pattern = self::$embed_patterns[ $video_properties['provider'] ];
[113] Fix | Delete
[114] Fix | Delete
$replacements = [
[115] Fix | Delete
'{VIDEO_ID}' => $video_properties['video_id'],
[116] Fix | Delete
];
[117] Fix | Delete
[118] Fix | Delete
if ( 'youtube' === $video_properties['provider'] ) {
[119] Fix | Delete
$replacements['{NO_COOKIE}'] = ! empty( $options['privacy'] ) ? '-nocookie' : '';
[120] Fix | Delete
} elseif ( 'vimeo' === $video_properties['provider'] ) {
[121] Fix | Delete
$time_text = '';
[122] Fix | Delete
[123] Fix | Delete
if ( ! empty( $options['start'] ) ) {
[124] Fix | Delete
$time_text = date( 'H\hi\ms\s', $options['start'] ); // PHPCS:Ignore WordPress.DateTime.RestrictedFunctions.date_date
[125] Fix | Delete
}
[126] Fix | Delete
[127] Fix | Delete
$replacements['{TIME}'] = $time_text;
[128] Fix | Delete
[129] Fix | Delete
/**
[130] Fix | Delete
* Handle Vimeo private videos
[131] Fix | Delete
*
[132] Fix | Delete
* Vimeo requires an additional parameter when displaying private/unlisted videos. It has two ways of
[133] Fix | Delete
* passing that parameter:
[134] Fix | Delete
* * as an endpoint - vimeo.com/{video_id}/{privacy_token}
[135] Fix | Delete
* OR
[136] Fix | Delete
* * as a GET parameter named `h` - vimeo.com/{video_id}?h={privacy_token}
[137] Fix | Delete
*
[138] Fix | Delete
* The following regex match looks for either of these methods in the Vimeo URL, and if it finds a privacy
[139] Fix | Delete
* token, it adds it to the embed params array as the `h` parameter (which is how Vimeo can receive it when
[140] Fix | Delete
* using Oembed).
[141] Fix | Delete
*/
[142] Fix | Delete
$h_param = [];
[143] Fix | Delete
preg_match( '/(?|(?:[\?|\&]h={1})([\w]+)|\d\/([\w]+))/', $video_url, $h_param );
[144] Fix | Delete
[145] Fix | Delete
if ( ! empty( $h_param ) ) {
[146] Fix | Delete
$embed_url_params['h'] = $h_param[1];
[147] Fix | Delete
}
[148] Fix | Delete
}
[149] Fix | Delete
[150] Fix | Delete
$embed_pattern = str_replace( array_keys( $replacements ), $replacements, $embed_pattern );
[151] Fix | Delete
[152] Fix | Delete
return add_query_arg( $embed_url_params, $embed_pattern );
[153] Fix | Delete
}
[154] Fix | Delete
[155] Fix | Delete
/**
[156] Fix | Delete
* Get embed HTML.
[157] Fix | Delete
*
[158] Fix | Delete
* Retrieve the final HTML of the embedded URL.
[159] Fix | Delete
*
[160] Fix | Delete
* @since 1.5.0
[161] Fix | Delete
* @access public
[162] Fix | Delete
* @static
[163] Fix | Delete
*
[164] Fix | Delete
* @param string $video_url Video URL.
[165] Fix | Delete
* @param array $embed_url_params Optional. Embed parameters. Default is an
[166] Fix | Delete
* empty array.
[167] Fix | Delete
* @param array $options Optional. Embed options. Default is an
[168] Fix | Delete
* empty array.
[169] Fix | Delete
* @param array $frame_attributes Optional. IFrame attributes. Default is an
[170] Fix | Delete
* empty array.
[171] Fix | Delete
*
[172] Fix | Delete
* @return string The embed HTML.
[173] Fix | Delete
*/
[174] Fix | Delete
public static function get_embed_html( $video_url, array $embed_url_params = [], array $options = [], array $frame_attributes = [] ) {
[175] Fix | Delete
$video_properties = self::get_video_properties( $video_url );
[176] Fix | Delete
[177] Fix | Delete
$default_frame_attributes = [
[178] Fix | Delete
'class' => 'elementor-video-iframe',
[179] Fix | Delete
'allowfullscreen',
[180] Fix | Delete
'allow' => 'clipboard-write',
[181] Fix | Delete
'title' => sprintf(
[182] Fix | Delete
/* translators: %s: Video provider */
[183] Fix | Delete
__( '%s Video Player', 'elementor' ),
[184] Fix | Delete
$video_properties['provider']
[185] Fix | Delete
),
[186] Fix | Delete
];
[187] Fix | Delete
[188] Fix | Delete
$video_embed_url = self::get_embed_url( $video_url, $embed_url_params, $options );
[189] Fix | Delete
if ( ! $video_embed_url ) {
[190] Fix | Delete
return null;
[191] Fix | Delete
}
[192] Fix | Delete
if ( ! isset( $options['lazy_load'] ) || ! $options['lazy_load'] ) {
[193] Fix | Delete
$default_frame_attributes['src'] = $video_embed_url;
[194] Fix | Delete
} else {
[195] Fix | Delete
$default_frame_attributes['data-lazy-load'] = $video_embed_url;
[196] Fix | Delete
}
[197] Fix | Delete
[198] Fix | Delete
if ( isset( $embed_url_params['autoplay'] ) ) {
[199] Fix | Delete
$default_frame_attributes['allow'] = 'autoplay';
[200] Fix | Delete
}
[201] Fix | Delete
[202] Fix | Delete
$frame_attributes = array_merge( $default_frame_attributes, $frame_attributes );
[203] Fix | Delete
[204] Fix | Delete
$attributes_for_print = [];
[205] Fix | Delete
[206] Fix | Delete
foreach ( $frame_attributes as $attribute_key => $attribute_value ) {
[207] Fix | Delete
$attribute_value = esc_attr( $attribute_value );
[208] Fix | Delete
[209] Fix | Delete
if ( is_numeric( $attribute_key ) ) {
[210] Fix | Delete
$attributes_for_print[] = $attribute_value;
[211] Fix | Delete
} else {
[212] Fix | Delete
$attributes_for_print[] = sprintf( '%1$s="%2$s"', $attribute_key, $attribute_value );
[213] Fix | Delete
}
[214] Fix | Delete
}
[215] Fix | Delete
[216] Fix | Delete
$attributes_for_print = implode( ' ', $attributes_for_print );
[217] Fix | Delete
[218] Fix | Delete
$iframe_html = "<iframe $attributes_for_print></iframe>";
[219] Fix | Delete
[220] Fix | Delete
/** This filter is documented in wp-includes/class-oembed.php */
[221] Fix | Delete
return apply_filters( 'oembed_result', $iframe_html, $video_url, $frame_attributes );
[222] Fix | Delete
}
[223] Fix | Delete
[224] Fix | Delete
/**
[225] Fix | Delete
* Get oembed data from the cache.
[226] Fix | Delete
* if not exists in the cache it will fetch from provider and then save to the cache.
[227] Fix | Delete
*
[228] Fix | Delete
* @param string $oembed_url
[229] Fix | Delete
* @param string $cached_post_id
[230] Fix | Delete
*
[231] Fix | Delete
* @return array|null
[232] Fix | Delete
*/
[233] Fix | Delete
public static function get_oembed_data( $oembed_url, $cached_post_id ) {
[234] Fix | Delete
$cached_oembed_data = json_decode( get_post_meta( $cached_post_id, '_elementor_oembed_cache', true ), true );
[235] Fix | Delete
[236] Fix | Delete
if ( isset( $cached_oembed_data[ $oembed_url ] ) ) {
[237] Fix | Delete
return $cached_oembed_data[ $oembed_url ];
[238] Fix | Delete
}
[239] Fix | Delete
[240] Fix | Delete
$normalize_oembed_data = self::fetch_oembed_data( $oembed_url );
[241] Fix | Delete
[242] Fix | Delete
if ( ! $cached_oembed_data ) {
[243] Fix | Delete
$cached_oembed_data = [];
[244] Fix | Delete
}
[245] Fix | Delete
[246] Fix | Delete
update_post_meta( $cached_post_id, '_elementor_oembed_cache', wp_json_encode( array_merge(
[247] Fix | Delete
$cached_oembed_data,
[248] Fix | Delete
[
[249] Fix | Delete
$oembed_url => $normalize_oembed_data,
[250] Fix | Delete
]
[251] Fix | Delete
) ) );
[252] Fix | Delete
[253] Fix | Delete
return $normalize_oembed_data;
[254] Fix | Delete
}
[255] Fix | Delete
[256] Fix | Delete
/**
[257] Fix | Delete
* Fetch oembed data from oembed provider.
[258] Fix | Delete
*
[259] Fix | Delete
* @param string $oembed_url
[260] Fix | Delete
* @return array|null
[261] Fix | Delete
*/
[262] Fix | Delete
public static function fetch_oembed_data( $oembed_url ) {
[263] Fix | Delete
$oembed_data = _wp_oembed_get_object()->get_data( $oembed_url );
[264] Fix | Delete
[265] Fix | Delete
if ( ! $oembed_data ) {
[266] Fix | Delete
return null;
[267] Fix | Delete
}
[268] Fix | Delete
[269] Fix | Delete
return [
[270] Fix | Delete
'thumbnail_url' => $oembed_data->thumbnail_url,
[271] Fix | Delete
'title' => $oembed_data->title,
[272] Fix | Delete
];
[273] Fix | Delete
}
[274] Fix | Delete
[275] Fix | Delete
/**
[276] Fix | Delete
* @param string $oembed_url
[277] Fix | Delete
* @param null|string|int $cached_post_id
[278] Fix | Delete
*
[279] Fix | Delete
* @return string|null
[280] Fix | Delete
*/
[281] Fix | Delete
public static function get_embed_thumbnail_html( $oembed_url, $cached_post_id = null ) {
[282] Fix | Delete
$oembed_data = self::get_oembed_data( $oembed_url, $cached_post_id );
[283] Fix | Delete
[284] Fix | Delete
if ( ! $oembed_data ) {
[285] Fix | Delete
return null;
[286] Fix | Delete
}
[287] Fix | Delete
[288] Fix | Delete
return '<div class="elementor-image">' . sprintf( '<img src="%1$s" alt="%2$s" title="%2$s" width="%3$s" loading="lazy" />', $oembed_data['thumbnail_url'], esc_attr( $oembed_data['title'] ), '100%' ) . '</div>';
[289] Fix | Delete
}
[290] Fix | Delete
}
[291] Fix | Delete
[292] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function