PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, 3D PDF FlipBook, Google Reviews, YouTube Videos, Upload & Embed PDF documents / 3.9.5
EmbedPress – PDF Embedder, 3D PDF FlipBook, Google Reviews, YouTube Videos, Upload & Embed PDF documents v3.9.5
4.6.3 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 trunk 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 4.0.0 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.14 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9 4.3.0 4.3.1 4.4.0 4.4.1 4.4.10 4.4.11 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5.0 4.5.1
embedpress / EmbedPress / Includes / Classes / Helper.php
embedpress / EmbedPress / Includes / Classes Last commit date
Elementor_Enhancer.php 3 years ago EmbedPress_Core_Installer.php 6 years ago EmbedPress_Notice.php 4 years ago EmbedPress_Plugin_Usage_Tracker.php 2 years ago Extend_CustomPlayer_Controls.php 3 years ago Extend_Elementor_Controls.php 3 years ago Feature_Enhancer.php 2 years ago Helper.php 2 years ago
Helper.php
736 lines
1 <?php
2
3 namespace EmbedPress\Includes\Classes;
4 use EmbedPress\Shortcode;
5
6 if ( !defined('ABSPATH') ) {
7 exit;
8 } // Exit if accessed directly
9
10 class Helper {
11
12 /**
13 * Parse a query string into an associative array.
14 *
15 * If multiple values are found for the same key, the value of that key
16 * value pair will become an array. This function does not parse nested
17 * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will
18 * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).
19 *
20 * @param string $str Query string to parse
21 * @param int|bool $urlEncoding How the query string is encoded
22 *
23 * @return array
24 */
25
26 public function __construct () {
27 add_action('wp_ajax_lock_content_form_handler', [$this, 'lock_content_form_handler']);
28 add_action('wp_ajax_nopriv_lock_content_form_handler', [$this, 'lock_content_form_handler']);
29 add_action( 'wp_head', [$this, 'ep_add_meta_tags'] );
30 }
31
32 public function ep_add_meta_tags() {
33 echo 'abstract';
34 }
35
36 public static function parse_query($str, $urlEncoding = true)
37 {
38 $result = [];
39
40 if ($str === '') {
41 return $result;
42 }
43
44 if ($urlEncoding === true) {
45 $decoder = function ($value) {
46 return rawurldecode(str_replace('+', ' ', $value));
47 };
48 } elseif ($urlEncoding === PHP_QUERY_RFC3986) {
49 $decoder = 'rawurldecode';
50 } elseif ($urlEncoding === PHP_QUERY_RFC1738) {
51 $decoder = 'urldecode';
52 } else {
53 $decoder = function ($str) { return $str; };
54 }
55
56 foreach (explode('&', $str) as $kvp) {
57 $parts = explode('=', $kvp, 2);
58 $key = $decoder($parts[0]);
59 $value = isset($parts[1]) ? $decoder($parts[1]) : null;
60 if (!isset($result[$key])) {
61 $result[$key] = $value;
62 } else {
63 if (!is_array($result[$key])) {
64 $result[$key] = [$result[$key]];
65 }
66 $result[$key][] = $value;
67 }
68 }
69
70 return $result;
71 }
72 public static function get_pdf_renderer() {
73 // $renderer = EMBEDPRESS_URL_ASSETS . 'pdf/web/viewer.html';
74
75 $renderer = admin_url('admin-ajax.php?action=get_viewer');
76
77 // @TODO; apply settings query args here
78 return $renderer;
79 }
80
81 public static function get_extension_from_file_url($url) {
82 $urlSplit = explode(".", $url);
83 $ext = end($urlSplit);
84 return $ext;
85 }
86
87 public static function is_file_url($url) {
88 $pattern = '/\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/i';
89 return preg_match($pattern, $url) === 1;
90 }
91
92 public static function is_opensea($url) {
93 return strpos($url, "opensea.io") !== false;
94 }
95 public static function is_youtube_channel($url) {
96 return (bool) (preg_match('~(?:https?:\/\/)?(?:www\.)?(?:youtube.com\/)(?:channel\/|c\/|user\/|@)(\w+)~i', (string) $url));
97 }
98
99 public static function is_youtube($url) {
100 return (bool) (preg_match('~(?:https?://)?(?:www\.)?(?:youtube\.com|youtu\.be)/watch\?v=([^&]+)~i', (string) $url));
101 }
102
103 // Saved sources data temporary in wp_options table
104 public static function get_source_data($blockid, $source_url, $source_option_name, $source_temp_option_name) {
105
106
107 if(self::is_youtube_channel($source_url)){
108 $source_name = 'YoutubeChannel';
109 }
110 else if(self::is_youtube($source_url)){
111 $source_name = 'Youtube';
112 }
113 else if (!empty(self::is_file_url($source_url))) {
114 $source_name = 'document_' . self::get_extension_from_file_url($source_url);
115 }
116 else if(self::is_opensea($source_url)){
117 $source_name = 'OpenSea';
118 }
119 else{
120 Shortcode::get_embera_instance();
121 $collectios = Shortcode::get_collection();
122 $provider = $collectios->findProviders($source_url);
123 if(!empty($provider[$source_url])){
124 $source_name = $provider[$source_url]->getProviderName();
125 }
126 else{
127 $source_name = 'Unknown Source';
128 }
129 }
130
131 if(!empty($blockid) && $blockid != 'undefined'){
132 $sources = json_decode(get_option($source_temp_option_name), true);
133
134 if(!$sources) {
135 $sources = array();
136 }
137 $exists = false;
138
139 foreach($sources as $i => $source) {
140 if ($source['id'] === $blockid) {
141 $sources[$i]['source']['name'] = $source_name;
142 $sources[$i]['source']['url'] = $source_url;
143 $exists = true;
144 break;
145 }
146 }
147
148 if(!$exists) {
149 $sources[] = array('id' => $blockid, 'source' => array('name' => $source_name, 'url' => $source_url, 'count' => 1));
150 }
151
152 update_option($source_temp_option_name, json_encode($sources));
153 }
154 }
155
156 // Saved source data when post updated
157 public static function get_save_source_data_on_post_update( $source_option_name, $source_temp_option_name ) {
158
159 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
160 return;
161 }
162 $temp_data = json_decode(get_option($source_temp_option_name), true);
163 $source_data = json_decode(get_option($source_option_name), true);
164 if(!$temp_data) {
165 $temp_data = array();
166 }
167 if(!$source_data) {
168 $source_data = array();
169 }
170
171 $sources = array_merge($temp_data, $source_data);
172
173 $unique_sources = array();
174 foreach ($sources as $source) {
175 $unique_sources[$source['id']] = $source;
176 }
177
178 $unique_sources = array_values($unique_sources);
179
180 delete_option($source_temp_option_name);
181
182 update_option($source_option_name, json_encode($unique_sources));
183 }
184
185 //Delete source data from option table when widget is removed
186 public static function get_delete_source_data($blockid, $source_option_name, $source_temp_option_name) {
187 if (!empty($blockid) && $blockid != 'undefined') {
188 $sources = json_decode(get_option($source_option_name), true);
189 $temp_sources = json_decode(get_option($source_temp_option_name), true);
190 if ($sources) {
191 foreach ($sources as $i => $source) {
192 if ($source['id'] === $blockid) {
193 unset($sources[$i]);
194 break;
195 }
196 }
197 update_option($source_option_name, json_encode(array_values($sources)));
198 }
199 if ($temp_sources) {
200 foreach ($temp_sources as $i => $source) {
201 if ($source['id'] === $blockid) {
202 unset($temp_sources[$i]);
203 break;
204 }
205 }
206 update_option($source_temp_option_name, json_encode(array_values($temp_sources)));
207 }
208 }
209 wp_die();
210 }
211
212 //Delete source temporary data when reload without update or publish
213 public static function get_delete_source_temp_data_on_reload($source_temp_option_name) {
214 $source_temp_data = json_decode(get_option($source_temp_option_name), true);
215 if ($source_temp_data ) {
216 delete_option( $source_temp_option_name );
217 }
218 }
219
220 public static function get_file_title($url){
221 return get_the_title(attachment_url_to_postid( $url ));
222 }
223
224 public static function get_hash(){
225 $hash_key = get_option(EMBEDPRESS_PLG_NAME . '_hash_key');
226 if(!$hash_key){
227 $hash_key = wp_hash_password(wp_generate_password(30));
228 update_option(EMBEDPRESS_PLG_NAME . '_hash_key', $hash_key);
229 }
230 return $hash_key;
231 }
232
233 public function lock_content_form_handler()
234 {
235
236 $client_id = isset($_POST['client_id']) ? sanitize_text_field($_POST['client_id']) : '';
237 $password = isset($_POST['password']) ? sanitize_text_field($_POST['password']) : '';
238 $post_id = isset($_POST['post_id']) ? absint($_POST['post_id']) : 0;
239
240 $epbase64 = get_post_meta($post_id, 'ep_base_' .$client_id, false );
241 $hash_key = get_post_meta( $post_id, 'hash_key_' .$client_id, false );
242
243 // Set the decryption key and initialization vector (IV)
244 $key = self::get_hash();
245
246 // Decode the base64 encoded cipher
247 $cipher = base64_decode($epbase64);
248 // Decrypt the cipher using AES-128-CBC encryption
249
250 $wp_pass_key = hash('sha256', wp_salt(32) . md5($password));
251 $iv = substr($wp_pass_key, 0, 16);
252 if ($wp_pass_key === $hash_key) {
253 setcookie("password_correct_", $password, time() + 3600);
254
255 $embed = openssl_decrypt($cipher, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv) . '<script>
256 var now = new Date();
257 var time = now.getTime();
258 var expireTime = time + 1000 * 60 * 60 * 24 * 30;
259 now.setTime(expireTime);
260 document.cookie = "password_correct_' . esc_js($client_id) . '=' . esc_js($hash_key) . '; expires=" + now.toUTCString() + "; path=/";
261 </script>';
262 } else {
263 $embed = 0;
264 }
265
266 // Process the form data and return a response
267 $response = array(
268 'success' => true,
269 'password' => $password,
270 'embedHtml' => $embed,
271 );
272
273 wp_send_json($response);
274
275 }
276
277 public static function display_password_form($client_id='', $embedHtml='', $pass_hash_key='', $attributes = [])
278 {
279 $lock_heading = !empty($attributes['lockHeading']) ? $attributes['lockHeading'] : '';
280 $lock_subheading = !empty($attributes['lockSubHeading']) ? $attributes['lockSubHeading'] : '';
281 $lock_error_message = !empty($attributes['lockErrorMessage']) ? $attributes['lockErrorMessage'] : '';
282 $footer_message = !empty($attributes['footerMessage']) ? $attributes['footerMessage'] : '';
283 $password_placeholder = !empty($attributes['passwordPlaceholder']) ? $attributes['passwordPlaceholder'] : '';
284 $button_text = !empty($attributes['submitButtonText']) ? $attributes['submitButtonText'] : '';
285 $unlocking_text = !empty($attributes['submitUnlockingText']) ? $attributes['submitUnlockingText'] : '';
286 $enable_footer_message = !empty($attributes['enableFooterMessage']) ? $attributes['enableFooterMessage'] : '';
287
288 // Set the encryption key and initialization vector (IV)
289 $key = self::get_hash();
290
291 $salt = wp_salt(32);
292 $wp_hash_key = hash('sha256', $salt . $pass_hash_key);
293 $iv = substr($wp_hash_key, 0, 16);
294
295
296 // Encrypt the plaintext using AES-128-CBC encryption
297 $cipher = openssl_encrypt($embedHtml, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
298
299 // Base64 encode the encrypted cipher
300 $encrypted_data = base64_encode($cipher);
301
302 update_post_meta( get_the_ID( ), 'ep_base_' .$client_id, $encrypted_data );
303 update_post_meta( get_the_ID( ), 'hash_key_' .$client_id, $wp_hash_key );
304
305 $lock_icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g fill="#6354a5" class="color134563 svgShape"><path d="M46.3 28.7h-3v-6.4C43.3 16.1 38.2 11 32 11c-6.2 0-11.3 5.1-11.3 11.3v6.4h-3v-6.4C17.7 14.4 24.1 8 32 8s14.3 6.4 14.3 14.3v6.4" fill="#6354a5" class="color000000 svgShape"></path><path d="M44.8 55.9H19.2c-2.6 0-4.8-2.2-4.8-4.8V31.9c0-2.6 2.2-4.8 4.8-4.8h25.6c2.6 0 4.8 2.2 4.8 4.8v19.2c0 2.7-2.2 4.8-4.8 4.8zM19.2 30.3c-.9 0-1.6.7-1.6 1.6v19.2c0 .9.7 1.6 1.6 1.6h25.6c.9 0 1.6-.7 1.6-1.6V31.9c0-.9-.7-1.6-1.6-1.6H19.2z" fill="#6354a5" class="color000000 svgShape"></path><path d="M35.2 36.7c0 1.8-1.4 3.2-3.2 3.2s-3.2-1.4-3.2-3.2 1.4-3.2 3.2-3.2 3.2 1.5 3.2 3.2" fill="#6354a5" class="color000000 svgShape"></path><path d="M32.8 36.7h-1.6l-1.6 9.6h4.8l-1.6-9.6" fill="#6354a5" class="color000000 svgShape"></path></g></svg>';
306
307 echo '
308 <div class="password-form-container">
309 <h2>'.esc_html( $lock_heading ).'</h2>
310 <p>'.esc_html( $lock_subheading ).' </p>
311 <form class="password-form" method="post" class="password-form" data-unlocking-text="'.esc_attr( $unlocking_text ).'">
312
313 <div class="password-field">
314 <span class="lock-icon">' . $lock_icon . '</span>
315 <input type="password" name="pass_' . esc_attr($client_id) . '" placeholder="' . esc_attr($password_placeholder) . '" required>
316 </div>
317 <input type="hidden" name="ep_client_id" value="' . esc_attr($client_id) . '">
318 <input type="hidden" name="post_id" value="' . esc_attr(get_the_ID( ) ) . '">
319
320 <input type="submit" name="password_submit" value="'.esc_attr( $button_text ).'">
321 <div class="error-message hidden">'.esc_html( $lock_error_message ).'</div>
322 </form>
323 ' . ( ! empty( $enable_footer_message ) ? '<p class="need-access-message">' . esc_html( $footer_message ) . '</p>' : '' ) . '
324 </div>
325 ';
326 }
327
328 // Check if the user has already entered the correct password
329 public static function is_password_correct($client_id)
330 {
331 if (isset($_COOKIE['password_correct_' . $client_id])) {
332 return $_COOKIE['password_correct_' . $client_id];
333 } else {
334 return false;
335 }
336 }
337
338 public static function customLogo($embedHTML, $atts){
339 $x = !empty($atts['logoX']) ? $atts['logoX'] : 0;
340 $y = !empty($atts['logoY']) ? $atts['logoY'] : 0;
341 $uniqid = !empty($atts['url'])? '.ose-uid-' . md5($atts['url']): '';
342
343 $brandUrl = !empty($atts['customlogoUrl']) ? $atts['customlogoUrl'] : '';
344 $opacity = !empty($atts['logoOpacity']) ? $atts['logoOpacity'] : '';
345
346 $cssClass = !empty( $atts['url'] ) ? '.ose-uid-' . md5( $atts['url'] ) : '.ose-youtube';
347
348
349
350 ob_start(); ?>
351 <style type="text/css">
352 <?php echo esc_html($cssClass); ?>
353 {
354 position: relative;
355 }
356
357 <?php echo esc_html($cssClass); ?> .watermark {
358 border: 0;
359 position: absolute;
360 bottom: <?php echo esc_html($y); ?>%;
361 right: <?php echo esc_html($x); ?>%;
362 max-width: 150px;
363 max-height: 75px;
364 opacity: 0.25;
365 z-index: 5;
366 -o-transition: opacity 0.5s ease-in-out;
367 -moz-transition: opacity 0.5s ease-in-out;
368 -webkit-transition: opacity 0.5s ease-in-out;
369 transition: opacity 0.5s ease-in-out;
370 opacity: <?php echo esc_html($opacity); ?>;
371 }
372
373 <?php echo esc_html($cssClass); ?>
374 .watermark:hover {
375 opacity: 1;
376 }
377 </style>
378 <?php
379
380
381 $style = ob_get_clean();
382
383 if ( ! class_exists( '\simple_html_dom' ) ) {
384 include_once EMBEDPRESS_PATH_CORE . 'simple_html_dom.php';
385 }
386
387 $cta = '';
388 $img = '';
389
390 if(!empty($atts['customlogo'])){
391 $img = '<img src="'.esc_url($atts['customlogo']).'"/>';
392
393 $imgDom = str_get_html( $img );
394 $imgDom = $imgDom->find( 'img', 0 );
395 $imgDom->setAttribute( 'class', 'watermark ep-custom-logo' );
396 $imgDom->removeAttribute( 'style' );
397 $imgDom->setAttribute( 'width', 'auto' );
398 $imgDom->setAttribute( 'height', 'auto' );
399 ob_start();
400 echo $imgDom;
401
402 $cta .= ob_get_clean();
403
404 $imgDom->clear();
405 unset( $img, $imgDom );
406
407 if ( !empty($brandUrl) ) {
408 $cta = '<a href="'.esc_url($brandUrl).'" target="_blank">'.$cta.'</a>';
409 }
410 $dom = str_get_html( $embedHTML );
411
412 $wrapDiv = $dom->find( $uniqid, 0 );
413
414 if ( ! empty( $wrapDiv ) && is_object( $wrapDiv ) ) {
415 $wrapDiv->innertext .= $cta;
416 }
417
418 ob_start();
419 echo $wrapDiv;
420
421 $markup = ob_get_clean();
422
423 $dom->clear();
424 unset( $dom, $wrapDiv );
425
426 $embedHTML = $style . $markup;
427
428 }
429
430 return $embedHTML;
431
432 }
433
434
435 public static function embed_content_share($content_id='', $attributes = []){
436
437 $share_position = !empty($attributes['sharePosition']) ? $attributes['sharePosition'] : 'right';
438 $custom_thumnail = !empty($attributes['customThumbnail']) ? urlencode($attributes['customThumbnail']) : '';
439 $custom_title = !empty($attributes['customTitle']) ? urlencode($attributes['customTitle']) : '';
440 $custom_description = !empty($attributes['customDescription']) ? urlencode($attributes['customDescription']) : '';
441
442 $page_url = urlencode(get_permalink().'?hash='.$content_id);
443
444 $social_icons = '<div class="ep-social-share-wraper"><div class="ep-social-share share-position-'.esc_attr( $share_position ).'">';
445 $social_icons .= '<a href="https://www.facebook.com/sharer/sharer.php?u=' . $page_url . '" class="ep-social-icon facebook" target="_blank">
446 <svg width="64px" height="64px" fill="#000000" viewBox="0 -6 512 512" xmlns="http://www.w3.org/2000/svg">
447 <path d="M0 0h512v500H0z" fill="#475a96"/>
448 <path d="m375.72 112.55h-237.43c-8.137 0-14.73 6.594-14.73 14.73v237.43c0 8.135 6.594 14.73 14.73 14.73h127.83v-103.36h-34.781v-40.28h34.781v-29.705c0-34.473 21.055-53.244 51.807-53.244 14.73 0 27.391 1.097 31.08 1.587v36.026l-21.328 0.01c-16.725 0-19.963 7.947-19.963 19.609v25.717h39.887l-5.193 40.28h-34.693v103.36h68.012c8.135 0 14.73-6.596 14.73-14.73v-237.43c-1e-3 -8.137-6.596-14.73-14.731-14.73z" fill="#fff"/>
449 </svg>
450 </a>';
451 $social_icons .= '<a href="https://twitter.com/intent/tweet?url=' . $page_url . '&text=' . $custom_title . '" class="ep-social-icon twitter" target="_blank">
452 <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 248 204">
453 <path fill="#ffffff"
454 d="M221.95 51.29c.15 2.17.15 4.34.15 6.53 0 66.73-50.8 143.69-143.69 143.69v-.04c-27.44.04-54.31-7.82-77.41-22.64 3.99.48 8 .72 12.02.73 22.74.02 44.83-7.61 62.72-21.66-21.61-.41-40.56-14.5-47.18-35.07 7.57 1.46 15.37 1.16 22.8-.87-23.56-4.76-40.51-25.46-40.51-49.5v-.64c7.02 3.91 14.88 6.08 22.92 6.32C11.58 63.31 4.74 33.79 18.14 10.71c25.64 31.55 63.47 50.73 104.08 52.76-4.07-17.54 1.49-35.92 14.61-48.25 20.34-19.12 52.33-18.14 71.45 2.19 11.31-2.23 22.15-6.38 32.07-12.26-3.77 11.69-11.66 21.62-22.2 27.93 10.01-1.18 19.79-3.86 29-7.95-6.78 10.16-15.32 19.01-25.2 26.16z" />
455 </svg>
456 </a>';
457 $social_icons .= '<a href="http://pinterest.com/pin/create/button/?url=' . $page_url . '&media=' .$custom_thumnail . '&description=' . $custom_description . '" class="ep-social-icon pinterest" target="_blank">
458
459 <svg xmlns="http://www.w3.org/2000/svg" height="800" width="1200" viewBox="-36.42015 -60.8 315.6413 364.8"><path d="M121.5 0C54.4 0 0 54.4 0 121.5 0 173 32 217 77.2 234.7c-1.1-9.6-2-24.4.4-34.9 2.2-9.5 14.2-60.4 14.2-60.4s-3.6-7.3-3.6-18c0-16.9 9.8-29.5 22-29.5 10.4 0 15.4 7.8 15.4 17.1 0 10.4-6.6 26-10.1 40.5-2.9 12.1 6.1 22 18 22 21.6 0 38.2-22.8 38.2-55.6 0-29.1-20.9-49.4-50.8-49.4-34.6 0-54.9 25.9-54.9 52.7 0 10.4 4 21.6 9 27.7 1 1.2 1.1 2.3.8 3.5-.9 3.8-3 12.1-3.4 13.8-.5 2.2-1.8 2.7-4.1 1.6-15.2-7.1-24.7-29.2-24.7-47.1 0-38.3 27.8-73.5 80.3-73.5 42.1 0 74.9 30 74.9 70.2 0 41.9-26.4 75.6-63 75.6-12.3 0-23.9-6.4-27.8-14 0 0-6.1 23.2-7.6 28.9-2.7 10.6-10.1 23.8-15.1 31.9 11.4 3.5 23.4 5.4 36 5.4 67.1 0 121.5-54.4 121.5-121.5C243 54.4 188.6 0 121.5 0z" fill="#fff"/></svg>
460
461 </a>';
462
463 $social_icons .= '<a href="https://www.linkedin.com/sharing/share-offsite/?url='.$page_url.'&title='.$custom_title.'&summary='.$custom_description.'&source=LinkedIn" class="ep-social-icon linkedin" target="_blank">
464
465 <svg fill="#ffffff" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
466 viewBox="0 0 310 310" xml:space="preserve">
467 <g id="XMLID_801_">
468 <path id="XMLID_802_" d="M72.16,99.73H9.927c-2.762,0-5,2.239-5,5v199.928c0,2.762,2.238,5,5,5H72.16c2.762,0,5-2.238,5-5V104.73
469 C77.16,101.969,74.922,99.73,72.16,99.73z"/>
470 <path id="XMLID_803_" d="M41.066,0.341C18.422,0.341,0,18.743,0,41.362C0,63.991,18.422,82.4,41.066,82.4
471 c22.626,0,41.033-18.41,41.033-41.038C82.1,18.743,63.692,0.341,41.066,0.341z"/>
472 <path id="XMLID_804_" d="M230.454,94.761c-24.995,0-43.472,10.745-54.679,22.954V104.73c0-2.761-2.238-5-5-5h-59.599
473 c-2.762,0-5,2.239-5,5v199.928c0,2.762,2.238,5,5,5h62.097c2.762,0,5-2.238,5-5v-98.918c0-33.333,9.054-46.319,32.29-46.319
474 c25.306,0,27.317,20.818,27.317,48.034v97.204c0,2.762,2.238,5,5,5H305c2.762,0,5-2.238,5-5V194.995
475 C310,145.43,300.549,94.761,230.454,94.761z"/>
476 </g>
477 </svg>
478 </a>';
479 $social_icons .= '</div></div>';
480
481 return $social_icons ;
482 }
483
484
485
486 public static function ep_get_elementor_widget_settings($page_settings = '', $id = '', $widgetType = ''){
487
488 $data = json_decode($page_settings, true);
489
490 // Search for the element with the given ID
491 $element = null;
492 foreach ($data as $section) {
493 foreach ($section['elements'] as $column) {
494 foreach ($column['elements'] as $el) {
495 if ($el['id'] == $id && $el['elType'] == 'widget' && $el['widgetType'] == $widgetType) {
496 $element = $el;
497 break 3;
498 }
499 }
500 }
501 }
502
503 // Output the element code
504 if ($element) {
505 return $element;;
506 }
507
508 }
509
510 public static function ep_get_popup_icon() {
511 $svg = '<div class="ep-doc-popup-icon" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" xml:space="preserve"><path fill="#fff" d="M5 3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-6l-2-2v8H5V5h8l-2-2H5zm9 0 2.7 2.7-7.5 7.5 1.7 1.7 7.5-7.5L21 10V3h-7z"/><path style="fill:none" d="M0 0h24v24H0z"/></svg></div>';
512
513 return $svg;
514 }
515 public static function ep_get_download_icon() {
516 $svg = '<div class="ep-doc-download-icon" ><svg width="25" height="25" viewBox="0 0 0.6 0.6" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" fill-rule="evenodd" d="M.525.4A.025.025 0 0 1 .55.422v.053A.075.075 0 0 1 .479.55H.125A.075.075 0 0 1 .05.479V.425A.025.025 0 0 1 .1.422v.053A.025.025 0 0 0 .122.5h.353A.025.025 0 0 0 .5.478V.425A.025.025 0 0 1 .525.4ZM.3.05a.025.025 0 0 1 .025.025v.24L.357.283A.025.025 0 0 1 .39.281l.002.002a.025.025 0 0 1 .002.033L.392.318.317.393.316.394.314.395.311.397.308.398.305.399.301.4H.295L.292.399.289.398.287.397.285.395A.025.025 0 0 1 .283.393L.208.318A.025.025 0 0 1 .241.281l.002.002.032.032v-.24A.025.025 0 0 1 .3.05Z"/></svg></div>';
517
518 return $svg;
519 }
520
521 public static function ep_get_print_icon() {
522 $svg = '<div class="ep-doc-print-icon" ><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 24 24">
523 <path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z" fill="#fff"/>
524 </svg></div>';
525
526 return $svg;
527 }
528
529 public static function ep_get_fullscreen_icon() {
530 $svg = '<div class="ep-doc-fullscreen-icon"><svg width="25" height="25" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
531 <path d="m3 15 .117.007a1 1 0 0 1 .876.876L4 16v4h4l.117.007a1 1 0 0 1 0 1.986L8 22H3l-.117-.007a1 1 0 0 1-.876-.876L2 21v-5l.007-.117a1 1 0 0 1 .876-.876L3 15Zm18 0a1 1 0 0 1 .993.883L22 16v5a1 1 0 0 1-.883.993L21 22h-5a1 1 0 0 1-.117-1.993L16 20h4v-4a1 1 0 0 1 .883-.993L21 15ZM8 2a1 1 0 0 1 .117 1.993L8 4H4v4a1 1 0 0 1-.883.993L3 9a1 1 0 0 1-.993-.883L2 8V3a1 1 0 0 1 .883-.993L3 2h5Zm13 0 .117.007a1 1 0 0 1 .876.876L22 3v5l-.007.117a1 1 0 0 1-.876.876L21 9l-.117-.007a1 1 0 0 1-.876-.876L20 8V4h-4l-.117-.007a1 1 0 0 1 0-1.986L16 2h5Z" fill="#fff"/>
532 </svg></div>';
533
534 return $svg;
535 }
536 public static function ep_get_minimize_icon() {
537 $svg = '<div class="ep-doc-minimize-icon" style="display:none"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" style="enable-background:new 0 0 385.331 385.331" xml:space="preserve" width="20" height="20"><path fill="#fff" d="M13.751 8.131h5.62c0.355 0 0.619 -0.28 0.619 -0.634 0 -0.355 -0.265 -0.615 -0.619 -0.614h-4.995V1.878c0 -0.355 -0.27 -0.624 -0.624 -0.624s-0.624 0.27 -0.624 0.624v5.62c0 0.002 0.001 0.003 0.001 0.004 0 0.002 -0.001 0.003 -0.001 0.005 0 0.348 0.276 0.625 0.624 0.624zM6.244 1.259c-0.354 0 -0.614 0.265 -0.614 0.619v4.995H0.624c-0.355 0 -0.624 0.27 -0.624 0.624 0 0.355 0.27 0.624 0.624 0.624h5.62c0.002 0 0.003 -0.001 0.004 -0.001 0.002 0 0.003 0.001 0.005 0.001 0.348 0 0.624 -0.276 0.624 -0.624V1.878c0 -0.354 -0.28 -0.619 -0.634 -0.619zm0.005 10.61H0.629c-0.355 0.001 -0.619 0.28 -0.619 0.634 0 0.355 0.265 0.615 0.619 0.614h4.995v5.005c0 0.355 0.27 0.624 0.624 0.624 0.355 0 0.624 -0.27 0.624 -0.624V12.502c0 -0.002 -0.001 -0.003 -0.001 -0.004 0 -0.002 0.001 -0.003 0.001 -0.005 0 -0.348 -0.276 -0.624 -0.624 -0.624zm13.127 0H13.756c-0.002 0 -0.003 0.001 -0.004 0.001 -0.002 0 -0.003 -0.001 -0.005 -0.001 -0.348 0 -0.624 0.276 -0.624 0.624v5.62c0 0.355 0.28 0.619 0.634 0.619 0.354 0.001 0.614 -0.265 0.614 -0.619v-4.995H19.376c0.355 0 0.624 -0.27 0.624 -0.624s-0.27 -0.624 -0.624 -0.625z"/><g/><g/><g/><g/><g/><g/></svg></div>';
538
539 return $svg;
540 }
541 public static function ep_get_draw_icon() {
542 $svg = '<div class="ep-doc-draw-icon"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m15 7.5 2.5 2.5m-10 10L19.25 8.25c0.69 -0.69 0.69 -1.81 0 -2.5v0c-0.69 -0.69 -1.81 -0.69 -2.5 0L5 17.5V20h2.5Zm0 0h8.379C17.05 20 18 19.05 18 17.879v0c0 -0.563 -0.224 -1.103 -0.621 -1.5L17 16M4.5 5c2 -2 5.5 -1 5.5 1 0 2.5 -6 2.5 -6 5 0 0.876 0.533 1.526 1.226 2" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>';
543
544 return $svg;
545 }
546
547 public static function get_google_presentation_url($embedded_url){
548 $parsed_url = parse_url($embedded_url);
549 $base_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
550 $base_url = strtok($base_url, '?');
551 $base_url = rtrim($base_url, '/');
552 return $base_url;
553
554 }
555
556 public static function check_media_format($url) {
557 $pattern1 = '/\.(mp4|mov|avi|wmv|flv|mkv|webm|mpeg|mpg)$/i';
558 $pattern2 = '/\.(mp3|wav|ogg|aac)$/i';
559
560 $isVideo = preg_match($pattern1, $url);
561 $isAudio = preg_match($pattern2, $url);
562
563 $is_self_hosted = false;
564 $format = '';
565
566 if (!empty($isVideo) || !empty($isAudio)) {
567 $is_self_hosted = true;
568 if (!empty($isVideo)) {
569 $format = 'video';
570 } else if (!empty($isAudio)) {
571 $format = 'audio';
572 }
573 }
574
575 if (!$is_self_hosted) {
576 return [
577 'selhosted' => false,
578 ];
579 }
580
581 return [
582 'selhosted' => true,
583 'format' => $format,
584 ];
585 }
586
587 public static function getCalendlyUuid($url){
588 $pattern = '/\/([0-9a-fA-F-]+)$/';
589 if (preg_match($pattern, $url, $matches)) {
590 $uuid = $matches[1];
591 return $uuid;
592 }
593 return '';
594 }
595
596 public static function getCalendlyUserInfo($access_token)
597 {
598 // Attempt to retrieve the data from the transient
599 $user_info = get_transient('calendly_user_info_' . md5($access_token));
600
601 if (false === $user_info) {
602 // If the data is not in the transient, fetch it from the API
603 $user_endpoint = 'https://api.calendly.com/users/me';
604
605 $headers = array(
606 'Authorization' => "Bearer $access_token",
607 'Content-Type' => 'application/json',
608 );
609
610 $args = array(
611 'headers' => $headers,
612 );
613
614 $response = wp_remote_get($user_endpoint, $args);
615
616 if (!is_wp_error($response)) {
617 $body = wp_remote_retrieve_body($response);
618 $data = json_decode($body, true);
619
620 // Store the data in a transient for a specified time (e.g., 1 hour)
621 set_transient('calendly_user_info', $data, HOUR_IN_SECONDS);
622
623 return $data;
624 }
625 }
626
627 return $user_info;
628 }
629
630 public static function getCalaendlyEventTypes($user_uri, $access_token)
631 {
632 // Attempt to retrieve the data from the transient
633 $events_list = get_transient('calendly_events_list_' . md5($access_token));
634
635 if (false === $events_list) {
636 // If the data is not in the transient, fetch it from the API
637 $events_endpoint = "https://api.calendly.com/event_types?user=$user_uri";
638
639 $headers = array(
640 'Authorization' => "Bearer $access_token",
641 'Content-Type' => 'application/json',
642 );
643
644 $args = array(
645 'headers' => $headers,
646 );
647
648 $response = wp_remote_get($events_endpoint, $args);
649
650 if (!is_wp_error($response)) {
651 $body = wp_remote_retrieve_body($response);
652 $events_list = json_decode($body, true);
653
654 // Store the data in a transient for a specified time (e.g., 1 hour)
655 set_transient('calendly_events_list', $events_list, HOUR_IN_SECONDS);
656
657 return $events_list;
658 }
659 }
660
661 return $events_list;
662 }
663
664 public static function getListEventInvitee($uuid, $access_token)
665 {
666 // Attempt to retrieve the data from the transient
667 $invitee_list = get_transient('calendly_invitee_list_' . md5($access_token));
668
669 if (false === $invitee_list) {
670 // If the data is not in the transient, fetch it from the API
671 $events_endpoint = "https://api.calendly.com/scheduled_events/$uuid/invitees";
672
673 $headers = array(
674 'Authorization' => "Bearer $access_token",
675 'Content-Type' => 'application/json',
676 );
677
678 $args = array(
679 'headers' => $headers,
680 );
681
682 $response = wp_remote_get($events_endpoint, $args);
683
684 if (!is_wp_error($response)) {
685 $body = wp_remote_retrieve_body($response);
686 $invitee_list = json_decode($body, true);
687
688 // Store the data in a transient for a specified time (e.g., 1 hour)
689 set_transient('calendly_invitee_list', $invitee_list, HOUR_IN_SECONDS);
690
691 return $invitee_list;
692 }
693 }
694
695 return $invitee_list;
696 }
697
698 public static function getCalaendlyScheduledEvents($user_uri, $access_token)
699 {
700 // Attempt to retrieve the data from the transient
701 $events_list = get_transient('calendly_events_list_' . md5($access_token));
702
703 if (false === $events_list) {
704 // If the data is not in the transient, fetch it from the API
705 $events_endpoint = "https://api.calendly.com/scheduled_events?user=$user_uri";
706
707 $headers = array(
708 'Authorization' => "Bearer $access_token",
709 'Content-Type' => 'application/json',
710 );
711
712 $args = array(
713 'headers' => $headers,
714 );
715
716 $response = wp_remote_get($events_endpoint, $args);
717
718 if (!is_wp_error($response)) {
719 $body = wp_remote_retrieve_body($response);
720 $events_list = json_decode($body, true);
721
722 // Store the data in a transient for a specified time (e.g., 1 hour)
723 set_transient('calendly_events_list', $events_list, HOUR_IN_SECONDS);
724
725 return $events_list;
726 }
727 }
728
729 return $events_list;
730 }
731
732
733 }
734
735 ?>
736