PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, 3D PDF FlipBook, Google Reviews, YouTube Videos, Upload & Embed PDF documents / 4.0.5
EmbedPress – PDF Embedder, 3D PDF FlipBook, Google Reviews, YouTube Videos, Upload & Embed PDF documents v4.0.5
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 2 years ago EmbedPress_Core_Installer.php 6 years ago EmbedPress_Notice.php 2 years ago EmbedPress_Plugin_Usage_Tracker.php 2 years ago Extend_CustomPlayer_Controls.php 3 years ago Extend_Elementor_Controls.php 2 years ago Feature_Enhancer.php 2 years ago Helper.php 2 years ago
Helper.php
1312 lines
1 <?php
2
3 namespace EmbedPress\Includes\Classes;
4
5 use EmbedPress\Shortcode;
6
7 if (!defined('ABSPATH')) {
8 exit;
9 } // Exit if accessed directly
10
11 class Helper
12 {
13
14 /**
15 * Parse a query string into an associative array.
16 *
17 * If multiple values are found for the same key, the value of that key
18 * value pair will become an array. This function does not parse nested
19 * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will
20 * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).
21 *
22 * @param string $str Query string to parse
23 * @param int|bool $urlEncoding How the query string is encoded
24 *
25 * @return array
26 */
27
28 public function __construct()
29 {
30 add_action('wp_ajax_lock_content_form_handler', [$this, 'lock_content_form_handler']);
31 add_action('wp_ajax_nopriv_lock_content_form_handler', [$this, 'lock_content_form_handler']);
32
33
34 add_action('wp_ajax_loadmore_data_handler', [$this, 'loadmore_data_handler']);
35 add_action('wp_ajax_nopriv_loadmore_data_handler', [$this, 'loadmore_data_handler']);
36 }
37
38 public static function parse_query($str, $urlEncoding = true)
39 {
40 $result = [];
41
42 if ($str === '') {
43 return $result;
44 }
45
46 if ($urlEncoding === true) {
47 $decoder = function ($value) {
48 return rawurldecode(str_replace('+', ' ', $value));
49 };
50 } elseif ($urlEncoding === PHP_QUERY_RFC3986) {
51 $decoder = 'rawurldecode';
52 } elseif ($urlEncoding === PHP_QUERY_RFC1738) {
53 $decoder = 'urldecode';
54 } else {
55 $decoder = function ($str) {
56 return $str;
57 };
58 }
59
60 foreach (explode('&', $str) as $kvp) {
61 $parts = explode('=', $kvp, 2);
62 $key = $decoder($parts[0]);
63 $value = isset($parts[1]) ? $decoder($parts[1]) : null;
64 if (!isset($result[$key])) {
65 $result[$key] = $value;
66 } else {
67 if (!is_array($result[$key])) {
68 $result[$key] = [$result[$key]];
69 }
70 $result[$key][] = $value;
71 }
72 }
73
74 return $result;
75 }
76 public static function get_pdf_renderer()
77 {
78 // $renderer = EMBEDPRESS_URL_ASSETS . 'pdf/web/viewer.html';
79
80 $renderer = admin_url('admin-ajax.php?action=get_viewer');
81
82 // @TODO; apply settings query args here
83 return $renderer;
84 }
85
86 public static function get_extension_from_file_url($url)
87 {
88 $urlSplit = explode(".", $url);
89 $ext = end($urlSplit);
90 return $ext;
91 }
92
93 public static function is_file_url($url)
94 {
95 $pattern = '/\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/i';
96 return preg_match($pattern, $url) === 1;
97 }
98
99 public static function is_opensea($url)
100 {
101 return strpos($url, "opensea.io") !== false;
102 }
103 public static function is_youtube_channel($url)
104 {
105 return (bool) (preg_match('~(?:https?:\/\/)?(?:www\.)?(?:youtube.com\/)(?:channel\/|c\/|user\/|@)(\w+)~i', (string) $url));
106 }
107
108 public static function is_youtube($url)
109 {
110 return (bool) (preg_match('~(?:https?://)?(?:www\.)?(?:youtube\.com|youtu\.be)/watch\?v=([^&]+)~i', (string) $url));
111 }
112
113 // Saved sources data temporary in wp_options table
114 public static function get_source_data($blockid, $source_url, $source_option_name, $source_temp_option_name)
115 {
116
117
118 if (self::is_youtube_channel($source_url)) {
119 $source_name = 'YoutubeChannel';
120 } else if (self::is_youtube($source_url)) {
121 $source_name = 'Youtube';
122 } else if (!empty(self::is_file_url($source_url))) {
123 $source_name = 'document_' . self::get_extension_from_file_url($source_url);
124 } else if (self::is_opensea($source_url)) {
125 $source_name = 'OpenSea';
126 } else {
127 Shortcode::get_embera_instance();
128 $collectios = Shortcode::get_collection();
129 $provider = $collectios->findProviders($source_url);
130
131 if (!empty($provider[$source_url])) {
132 $source_name = $provider[$source_url]->getProviderName();
133 } else {
134 $host = parse_url($source_url, PHP_URL_HOST);
135 if ($host) {
136 $parts = explode('.', $host);
137 if (count($parts) > 1) {
138 $source_name = $parts[1];
139 } else {
140 // Handle the case where the host doesn't have at least two parts
141 $source_name = $host;
142 }
143 } else {
144 // Handle the case where parse_url fails
145 $source_name = 'unknown';
146 }
147 }
148 }
149
150 if (!empty($blockid) && $blockid != 'undefined') {
151 $sources = json_decode(get_option($source_temp_option_name), true);
152
153 if (!$sources) {
154 $sources = array();
155 }
156 $exists = false;
157
158 foreach ($sources as $i => $source) {
159 if ($source['id'] === $blockid) {
160 $sources[$i]['source']['name'] = $source_name;
161 $sources[$i]['source']['url'] = $source_url;
162 $exists = true;
163 break;
164 }
165 }
166
167 if (!$exists) {
168 $sources[] = array('id' => $blockid, 'source' => array('name' => $source_name, 'url' => $source_url, 'count' => 1));
169 }
170
171 update_option($source_temp_option_name, json_encode($sources));
172 }
173 }
174
175 // Saved source data when post updated
176 public static function get_save_source_data_on_post_update($source_option_name, $source_temp_option_name)
177 {
178
179 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
180 return;
181 }
182 $temp_data = json_decode(get_option($source_temp_option_name), true);
183 $source_data = json_decode(get_option($source_option_name), true);
184 if (!$temp_data) {
185 $temp_data = array();
186 }
187 if (!$source_data) {
188 $source_data = array();
189 }
190
191 $sources = array_merge($temp_data, $source_data);
192
193 $unique_sources = array();
194 foreach ($sources as $source) {
195 $unique_sources[$source['id']] = $source;
196 }
197
198 $unique_sources = array_values($unique_sources);
199
200 delete_option($source_temp_option_name);
201
202 update_option($source_option_name, json_encode($unique_sources));
203 }
204
205 //Delete source data from option table when widget is removed
206 public static function get_delete_source_data($blockid, $source_option_name, $source_temp_option_name)
207 {
208 if (!empty($blockid) && $blockid != 'undefined') {
209 $sources = json_decode(get_option($source_option_name), true);
210 $temp_sources = json_decode(get_option($source_temp_option_name), true);
211 if ($sources) {
212 foreach ($sources as $i => $source) {
213 if ($source['id'] === $blockid) {
214 unset($sources[$i]);
215 break;
216 }
217 }
218 update_option($source_option_name, json_encode(array_values($sources)));
219 }
220 if ($temp_sources) {
221 foreach ($temp_sources as $i => $source) {
222 if ($source['id'] === $blockid) {
223 unset($temp_sources[$i]);
224 break;
225 }
226 }
227 update_option($source_temp_option_name, json_encode(array_values($temp_sources)));
228 }
229 }
230 wp_die();
231 }
232
233 //Delete source temporary data when reload without update or publish
234 public static function get_delete_source_temp_data_on_reload($source_temp_option_name)
235 {
236 $source_temp_data = json_decode(get_option($source_temp_option_name), true);
237 if ($source_temp_data) {
238 delete_option($source_temp_option_name);
239 }
240 }
241
242 public static function get_file_title($url)
243 {
244 return get_the_title(attachment_url_to_postid($url));
245 }
246
247 public static function get_hash()
248 {
249 $hash_key = get_option(EMBEDPRESS_PLG_NAME . '_hash_key');
250 if (!$hash_key) {
251 $hash_key = wp_hash_password(wp_generate_password(30));
252 update_option(EMBEDPRESS_PLG_NAME . '_hash_key', $hash_key);
253 }
254 return $hash_key;
255 }
256
257 public function lock_content_form_handler()
258 {
259
260 $client_id = isset($_POST['client_id']) ? sanitize_text_field($_POST['client_id']) : '';
261 $password = isset($_POST['password']) ? sanitize_text_field($_POST['password']) : '';
262 $post_id = isset($_POST['post_id']) ? absint($_POST['post_id']) : 0;
263
264 $epbase64 = get_post_meta($post_id, 'ep_base_' . $client_id, false);
265 $hash_key = get_post_meta($post_id, 'hash_key_' . $client_id, false);
266
267 // Set the decryption key and initialization vector (IV)
268 $key = self::get_hash();
269
270 // Decode the base64 encoded cipher
271 $cipher = base64_decode($epbase64);
272 // Decrypt the cipher using AES-128-CBC encryption
273
274 $wp_pass_key = hash('sha256', wp_salt(32) . md5($password));
275 $iv = substr($wp_pass_key, 0, 16);
276 if ($wp_pass_key === $hash_key) {
277 setcookie("password_correct_", $password, time() + 3600);
278
279 $embed = openssl_decrypt($cipher, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv) . '<script>
280 const now = new Date();
281 const time = now.getTime();
282 const expireTime = time + 1000 * 60 * 60 * 24 * 30;
283 now.setTime(expireTime);
284 document.cookie = "password_correct_' . esc_js($client_id) . '=' . esc_js($hash_key) . '; expires=" + now.toUTCString() + "; path=/";
285 </script>';
286 } else {
287 $embed = 0;
288 }
289
290 // Process the form data and return a response
291 $response = array(
292 'success' => true,
293 'password' => $password,
294 'embedHtml' => $embed,
295 );
296
297 wp_send_json($response);
298 }
299
300 public static function display_password_form($client_id = '', $embedHtml = '', $pass_hash_key = '', $attributes = [])
301 {
302 $lock_heading = !empty($attributes['lockHeading']) ? sanitize_text_field($attributes['lockHeading']) : '';
303 $lock_subheading = !empty($attributes['lockSubHeading']) ? sanitize_text_field($attributes['lockSubHeading']) : '';
304 $lock_error_message = !empty($attributes['lockErrorMessage']) ? sanitize_text_field($attributes['lockErrorMessage']) : '';
305 $footer_message = !empty($attributes['footerMessage']) ? sanitize_text_field($attributes['footerMessage']) : '';
306 $password_placeholder = !empty($attributes['passwordPlaceholder']) ? sanitize_text_field($attributes['passwordPlaceholder']) : '';
307 $button_text = !empty($attributes['submitButtonText']) ? sanitize_text_field($attributes['submitButtonText']) : '';
308 $unlocking_text = !empty($attributes['submitUnlockingText']) ? sanitize_text_field($attributes['submitUnlockingText']) : '';
309 $enable_footer_message = !empty($attributes['enableFooterMessage']) ? sanitize_text_field($attributes['enableFooterMessage']) : '';
310
311
312 // Set the encryption key and initialization vector (IV)
313 $key = self::get_hash();
314
315 $salt = wp_salt(32);
316 $wp_hash_key = hash('sha256', $salt . $pass_hash_key);
317 $iv = substr($wp_hash_key, 0, 16);
318
319
320 // Encrypt the plaintext using AES-128-CBC encryption
321 $cipher = openssl_encrypt($embedHtml, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
322
323 // Base64 encode the encrypted cipher
324 $encrypted_data = base64_encode($cipher);
325
326 update_post_meta(get_the_ID(), 'ep_base_' . $client_id, $encrypted_data);
327 update_post_meta(get_the_ID(), 'hash_key_' . $client_id, $wp_hash_key);
328
329 $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>';
330
331 echo '
332 <div class="password-form-container">
333 <h2>' . esc_html($lock_heading) . '</h2>
334 <p>' . esc_html($lock_subheading) . ' </p>
335 <form class="password-form" method="post" class="password-form" data-unlocking-text="' . esc_attr($unlocking_text) . '">
336
337 <div class="password-field">
338 <span class="lock-icon">' . $lock_icon . '</span>
339 <input type="password" name="pass_' . esc_attr($client_id) . '" placeholder="' . esc_attr($password_placeholder) . '" required>
340 </div>
341 <input type="hidden" name="ep_client_id" value="' . esc_attr($client_id) . '">
342 <input type="hidden" name="post_id" value="' . esc_attr(get_the_ID()) . '">
343
344 <input type="submit" name="password_submit" value="' . esc_attr($button_text) . '">
345 <div class="error-message hidden">' . esc_html($lock_error_message) . '</div>
346 </form>
347 ' . (!empty($enable_footer_message) ? '<p class="need-access-message">' . esc_html($footer_message) . '</p>' : '') . '
348 </div>
349 ';
350 }
351
352 // Check if the user has already entered the correct password
353 public static function is_password_correct($client_id)
354 {
355 if (isset($_COOKIE['password_correct_' . $client_id])) {
356 return $_COOKIE['password_correct_' . $client_id];
357 } else {
358 return false;
359 }
360 }
361
362 public static function customLogo($embedHTML, $atts)
363 {
364 $x = !empty($atts['logoX']) ? $atts['logoX'] : 0;
365 $y = !empty($atts['logoY']) ? $atts['logoY'] : 0;
366 $uniqid = !empty($atts['url']) ? '.ose-uid-' . md5($atts['url']) : '';
367
368 $brandUrl = !empty($atts['customlogoUrl']) ? $atts['customlogoUrl'] : '';
369 $opacity = !empty($atts['logoOpacity']) ? $atts['logoOpacity'] : '';
370
371 $cssClass = !empty($atts['url']) ? '.ose-uid-' . md5($atts['url']) : '.ose-youtube';
372
373
374
375 ob_start(); ?>
376 <style type="text/css">
377 <?php echo esc_html($cssClass); ?> {
378 position: relative;
379 }
380
381 <?php echo esc_html($cssClass); ?>.watermark {
382 border: 0;
383 position: absolute;
384 bottom: <?php echo esc_html($y); ?>%;
385 right: <?php echo esc_html($x); ?>%;
386 max-width: 150px;
387 max-height: 75px;
388 opacity: 0.25;
389 z-index: 5;
390 -o-transition: opacity 0.5s ease-in-out;
391 -moz-transition: opacity 0.5s ease-in-out;
392 -webkit-transition: opacity 0.5s ease-in-out;
393 transition: opacity 0.5s ease-in-out;
394 opacity: <?php echo esc_html($opacity); ?>;
395 }
396
397 <?php echo esc_html($cssClass); ?>.watermark:hover {
398 opacity: 1;
399 }
400 </style>
401 <?php
402
403
404 $style = ob_get_clean();
405
406 if (!class_exists('\simple_html_dom')) {
407 include_once EMBEDPRESS_PATH_CORE . 'simple_html_dom.php';
408 }
409
410 $cta = '';
411 $img = '';
412
413 if (!empty($atts['customlogo'])) {
414 $img = '<img src="' . esc_url($atts['customlogo']) . '"/>';
415
416 $imgDom = str_get_html($img);
417 $imgDom = $imgDom->find('img', 0);
418 $imgDom->setAttribute('class', 'watermark ep-custom-logo');
419 $imgDom->removeAttribute('style');
420 $imgDom->setAttribute('width', 'auto');
421 $imgDom->setAttribute('height', 'auto');
422 ob_start();
423 echo $imgDom;
424
425 $cta .= ob_get_clean();
426
427 $imgDom->clear();
428 unset($img, $imgDom);
429
430 if (!empty($brandUrl)) {
431 $cta = '<a href="' . esc_url($brandUrl) . '" target="_blank">' . $cta . '</a>';
432 }
433 $dom = str_get_html($embedHTML);
434
435 $wrapDiv = $dom->find($uniqid, 0);
436
437 if (!empty($wrapDiv) && is_object($wrapDiv)) {
438 $wrapDiv->innertext .= $cta;
439 }
440
441 ob_start();
442 echo $wrapDiv;
443
444 $markup = ob_get_clean();
445
446 $dom->clear();
447 unset($dom, $wrapDiv);
448
449 $embedHTML = $style . $markup;
450 }
451
452 return $embedHTML;
453 }
454
455
456 public static function embed_content_share($content_id = '', $attributes = [])
457 {
458
459 $share_position = !empty($attributes['sharePosition']) ? $attributes['sharePosition'] : 'right';
460 $custom_thumnail = !empty($attributes['customThumbnail']) ? urlencode($attributes['customThumbnail']) : '';
461 $custom_title = !empty($attributes['customTitle']) ? urlencode($attributes['customTitle']) : '';
462 $custom_description = !empty($attributes['customDescription']) ? urlencode($attributes['customDescription']) : '';
463
464 $page_url = urlencode(get_permalink() . '?hash=' . $content_id);
465
466 $social_icons = '<div class="ep-social-share-wraper"><div class="ep-social-share share-position-' . esc_attr($share_position) . '">';
467 $social_icons .= '<a href="https://www.facebook.com/sharer/sharer.php?u=' . $page_url . '" class="ep-social-icon facebook" target="_blank">
468 <svg width="64px" height="64px" fill="#000000" viewBox="0 -6 512 512" xmlns="http://www.w3.org/2000/svg">
469 <path d="M0 0h512v500H0z" fill="#475a96"/>
470 <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"/>
471 </svg>
472 </a>';
473 $social_icons .= '<a href="https://twitter.com/intent/tweet?url=' . $page_url . '&text=' . $custom_title . '" class="ep-social-icon twitter" target="_blank">
474 <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 248 204">
475 <path fill="#ffffff"
476 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" />
477 </svg>
478 </a>';
479 $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">
480
481 <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>
482
483 </a>';
484
485 $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">
486
487 <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"
488 viewBox="0 0 310 310" xml:space="preserve">
489 <g id="XMLID_801_">
490 <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
491 C77.16,101.969,74.922,99.73,72.16,99.73z"/>
492 <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
493 c22.626,0,41.033-18.41,41.033-41.038C82.1,18.743,63.692,0.341,41.066,0.341z"/>
494 <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
495 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
496 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
497 C310,145.43,300.549,94.761,230.454,94.761z"/>
498 </g>
499 </svg>
500 </a>';
501 $social_icons .= '</div></div>';
502
503 return $social_icons;
504 }
505
506 public static function ep_get_elementor_widget_settings($page_settings = '', $id = '', $widgetType = '')
507 {
508
509 $data = json_decode($page_settings, true);
510
511 // Search for the element with the given ID
512 $element = null;
513 foreach ($data as $section) {
514 foreach ($section['elements'] as $column) {
515 foreach ($column['elements'] as $el) {
516 if ($el['id'] == $id && $el['elType'] == 'widget' && $el['widgetType'] == $widgetType) {
517 $element = $el;
518 break 3;
519 }
520 }
521 }
522 }
523
524 // Output the element code
525 if ($element) {
526 return $element;;
527 }
528 }
529
530 public static function ep_get_popup_icon()
531 {
532 $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>';
533
534 return $svg;
535 }
536 public static function ep_get_download_icon()
537 {
538 $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>';
539
540 return $svg;
541 }
542
543 public static function ep_get_print_icon()
544 {
545 $svg = '<div class="ep-doc-print-icon" ><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 24 24">
546 <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"/>
547 </svg></div>';
548
549 return $svg;
550 }
551
552 public static function ep_get_fullscreen_icon()
553 {
554 $svg = '<div class="ep-doc-fullscreen-icon"><svg width="25" height="25" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
555 <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"/>
556 </svg></div>';
557
558 return $svg;
559 }
560 public static function ep_get_minimize_icon()
561 {
562 $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>';
563
564 return $svg;
565 }
566 public static function ep_get_draw_icon()
567 {
568 $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>';
569
570 return $svg;
571 }
572
573 public static function get_insta_video_icon()
574 {
575 $svg = '<svg class="insta-video-icon" aria-label="Clip" class="x1lliihq x1n2onr6" color="#FFF" fill="#FFF" height="20" viewBox="1.111 1.111 24.444 24.447" width="20">
576 <path d="m14.248 1.111 3.304 5.558h-6.2L8.408 1.146c.229-.014.466-.024.713-.03l.379-.005Zm2.586 0h.331c3.4 0 4.964.838 6.267 2.097a6.674 6.674 0 0 1 1.773 3.133l.078.328H20.14l-3.307-5.558ZM6.093 1.53l2.74 5.139H1.382a6.678 6.678 0 0 1 4.38-5.033ZM16.91 15.79l-5.05-2.916a1.01 1.01 0 0 0-1.507.742l-.009.133v5.831a1.011 1.011 0 0 0 1.394.933l.121-.059 5.05-2.916a1.01 1.01 0 0 0 .111-1.674l-.111-.076-5.05-2.916ZM1.132 8.891h24.404l.017.4.003.21v7.666c0 3.401-.839 4.966-2.098 6.267-1.279 1.238-2.778 2.062-5.922 2.121l-.371.003H9.501c-3.4 0-4.963-.839-6.267-2.099-1.238-1.278-2.06-2.776-2.12-5.922l-.003-.37V9.501l.003-.21Z" fill-rule="evenodd" /></svg>';
577
578 return $svg;
579 }
580
581 public static function get_insta_image_carousel_icon()
582 {
583 $svg = '<svg aria-label="Carousel" class="x1lliihq x1n2onr6" color="#FFF" fill="#FFF" height="25" viewBox="0 0 43.636 43.636" width="25">
584 <path d="M31.636 27V10a4.695 4.695 0 0 0-4.727-4.727H10A4.695 4.695 0 0 0 5.273 10v17A4.695 4.695 0 0 0 10 31.727h17c2.545-.091 4.636-2.182 4.636-4.727zm4-13.364v14.636c0 4.091-3.364 7.455-7.455 7.455H13.545c-.545 0-.818.636-.455 1 .909 1 2.182 1.636 3.727 1.636h12.182a9.35 9.35 0 0 0 9.364-9.364V16.818a5.076 5.076 0 0 0-1.636-3.727c-.455-.364-1.091 0-1.091.545z" /></svg>';
585
586 return $svg;
587 }
588
589 public static function get_insta_image_icon()
590 {
591 $svg = '<svg width="22" height="22" viewBox="0 0 0.6 0.6" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M.175.05A.125.125 0 0 0 .05.175v.25A.125.125 0 0 0 .175.55h.25A.125.125 0 0 0 .55.425v-.25A.125.125 0 0 0 .425.05h-.25ZM.2.225a.025.025 0 1 1 .05 0 .025.025 0 0 1-.05 0ZM.225.15a.075.075 0 1 0 0 .15.075.075 0 0 0 0-.15Zm.138.205A.025.025 0 0 1 .398.351l.048.042A.025.025 0 1 0 .479.355L.43.312a.075.075 0 0 0-.107.011l-.04.05a.024.024 0 0 1-.032.005.074.074 0 0 0-.099.015L.118.432a.025.025 0 0 0 .038.033l.035-.04A.024.024 0 0 1 .223.42.074.074 0 0 0 .322.405l.04-.05Z" fill="#fff"/></svg>';
592
593 return $svg;
594 }
595
596 public static function get_insta_like_icon()
597 {
598 $svg = '<svg version="1.1" id="Uploaded to svgrepo.com" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 0.8 0.8" xml:space="preserve"><path d="M.225.25C.225.264.214.275.2.275S.175.264.175.25.186.225.2.225.225.236.225.25zM.75.3C.75.453.589.582.485.65a1.06 1.06 0 0 1-.073.044.025.025 0 0 1-.024 0A1.049 1.049 0 0 1 .315.65C.211.582.05.453.05.3a.2.2 0 0 1 .2-.2.199.199 0 0 1 .15.068A.199.199 0 0 1 .55.1a.2.2 0 0 1 .2.2zM.25.25a.05.05 0 1 0-.1 0 .05.05 0 0 0 .1 0z" style="fill:#fff"/></svg>';
599
600 return $svg;
601 }
602 public static function get_insta_comment_icon()
603 {
604 $svg = '<svg fill="#fff" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 2.5 2.5" xml:space="preserve"><path d="M2.374.446a.063.063 0 0 0-.061-.057H.991a.063.063 0 0 0-.063.057H.927v.328h.559c.029 0 .053.022.056.051h.001v.731h.275l.162.162a.063.063 0 0 0 .116-.035v-.127h.217a.063.063 0 0 0 .06-.051h.002V.446h-.001z"/><path d="M1.361.899H.18A.056.056 0 0 0 .125.95v.946h.001a.057.057 0 0 0 .054.045h.194v.113a.057.057 0 0 0 .104.032l.145-.145h.738c.027 0 .05-.02.056-.045h.001V.95h-.001a.056.056 0 0 0-.056-.051z"/></svg>';
605
606 return $svg;
607 }
608 public static function get_instagram_icon()
609 {
610 $svg = '<svg version="1.1" id="Icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" xml:space="preserve" width="1285" height="400"><style>.st0{fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}</style><path class="st0" d="M14.375 19.375h-8.75c-2.75 0-5-2.25-5-5v-8.75c0-2.75 2.25-5 5-5h8.75c2.75 0 5 2.25 5 5v8.75c0 2.75-2.25 5-5 5z"/><path class="st0" d="M14.375 10A4.375 4.375 0 0 1 10 14.375 4.375 4.375 0 0 1 5.625 10a4.375 4.375 0 0 1 8.75 0zm1.25-5.625A.625.625 0 0 1 15 5a.625.625 0 0 1-.625-.625.625.625 0 0 1 1.25 0z"/></svg>';
611
612 return $svg;
613 }
614
615 public static function get_google_presentation_url($embedded_url)
616 {
617 $parsed_url = parse_url($embedded_url);
618 $base_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
619 $base_url = strtok($base_url, '?');
620 $base_url = rtrim($base_url, '/');
621 return $base_url;
622 }
623
624 public static function check_media_format($url)
625 {
626 $pattern1 = '/\.(mp4|mov|avi|wmv|flv|mkv|webm|mpeg|mpg)$/i';
627 $pattern2 = '/\.(mp3|wav|ogg|aac)$/i';
628
629 $isVideo = preg_match($pattern1, $url);
630 $isAudio = preg_match($pattern2, $url);
631
632 $is_self_hosted = false;
633 $format = '';
634
635 if (!empty($isVideo) || !empty($isAudio)) {
636 $is_self_hosted = true;
637 if (!empty($isVideo)) {
638 $format = 'video';
639 } else if (!empty($isAudio)) {
640 $format = 'audio';
641 }
642 }
643
644 if (!$is_self_hosted) {
645 return [
646 'selhosted' => false,
647 ];
648 }
649
650 return [
651 'selhosted' => true,
652 'format' => $format,
653 ];
654 }
655
656 // Ajax Methods get instagram feed data
657 public function loadmore_data_handler()
658 {
659 $connected_account_type = isset($_POST['connected_account_type']) ? sanitize_text_field($_POST['connected_account_type']) : 'personal';
660 $hashtag_id = isset($_POST['hashtag_id']) ? sanitize_text_field($_POST['hashtag_id']) : '';
661 $feed_type = isset($_POST['feed_type']) ? sanitize_text_field($_POST['feed_type']) : 'user_aacount_type';
662 $user_id = isset($_POST['user_id']) ? sanitize_text_field($_POST['user_id']) : '';
663 $loadmore_key = isset($_POST['loadmore_key']) ? sanitize_text_field($_POST['loadmore_key']) : '';
664 $nonce = isset($_POST['_nonce']) ? sanitize_text_field($_POST['_nonce']) : '';
665 $params = isset($_POST['params']) ? sanitize_text_field($_POST['params']) : '';
666 // $params = json_decode($params, true);
667 $params = stripslashes($params); // Remove extra backslashes
668 $params = json_decode($params, true);
669
670 // Verify nonce
671 if (!wp_verify_nonce($nonce, 'ep_nonce')) {
672 wp_send_json_error('Invalid nonce');
673 wp_die(); // Terminate script execution if nonce is invalid
674 }
675
676 $feeds_data = get_option('ep_instagram_feed_data');
677 $user_data = $feeds_data[$user_id]['feed_userinfo'];
678
679 if ($feed_type == 'hashtag_type') {
680 $feeds_data = get_option('ep_instagram_hashtag_feed');
681 }
682
683
684 $profile_picture_url = isset($user_data['profile_picture_url']) ? $user_data['profile_picture_url'] : '';
685
686 if ($feed_type === 'user_account_type' && isset($feeds_data[$loadmore_key]['feed_posts'])) {
687 $feed_posts = $feeds_data[$loadmore_key]['feed_posts'];
688 } else if ($feed_type === 'hashtag_type' && isset($feeds_data[$loadmore_key])) {
689 $feed_posts = $feeds_data[$loadmore_key];
690 } else {
691 $feed_posts = ['error'];
692 }
693
694
695 if (is_array($feed_posts) && count($feed_posts) > 0) {
696 $loaded_posts = isset($_POST['loaded_posts']) ? intval($_POST['loaded_posts']) : 0;
697 $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 0;
698
699 $post_index = $loaded_posts + 1;
700 $start_index = $loaded_posts;
701
702 $next_posts = array_slice($feed_posts, $start_index, $posts_per_page);
703
704 ob_start();
705
706 if (is_array($next_posts) && count($next_posts) > 0) :
707 foreach ($next_posts as $post) :
708 $caption = !empty($post['caption']) ? $post['caption'] : '';
709 $media_type = !empty($post['media_type']) ? $post['media_type'] : '';
710 $media_url = !empty($post['media_url']) ? $post['media_url'] : '';
711 $permalink = !empty($post['permalink']) ? $post['permalink'] : '';
712 $timestamp = !empty($post['timestamp']) ? $post['timestamp'] : '';
713 $username = !empty($post['username']) ? $post['username'] : '';
714 $like_count = !empty($post['like_count']) ? $post['like_count'] : 0;
715 $comments_count = !empty($post['comments_count']) ? $post['comments_count'] : 0;
716
717 $post['profile_picture_url'] = $profile_picture_url;
718 $post['show_likes_count'] = isset($params['show_likes_count']) ? $params['show_likes_count'] : false;
719 $post['show_comments_count'] = isset($params['show_comments_count']) ? $params['show_comments_count'] : false;
720 $post['popup_follow_button'] = isset($params['popup_follow_button']) ? $params['popup_follow_button'] : true;
721 $post['popup_follow_button_text'] = isset($params['popup_follow_button_text']) ? $params['popup_follow_button_text'] : 'Follow';
722 ?>
723
724 <div class="insta-gallery-item cg-carousel__slide js-carousel__slide" data-insta-postid="<?php echo esc_attr($post['id']) ?>" data-postindex="<?php echo esc_attr($post_index); ?>" data-postdata="<?php echo htmlspecialchars(json_encode($post), ENT_QUOTES, 'UTF-8'); ?>" data-media-type="<?php echo esc_attr($media_type); ?>">
725 <?php
726
727 if (!empty($hashtag_id) && $media_type == 'CAROUSEL_ALBUM') {
728 if (isset($post['children']['data'][0]['media_url'])) {
729 $hashtag_media_url = $post['children']['data'][0]['media_url'];
730 $hashtag_media_type = $post['children']['data'][0]['media_type'];
731
732 if ($hashtag_media_type == 'VIDEO') {
733 echo '<video class="insta-gallery-image" src="' . esc_url($hashtag_media_url) . '"></video>';
734 } else {
735 echo ' <img class="insta-gallery-image" src="' . esc_url($hashtag_media_url) . '" alt="' . esc_attr('image') . '">';
736 }
737 }
738 } else {
739 if ($media_type == 'VIDEO') {
740 echo '<video class="insta-gallery-image" src="' . esc_url($media_url) . '"></video>';
741 } else {
742 echo ' <img class="insta-gallery-image" src="' . esc_url($media_url) . '" alt="' . esc_attr('image') . '">';
743 }
744 }
745 ?>
746
747 <div class="insta-gallery-item-type">
748 <div class="insta-gallery-item-type-icon">
749 <?php
750 if ($media_type == 'VIDEO') {
751 echo Helper::get_insta_video_icon();
752 } else if ($media_type == 'CAROUSEL_ALBUM') {
753 echo Helper::get_insta_image_carousel_icon();
754 } else {
755 echo Helper::get_insta_image_icon();
756 }
757 ?>
758 </div>
759 </div>
760 <div class="insta-gallery-item-info">
761 <?php if (strtolower($connected_account_type) === 'business') : ?>
762 <div class="insta-item-reaction-count">
763 <div class="insta-gallery-item-likes">
764 <?php echo Helper::get_insta_like_icon();
765 echo esc_html($like_count); ?>
766 </div>
767 <div class="insta-gallery-item-comments">
768 <?php echo Helper::get_insta_comment_icon();
769 echo esc_html($comments_count); ?>
770 </div>
771 </div>
772 <?php else : ?>
773 <div class="insta-gallery-item-permalink">
774 <?php echo Helper::get_instagram_icon(); ?>
775 </div>
776 <?php endif; ?>
777 </div>
778 </div>
779
780 <?php $post_index++;
781 endforeach;
782 endif;
783
784 $feed_item = ob_get_clean();
785
786 $next_start_index = $start_index + count($next_posts);
787
788 wp_send_json(array(
789 'html' => $feed_item,
790 'next_post_index' => $next_start_index,
791 'total_feed_posts' => count($feed_posts)
792 ));
793 } else {
794 wp_send_json('');
795 }
796 }
797
798 public static function getCalendlyUuid($url)
799 {
800 $pattern = '/\/([0-9a-fA-F-]+)$/';
801 if (preg_match($pattern, $url, $matches)) {
802 $uuid = $matches[1];
803 return $uuid;
804 }
805 return '';
806 }
807
808 public static function getCalendlyUserInfo($access_token)
809 {
810 $transient_name = 'calendly_user_info_' . $access_token;
811 $user_info = get_transient($transient_name);
812 if (false === $user_info) {
813 $user_endpoint = 'https://api.calendly.com/users/me';
814 $headers = array(
815 'Authorization' => "Bearer $access_token",
816 'Content-Type' => 'application/json',
817 );
818 $args = array(
819 'headers' => $headers,
820 );
821 $response = wp_remote_get($user_endpoint, $args);
822 if (!is_wp_error($response) && 200 === wp_remote_retrieve_response_code($response)) {
823 $user_info = wp_remote_retrieve_body($response);
824 set_transient($transient_name, $user_info, 3600);
825 } else {
826 return false;
827 }
828 }
829
830 return $user_info;
831 }
832
833
834
835 public static function getCalaendlyEventTypes($user_uri, $access_token)
836 {
837 // Attempt to retrieve the data from the transient
838 $events_list = get_transient('calendly_events_list_' . md5($access_token));
839
840 if (false === $events_list) {
841 // If the data is not in the transient, fetch it from the API
842 $events_endpoint = "https://api.calendly.com/event_types?user=$user_uri";
843
844 $headers = array(
845 'Authorization' => "Bearer $access_token",
846 'Content-Type' => 'application/json',
847 );
848
849 $args = array(
850 'headers' => $headers,
851 );
852
853 $response = wp_remote_get($events_endpoint, $args);
854
855 if (!is_wp_error($response)) {
856 $body = wp_remote_retrieve_body($response);
857 $events_list = json_decode($body, true);
858
859 // Store the data in a transient for a specified time (e.g., 1 hour)
860 set_transient('calendly_events_list', $events_list, HOUR_IN_SECONDS);
861
862 return $events_list;
863 }
864 }
865
866 return $events_list;
867 }
868
869 public static function getListEventInvitee($uuid, $access_token)
870 {
871 // Attempt to retrieve the data from the transient
872 $invitee_list = get_transient('calendly_invitee_list_' . md5($access_token));
873
874 if (false === $invitee_list) {
875 // If the data is not in the transient, fetch it from the API
876 $events_endpoint = "https://api.calendly.com/scheduled_events/$uuid/invitees";
877
878 $headers = array(
879 'Authorization' => "Bearer $access_token",
880 'Content-Type' => 'application/json',
881 );
882
883 $args = array(
884 'headers' => $headers,
885 );
886
887 $response = wp_remote_get($events_endpoint, $args);
888
889 if (!is_wp_error($response)) {
890 $body = wp_remote_retrieve_body($response);
891 $invitee_list = json_decode($body, true);
892
893 // Store the data in a transient for a specified time (e.g., 1 hour)
894 set_transient('calendly_invitee_list', $invitee_list, HOUR_IN_SECONDS);
895
896 return $invitee_list;
897 }
898 }
899
900 return $invitee_list;
901 }
902
903 public static function getCalaendlyScheduledEvents($user_uri, $access_token)
904 {
905 // Attempt to retrieve the data from the transient
906 $events_list = get_transient('calendly_events_list_' . md5($access_token));
907
908 if (false === $events_list) {
909 // If the data is not in the transient, fetch it from the API
910 $events_endpoint = "https://api.calendly.com/scheduled_events?user=$user_uri";
911
912 $headers = array(
913 'Authorization' => "Bearer $access_token",
914 'Content-Type' => 'application/json',
915 );
916
917 $args = array(
918 'headers' => $headers,
919 );
920
921 $response = wp_remote_get($events_endpoint, $args);
922
923 if (!is_wp_error($response)) {
924 $body = wp_remote_retrieve_body($response);
925 $events_list = json_decode($body, true);
926
927 // Store the data in a transient for a specified time (e.g., 1 hour)
928 set_transient('calendly_events_list', $events_list, HOUR_IN_SECONDS);
929
930 return $events_list;
931 }
932 }
933
934 return $events_list;
935 }
936
937
938 public static function parseDuration($durationString)
939 {
940 list($minutes, $seconds) = explode(':', $durationString);
941 return intval($minutes) * 60 + intval($seconds);
942 }
943
944 public static function generateAdTemplate($client_id, $attributes, $editor = 'elementor')
945 {
946
947 // Example usage
948
949
950 $adSource = isset($attributes['adSource']) ? $attributes['adSource'] : '';
951 $adContent = isset($attributes['adContent']) ? $attributes['adContent'] : '';
952 $unit = isset($attributes['unitoption']) ? $attributes['unitoption'] : 'px';
953
954 if ($editor === 'elementor') {
955 if ($attributes['adSource'] === 'video') {
956 $adFileUrl = isset($attributes['adFileUrl']['url']) ? $attributes['adFileUrl']['url'] : '';
957 } else if ($attributes['adSource'] === 'image') {
958 $adFileUrl = isset($attributes['adFileUrl1']['url']) ? $attributes['adFileUrl1']['url'] : '';
959 } else {
960 $adFileUrl = isset($attributes['adFileUrl2']['url']) ? $attributes['adFileUrl2']['url'] : '';
961 }
962
963 $width = isset($attributes['width']) ? $attributes['width']['size'] : '600';
964 $height = isset($attributes['height']) ? $attributes['height']['size'] : '550';
965 } else {
966 $adFileUrl = isset($attributes['adFileUrl']) ? $attributes['adFileUrl'] : '';
967 $width = isset($attributes['width']) ? $attributes['width'] : '600';
968 $height = isset($attributes['height']) ? $attributes['height'] : '550';
969 }
970 $adStart = isset($attributes['adStart']) ? intval($attributes['adStart']) : 0;
971 $adUrl = isset($attributes['adUrl']) ? $attributes['adUrl'] : '';
972 $adXPosition = isset($attributes['adXPosition']) ? $attributes['adXPosition'] : '';
973 $adYPosition = isset($attributes['adYPosition']) ? $attributes['adYPosition'] : '';
974 $adWidth = isset($attributes['adWidth']) ? $attributes['adWidth'] : '';
975 $adHeight = isset($attributes['adHeight']) ? $attributes['adHeight'] : '';
976 $adSkipButton = isset($attributes['adSkipButton']) ? $attributes['adSkipButton'] : false;
977 $adSkipButtonAfter = isset($attributes['adSkipButtonAfter']) ? intval($attributes['adSkipButtonAfter']) : 5;
978
979 $currentTime = 0;
980 $showSkipButton = false;
981 $videoDuration = 0;
982
983 if ($adContent && isset($adContent['fileLength'])) {
984 $videoDuration = self::parseDuration($adContent['fileLength']);
985 }
986
987 $showSkipButton = true;
988
989 $isYTChannelClass = '';
990 if (!empty($attributes['url']) && self::is_youtube_channel($attributes['url'])) {
991 $isYTChannelClass = ' ep-youtube-channel';
992 }
993
994 ?>
995 <div class="main-ad-template <?php echo esc_attr($adSource);
996 echo esc_attr($isYTChannelClass); ?>" id="<?php echo esc_attr('ad-' . $client_id); ?>" style="display:none">
997 <div class="ep-ad-container">
998 <div class="ep-ad-content" style="position: relative;">
999 <?php if (!empty($adUrl)) : ?> <a target="_blank" href="<?php echo esc_url($adUrl); ?>"> <?php endif; ?>
1000 <?php if ($adSource === 'video') : ?>
1001 <video class="ep-ad" muted>
1002 <source src="<?= esc_url($adFileUrl) ?>">
1003 </video>
1004
1005 <div class="ad-timer">
1006 <span class="ad-running-time"></span>
1007 <span class="ad-duration">&nbsp;<?php echo esc_html__('• Ad', 'embedpress'); ?></span>
1008 </div>
1009 <div class="progress-bar-container">
1010 <div class="progress-bar"></div>
1011 </div>
1012
1013 <?php else : ?>
1014 <img class="ep-ad" src="<?= esc_url($adFileUrl) ?>">
1015 <?php endif; ?>
1016
1017 <?php if (!empty($adUrl)) : ?>
1018 </a>
1019 <?php endif; ?>
1020
1021
1022 <?php if (!empty($adSkipButton) && !empty($showSkipButton)) : ?>
1023 <button title="Skip Ad" class="skip-ad-button" style="display: none;">
1024 <?php echo esc_html__('Skip Ad', 'embedpress'); ?>
1025 </button>
1026 <?php endif; ?>
1027
1028 </div>
1029 </div>
1030 </div>
1031
1032
1033 <style>
1034 .ad-mask .ose-embedpress-responsive {
1035 position: relative;
1036 }
1037
1038 .ad-running {
1039 display: inline-block !important;
1040 }
1041
1042 .ad-mask .ep-embed-content-wraper::after {
1043 content: '';
1044 position: absolute;
1045 top: 0;
1046 left: 0;
1047 right: 0;
1048 bottom: 0;
1049 }
1050
1051 .ep-embed-content-wraper {
1052 position: relative;
1053 }
1054
1055 .ose-youtube {
1056 /* display: none !important; */
1057 }
1058
1059 [data-sponsored-id="<?php echo esc_attr($client_id) ?>"] .main-ad-template {
1060 width: <?php echo esc_attr($width); ?><?php echo esc_attr($unit); ?>;
1061 height: <?php echo esc_attr($height); ?>px;
1062 max-width: 100%;
1063 display: inline-block;
1064 }
1065
1066 div[data-sponsored-id] {
1067 position: relative;
1068 display: inline-block !important;
1069 max-width: 100%;
1070 width: 100%;
1071 }
1072
1073 .embedpress-document-embed div[data-sponsored-id],
1074 .embedpress-document-embed .main-ad-template.video {
1075 width: 100%;
1076 }
1077
1078 .ep-percentage-width div[data-sponsored-id] {
1079 display: block;
1080 }
1081
1082 .main-ad-template.image.ad-running {
1083 position: absolute;
1084 z-index: 1;
1085 bottom: 75px;
1086 left: 50%;
1087 height: auto;
1088 }
1089
1090 [data-sponsored-id="<?php echo esc_attr($client_id) ?>"] .main-ad-template.image.ad-running {
1091 width: <?php echo esc_attr($adWidth); ?>px !important;
1092 height: <?php echo esc_attr($adHeight); ?>px !important;
1093 bottom: <?php echo esc_attr($adYPosition); ?>%;
1094 left: <?php echo esc_attr($adXPosition); ?>%;
1095 }
1096
1097 [data-sponsored-id="<?php echo esc_attr($client_id) ?>"] .main-ad-template .ep-ad-content,
1098 [data-sponsored-id="<?php echo esc_attr($client_id) ?>"] .main-ad-template .ep-ad-container,
1099 .main-ad-template div img {
1100 height: 100%;
1101 object-fit: cover;
1102
1103 }
1104
1105
1106 .main-ad-template.image.ad-running img {
1107 border-radius: 5px;
1108 }
1109
1110 .ep-ad-container {
1111 position: relative;
1112 }
1113
1114 .main-ad-template video,
1115 .main-ad-template img {
1116 width: 100%;
1117 height: 100%;
1118 background-color: #000;
1119 }
1120
1121 .progress-bar-container {
1122 margin-top: -10px;
1123 background: #ff000021;
1124 }
1125
1126 .progress-bar {
1127 background: #5be82a;
1128 height: 5px;
1129 margin-top: -4px;
1130 max-width: 100%;
1131 }
1132
1133 button.skip-ad-button {
1134 position: absolute;
1135 bottom: 15px;
1136 right: 10px;
1137 border: none;
1138 background: #d41556b5 !important;
1139 color: white !important;
1140 z-index: 122222222;
1141 font-size: 14px;
1142 border-radius: 4px;
1143 height: 30px;
1144 width: 80px;
1145 font-weight: normal;
1146 display: flex;
1147 align-items: center;
1148 justify-content: center;
1149 cursor: pointer;
1150 padding: 0;
1151
1152 }
1153
1154 .ad-timer {
1155 position: absolute;
1156 background: #d41556b5;
1157 font-size: 14px;
1158 width: 110px;
1159 color: white;
1160 bottom: 15px;
1161 left: 10px;
1162 text-align: center;
1163 border-radius: 4px;
1164 height: 30px;
1165 width: 80px;
1166 font-weight: normal;
1167 display: flex;
1168 align-items: center;
1169 justify-content: center;
1170
1171 }
1172
1173 [data-sponsored-id="<?php echo esc_attr($client_id) ?>"] .hidden {
1174 display: none !important;
1175 }
1176 </style>
1177
1178
1179
1180 <?php
1181 }
1182
1183
1184 public static function is_pro_active()
1185 {
1186 if (defined('EMBEDPRESS_SL_ITEM_SLUG')) {
1187 return true;
1188 }
1189 return false;
1190 }
1191
1192
1193 public static function getInstagramUserInfo($accessToken, $accountType, $userId, $is_sync = false)
1194 {
1195 if ($is_sync) {
1196 // If $is_sync is true, don't use transient
1197 $use_transient = false;
1198 } else {
1199 // If $is_sync is false, use transient
1200 $transient_key = 'instagram_user_info_' . $userId;
1201 $use_transient = true;
1202 }
1203
1204 if ($use_transient && false !== ($userInfo = get_transient($transient_key))) {
1205 // If transient exists, return cached user info
1206 return $userInfo;
1207 }
1208
1209 if (strtolower($accountType) === 'business') {
1210 $api_url = 'https://graph.facebook.com/' . $userId . '?fields=biography,id,username,website,followers_count,media_count,profile_picture_url,name&access_token=' . $accessToken;
1211 } else {
1212 $api_url = "https://graph.instagram.com/me?fields=id,username,account_type,media_count,followers_count,biography,website&access_token={$accessToken}";
1213 }
1214
1215 $connected_account_type = $accountType;
1216
1217 $userInfoResponse = wp_remote_get($api_url);
1218
1219 if (is_wp_error($userInfoResponse)) {
1220 echo 'Error: Unable to retrieve Instagram user information.';
1221 } else {
1222 $userInfoBody = wp_remote_retrieve_body($userInfoResponse);
1223 $userInfo = json_decode($userInfoBody, true);
1224
1225 $userInfo['connected_account_type'] = $connected_account_type;
1226 $userInfo['access_token'] = $accessToken;
1227
1228
1229 if (!isset($userInfo['profile_picture_url'])) {
1230 $userInfo['profile_picture_url'] = '';
1231 }
1232
1233 // If not using transient, cache the user info for an hour
1234 if ($use_transient) {
1235 set_transient($transient_key, $userInfo, HOUR_IN_SECONDS);
1236 }
1237
1238 return $userInfo;
1239 }
1240 }
1241
1242
1243 // Get Instagram posts, videos, reels
1244 public static function getInstagramPosts($access_token, $account_type, $userId, $limit = 100, $is_sync = false)
1245 {
1246 if ($is_sync) {
1247 // If $is_sync is true, don't use transient
1248 $use_transient = false;
1249 } else {
1250 // If $is_sync is false, use transient
1251 $transient_key = 'instagram_posts_' . $userId;
1252 $use_transient = true;
1253 }
1254
1255 if ($use_transient && false !== ($posts = get_transient($transient_key))) {
1256 // If transient exists, return cached posts
1257 return $posts;
1258 }
1259
1260 if (strtolower($account_type) === 'business') {
1261 $api_url = 'https://graph.facebook.com/v17.0/' . $userId . '/media?fields=media_url,media_product_type,thumbnail_url,caption,id,media_type,timestamp,username,comments_count,like_count,permalink,children%7Bmedia_url,id,media_type,timestamp,permalink,thumbnail_url%7D&limit=' . $limit . '&access_token=' . $access_token;
1262 } else {
1263 $api_url = "https://graph.instagram.com/me/media?fields=id,caption,media_type,media_url,children{media_url,id,media_type},permalink,timestamp,username,thumbnail_url&limit=$limit&access_token=$access_token";
1264 }
1265
1266 $postsResponse = wp_remote_get($api_url);
1267
1268 if (is_wp_error($postsResponse)) {
1269 echo 'Error: Unable to retrieve Instagram posts.';
1270 } else {
1271 $postsBody = wp_remote_retrieve_body($postsResponse);
1272 $posts = json_decode($postsBody, true);
1273
1274 if (empty($posts['data'])) {
1275 return 'Please add Instagram Access Token';
1276 }
1277
1278 // If not using transient, cache the posts for an hour
1279 if ($use_transient) {
1280 set_transient($transient_key, $posts['data'], HOUR_IN_SECONDS);
1281 }
1282
1283 return $posts['data'];
1284 }
1285 }
1286
1287 public static function get_enable_settings_data_for_scripts($settings)
1288 {
1289 $settings_data = [
1290 'enabled_ads' => isset($settings['adManager']) && $settings['adManager'] === 'yes' ? 'yes' : '',
1291
1292 'enabled_custom_player' => isset($settings['emberpress_custom_player']) && $settings['emberpress_custom_player'] === 'yes' ? 'yes' : '',
1293
1294 'enabled_instafeed' => isset($settings['embedpress_pro_embeded_source']) && $settings['embedpress_pro_embeded_source'] === 'instafeed' ? 'yes' : '',
1295
1296 'enabled_docs_custom_viewer' => isset($settings['embedpress_document_viewer']) && $settings['embedpress_document_viewer'] === 'custom' ? 'yes' : '',
1297 ];
1298
1299 update_option('enabled_elementor_scripts', $settings_data);
1300 }
1301
1302 public static function get_options_value($key)
1303 {
1304 $g_settings = get_option(EMBEDPRESS_PLG_NAME);
1305
1306 if (isset($g_settings[$key])) {
1307 return $g_settings[$key];
1308 }
1309 return '';
1310 }
1311 }
1312