PluginProbe
Photonic Gallery & Lightbox for Flickr, SmugMug & Others / 3.36
Photonic Gallery & Lightbox for Flickr, SmugMug & Others v3.36
3.36 3.35 3.34 3.33 2.19 2.20 2.21 2.22 2.23 2.24 2.25 2.26 2.27 2.28 2.29 2.30 2.31 2.32 2.33 2.34 2.40 2.41 2.42 2.43 2.44 All 141 releases
← All changes | Core/Photonic.php +493 -869 2.413.36 View file →
@@ -1,35 +1,206 @@
1 1 <?php
2 +
2 3 namespace Photonic_Plugin\Core;
3 4
4 5 use Photonic_Plugin\Admin\Admin_Menu;
5 -use Photonic_Plugin\Admin\Authentication;
6 -use Photonic_Plugin\Admin\Helper;
7 6 use Photonic_Plugin\Options\Defaults;
8 7 use Photonic_Plugin\Options\Options;
9 8 use WP_Error;
10 9
11 10 class Photonic {
12 - var $defaults, $localized, $provider_map, $admin_menu;
11 + public $defaults;
12 + public bool $localized;
13 + public array $provider_map;
14 + public ?Admin_Menu $admin_menu;
15 + public static string $library;
16 + public static array $lightbox_replacements;
17 + public static array $safe_tags;
18 + public static array $safe_title_tags;
19 + public static array $safe_description_tags;
13 20
14 - function __construct() {
15 -// $start = microtime(true);
16 - global $photonic_options, $photonic_is_IE;
21 + public function __construct() {
22 + // $start = microtime(true);
23 + global $photonic_options;
17 24
18 - //WP provides a global $is_IE, but we specifically need to find IE6x (or, heaven forbid, IE5x). Note that older versions of Opera used to identify themselves as IE6, so we exclude Opera.
19 - $photonic_is_IE = preg_match('/MSIE [56789]/i', $_SERVER['HTTP_USER_AGENT']);
25 + self::$lightbox_replacements = [
26 + 'fancybox' => 'fancybox3',
27 + 'magnific' => 'venobox',
28 + 'prettyphoto' => 'spotlight',
29 + 'strip' => 'venobox',
30 + ];
20 31
21 - require_once(PHOTONIC_PATH."/Options/Options.php");
32 + self::$safe_tags = array_merge_recursive(
33 + [
34 + // Videos
35 + 'video' => [
36 + 'width' => true,
37 + 'height' => true,
38 + 'class' => true,
39 + 'controls' => true,
40 + 'preload' => true,
41 + 'poster' => true,
42 + ],
43 +
44 + 'source' => [
45 + 'src' => true,
46 + 'type' => true,
47 + ],
48 +
49 + // Password prompters
50 + 'input' => [
51 + 'type' => true,
52 + 'name' => true,
53 + 'id' => true,
54 + 'class' => true,
55 + 'value' => true,
56 + 'data-photonic-shortcode' => true,
57 + ],
58 +
59 + 'button' => [
60 + 'class' => true,
61 + ],
62 +
63 + // Custom data attributes
64 + 'div' => [
65 + 'data-photonic' => true,
66 + 'data-photonic-gallery-columns' => true,
67 + 'data-photonic-query' => true,
68 + 'data-photonic-platform' => true,
69 + 'data-photonic-prompt' => true,
70 +
71 + // Slideshow
72 + 'data-splide' => true,
73 + ],
74 +
75 + /*
76 + 'ul' => [
77 + // Slideshows
78 + 'data-photonic-columns' => true,
79 + 'data-photonic-controls' => true,
80 + 'data-photonic-fx' => true,
81 + 'data-photonic-layout' => true,
82 + 'data-photonic-pause' => true,
83 + 'data-photonic-speed' => true,
84 + 'data-photonic-strip-style' => true,
85 + 'data-photonic-timeout' => true,
86 + ],
87 + */
88 +
89 + 'img' => [
90 + // Lazy loading
91 + 'data-src' => true,
92 +
93 + // Tooltips
94 + 'data-photonic-tooltip' => true,
95 + ],
96 +
97 + 'a' => [
98 + // Non-photonic
99 + 'data-html5-href' => true,
100 + 'data-title' => true,
101 + 'data-type' => true,
102 +
103 + // Non-Photonic - BaguetteBox
104 + 'data-content-type' => true,
105 +
106 + // Non-Photonic - BigPicture
107 + 'data-bp' => true,
108 + 'data-bp-type' => true,
109 +
110 + // Non-Photonic - Fancybox
111 + 'data-fancybox' => true,
112 +
113 + // Non-Photonic - Featherlight
114 + 'data-featherlight' => true,
115 + 'data-featherlight-type' => true,
116 +
117 + // Non-Photonic - GLightbox
118 + 'data-format' => true,
119 +
120 + // Non-Photonic - Lightcase
121 + 'data-lc-options' => true,
122 +
123 + // Non-Photonic - LightGallery
124 + 'data-download-url' => true,
125 + 'data-video' => true,
126 + 'data-sub-html' => true,
127 + 'data-photonic-thumb' => true,
128 +
129 + // Non-Photonic - PhotoSwipe5
130 + 'data-pswp-height' => true,
131 + 'data-pswp-width' => true,
132 +
133 + // Non-Photonic - Spotlight
134 + 'data-media' => true,
135 + 'data-src-mp4' => true,
136 + 'data-poster' => true,
137 +
138 + // Non-Photonic - Strip
139 + 'data-strip-group' => true,
140 + 'data-strip-group-options' => true,
141 + 'data-strip-caption' => true,
142 +
143 + // Non-Photonic - VenoBox
144 + 'data-gall' => true,
145 + 'data-vbtype' => true,
146 +
147 + // Tooltips
148 + 'data-photonic-tooltip' => true,
149 +
150 + // Level 3
151 + 'data-photonic-layout' => true,
152 + 'data-photonic-level-3' => true,
153 +
154 + // Photonic photos
155 + 'data-photonic-deep' => true,
156 + 'data-photonic-media-type' => true,
157 + 'data-rel' => true,
158 +
159 + // Photonic albums, common
160 +
161 + // Albums, Google
162 +
163 + // Photos, SmugMug
164 + 'data-photonic-buy' => true,
165 +
166 + // Albums, Zenfolio
167 + 'data-photonic-realm' => true,
168 + ],
169 +
170 + 'figure' => [
171 + // Layouts - Horizontal Masonry
172 + 'data-photonic-idx' => true,
173 + ],
174 + ],
175 + wp_kses_allowed_html('post')
176 + );
177 +
178 + self::$safe_title_tags = [
179 + 'h4' => [],
180 + ];
181 +
182 + self::$safe_description_tags = [
183 + 'strong' => [],
184 + 'em' => [],
185 + 'b' => [],
186 + 'i' => [],
187 + 'br' => [],
188 + 'p' => [],
189 + ];
190 +
191 + require_once PHOTONIC_PATH . "/Options/Options.php";
22 192 add_action('admin_init', [Options::get_instance(), 'prepare_options'], 20); // Setting to 20 so that CPTs can be picked up - Utilities are loaded with a priority 10
23 193
24 194 $this->localized = false;
25 195 $this->provider_map = [
26 - 'flickr' => 'Flickr',
27 - 'smug' => 'SmugMug',
28 - 'smugmug' => 'SmugMug',
29 - 'google' => 'Google',
30 - 'zenfolio' => 'Zenfolio',
31 - 'instagram' => 'Instagram',
196 + 'flickr' => 'Flickr',
197 + 'smug' => 'SmugMug',
198 + 'smugmug' => 'SmugMug',
199 + 'google' => 'Google',
200 + 'zenfolio' => 'Zenfolio',
201 + 'instagram' => 'Instagram',
202 + 'deviantart' => 'DeviantArt'
32 203 ];
33 204
34 205 add_action('admin_menu', [&$this, 'add_admin_menu']);
35 206 add_action('admin_init', [&$this, 'admin_init']);
@@ -40,11 +211,11 @@
40 211 $defaults = Defaults::get_options();
41 212 $all_options = array_merge($defaults, $set_options);
42 213
43 214 foreach ($all_options as $key => $value) {
44 - $mod_key = 'photonic_'.$key;
215 + $mod_key = 'photonic_' . $key;
45 216 global ${$mod_key};
46 - ${$mod_key} = $value;
217 + ${$mod_key} = $value; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals
47 218 }
48 219
49 220 define('PHOTONIC_SSL_VERIFY', empty($photonic_ssl_verify_off));
50 221 define('PHOTONIC_DEBUG', !empty($photonic_debug_on));
@@ -59,15 +230,27 @@
59 230 if (!empty($photonic_curl_timeout) && is_numeric($photonic_curl_timeout)) {
60 231 define('PHOTONIC_CURL_TIMEOUT', $photonic_curl_timeout);
61 232 }
62 233 else {
63 - define('PHOTONIC_CURL_TIMEOUT', 10);
234 + define('PHOTONIC_CURL_TIMEOUT', 30);
64 235 }
65 236
237 + global $photonic_slideshow_library, $photonic_custom_lightbox;
238 + if ('custom' !== $photonic_slideshow_library) {
239 + self::$library = esc_attr($photonic_slideshow_library);
240 + self::$library = empty(self::$lightbox_replacements[self::$library]) ? self::$library : self::$lightbox_replacements[self::$library];
241 + }
242 + elseif (empty($photonic_slideshow_library)) {
243 + self::$library = 'baguettebox';
244 + }
245 + else {
246 + self::$library = esc_attr($photonic_custom_lightbox);
247 + }
248 +
66 249 // Gallery
67 250 if (!empty($photonic_alternative_shortcode)) {
68 251 add_shortcode($photonic_alternative_shortcode, [&$this, 'modify_gallery']);
69 - add_filter('shortcode_atts_'.$photonic_alternative_shortcode, [&$this, 'native_gallery_attributes'], 10, 3);
252 + add_filter('shortcode_atts_' . $photonic_alternative_shortcode, [&$this, 'native_gallery_attributes'], 10, 3);
70 253 }
71 254 else {
72 255 add_filter('post_gallery', [&$this, 'modify_gallery'], 20, 2);
73 256 add_filter('shortcode_atts_gallery', [&$this, 'native_gallery_attributes'], 10, 3);
@@ -76,88 +259,70 @@
76 259 add_shortcode('photonic_helper', [&$this, 'helper_shortcode']);
77 260
78 261 add_action('wp_enqueue_scripts', [&$this, 'always_add_styles'], 20);
79 262 if (!empty($photonic_always_load_scripts)) {
80 - add_action('wp_enqueue_scripts', [&$this, 'conditionally_add_scripts'], 20);
263 + add_action('wp_enqueue_scripts', [&$this, 'conditionally_add_scripts'], 20, 0);
81 264 }
82 - add_action('wp_head', [&$this, 'print_scripts'], 20);
83 265
84 - add_action('wp_ajax_photonic_display_level_2_contents', [&$this, 'display_level_2_contents']);
85 - add_action('wp_ajax_nopriv_photonic_display_level_2_contents', [&$this, 'display_level_2_contents']);
266 + require_once PHOTONIC_PATH . "/Core/AJAX.php";
267 + AJAX::get_instance($this);
86 268
87 - add_action('wp_ajax_photonic_display_level_3_contents', [&$this, 'display_level_3_contents']);
88 - add_action('wp_ajax_nopriv_photonic_display_level_3_contents', [&$this, 'display_level_3_contents']);
269 + /*
270 + add_action('photonic_token_monitor', [&$this, 'monitor_token_validity']);
271 + if (!wp_next_scheduled('photonic_token_monitor')) {
272 + wp_schedule_event(time(), 'hourly', 'photonic_token_monitor');
273 + }
274 + */
275 + // The above code was commented out in March 2023, Photonic v 2.85, to prevent running the cron for Instagram.
276 + // The code below was added to clean out any previously scheduled cron jobs.
277 + // This will be removed not before March 2024, to give users the opportunity to install the plugin and have it un-schedule their jobs.
278 + // $photonic_token_monitor_timestamp = wp_next_scheduled('photonic_token_monitor');
279 + // wp_unschedule_event($photonic_token_monitor_timestamp, 'photonic_token_monitor');
89 280
90 - add_action('wp_ajax_photonic_load_more', [&$this, 'load_more']);
91 - add_action('wp_ajax_nopriv_photonic_load_more', [&$this, 'load_more']);
92 -
93 - add_action('wp_ajax_photonic_lazy_load', [&$this, 'lazy_load']);
94 - add_action('wp_ajax_nopriv_photonic_lazy_load', [&$this, 'lazy_load']);
95 -
96 - add_action('wp_ajax_photonic_helper_shortcode_more', [&$this, 'helper_shortcode_more']);
97 - add_action('wp_ajax_nopriv_photonic_helper_shortcode_more', [&$this, 'helper_shortcode_more']);
98 -
99 - add_action('wp_ajax_photonic_invoke_helper', [&$this, 'invoke_helper']);
100 - add_action('wp_ajax_photonic_obtain_token', [&$this, 'obtain_token']);
101 - add_action('wp_ajax_photonic_save_token', [&$this, 'save_token_in_options']);
102 - add_action('wp_ajax_photonic_delete_token', [&$this, 'delete_token_from_options']);
103 -
104 281 $this->add_extensions();
105 282 $this->add_gutenberg_support();
106 283
107 - add_action('wp_ajax_photonic_dismiss_warning', [&$this, 'dismiss_warning']);
284 + add_action('http_api_curl', [&$this, 'curl_timeout'], 100);
108 285
109 - add_action('http_api_curl', [&$this, 'curl_timeout'], 100, 1);
110 -
111 286 add_action('plugins_loaded', [&$this, 'enable_translations']);
112 287
113 288 add_filter('body_class', [&$this, 'body_class']);
114 289
115 -// $end = microtime(true);
116 -// print_r("<!-- Photonic initialization: ".($end - $start)." -->\n");
290 + add_filter('safe_style_css', [&$this, 'safe_styles']);
117 291
292 + // $end = microtime(true);
293 + // print_r("<!-- Photonic initialization: ".($end - $start)." -->\n");
294 +
118 295 add_action('widgets_init', [&$this, 'load_widget']);
119 296
120 - add_action('elementor/common/after_register_scripts', [&$this, 'enqueue_widget_scripts']);
297 + // add_action('elementor/common/after_register_scripts', [&$this, 'enqueue_widget_scripts']);
298 + add_action('elementor/editor/before_enqueue_scripts', [&$this, 'enqueue_widget_scripts']);
121 299
122 - require_once(PHOTONIC_PATH."/Core/Template.php");
300 + require_once PHOTONIC_PATH . "/Core/Template.php";
123 301 }
124 302
125 303 /**
126 - * @param string $provider
127 - * @param array $auth_token
128 - */
129 - public static function save_provider_authentication($provider, $auth_token) {
130 - $photonic_authentication = get_option('photonic_authentication');
131 - if (empty($photonic_authentication)) {
132 - $photonic_authentication = [];
133 - }
134 - if (empty($photonic_authentication[$provider])) {
135 - $photonic_authentication[$provider] = [];
136 - }
137 - $photonic_authentication[$provider] = $auth_token;
138 - update_option('photonic_authentication', $photonic_authentication);
139 - }
140 -
141 - /**
142 304 * Adds a menu item to the "Settings" section of the admin page.
143 305 *
144 306 * @return void
145 307 */
146 - function add_admin_menu() {
308 + public function add_admin_menu() {
309 + require_once PHOTONIC_PATH . "/Admin/Admin_Menu.php";
310 + $this->admin_menu = new Admin_Menu(__FILE__, $this);
311 +
147 312 if (current_user_can('edit_theme_options')) {
148 313 $parent_slug = 'photonic-options-manager';
149 314 }
150 - else if (current_user_can('edit_posts')) {
315 + elseif (current_user_can('edit_posts')) {
151 316 $parent_slug = 'photonic-getting-started';
152 317 }
153 318
154 319 if (!empty($parent_slug)) {
155 - add_menu_page('Photonic', 'Photonic', 'edit_posts', $parent_slug, [&$this->admin_menu, 'settings'], PHOTONIC_URL.'include/images/Photonic-20-gr.png');
320 + add_menu_page('Photonic', 'Photonic', 'edit_posts', $parent_slug, [&$this->admin_menu, 'settings'], PHOTONIC_URL . 'include/images/Photonic-20-gr.png');
156 321 add_submenu_page($parent_slug, esc_html__('Settings', 'photonic'), esc_html__('Settings', 'photonic'), 'edit_theme_options', 'photonic-options-manager', [&$this->admin_menu, 'settings']);
157 322 add_submenu_page($parent_slug, 'Getting Started', 'Getting Started', 'edit_posts', 'photonic-getting-started', [&$this->admin_menu, 'getting_started']);
158 323 add_submenu_page($parent_slug, 'Authentication', 'Authentication', 'edit_theme_options', 'photonic-auth', [&$this->admin_menu, 'authentication']);
159 - add_submenu_page($parent_slug, esc_html__('Switch to Gutenberg', 'photonic'), esc_html__('Switch to Gutenberg', 'photonic'), 'edit_posts', 'photonic-gutenberg', [&$this->admin_menu, 'gutenberg']);
324 + add_submenu_page($parent_slug, esc_html__('Shortcode Replacement', 'photonic'), esc_html__('Shortcode Replacement', 'photonic'), 'edit_posts', 'photonic-shortcode-replace', [&$this->admin_menu, 'shortcode']);
160 325 add_submenu_page($parent_slug, 'Helpers', 'Helpers', 'edit_posts', 'photonic-helpers', [&$this->admin_menu, 'helpers']);
161 326 }
162 327 }
163 328
@@ -163,110 +328,131 @@
163 328
164 329 /**
165 330 * Adds all scripts and their dependencies to the end of the <body> element only on pages using Photonic.
166 331 *
167 - * @param array $attr
168 332 * @return void
169 333 */
170 - function conditionally_add_scripts($attr = []) {
171 - global $photonic_slideshow_library, $photonic_custom_lightbox_js, $photonic_is_IE, $photonic_custom_lightbox, $photonic_always_load_scripts,
172 - $photonic_disable_photonic_lightbox_scripts, $photonic_disable_photonic_slider_scripts, $photonic_js_in_header, $photonic_thumbnail_style;
334 + public function conditionally_add_scripts() {
335 + global $photonic_slideshow_library, $photonic_custom_lightbox_js, $photonic_custom_lightbox, $photonic_always_load_scripts,
336 + $photonic_disable_photonic_lightbox_scripts, $photonic_disable_photonic_slider_scripts, $photonic_js_in_header;
173 337
174 - if (isset($attr['style'])) {
175 - $layout = $attr['style'];
338 + $library_versions = [
339 + 'baguettebox' => '1.11.1',
340 + 'bigpicture' => '2022-03-31',
341 + 'colorbox' => '1.6.4',
342 + 'fancybox3' => '3.5.7',
343 + 'featherlight' => '1.7.14',
344 + 'glightbox' => '2022-03-12',
345 + 'imagelightbox' => '2018-08-17',
346 + 'lightcase' => '2.5.0',
347 + 'lightgallery' => '2.7.1',
348 + 'photoswipe' => '4.1.3',
349 + 'photoswipe5' => '5.3.7',
350 + 'prettyphoto' => '3.1.6',
351 + 'spotlight' => '0.7.8',
352 + 'splide' => '4.1.4',
353 + 'strip' => '1.8.0',
354 + 'swipebox' => '1.5.2',
355 + 'venobox' => '2.0.4',
356 + ];
357 +
358 + $requires_jq = [
359 + 'colorbox',
360 + 'fancybox',
361 + 'fancybox2',
362 + 'fancybox3',
363 + 'featherlight',
364 + 'imagelightbox',
365 + 'lightcase',
366 + 'magnific',
367 + 'prettyphoto',
368 + 'strip',
369 + 'swipebox',
370 + ];
371 +
372 + $photonic_dependencies = [];
373 + $lb_deps = [];
374 + if (in_array(self::$library, $requires_jq, true)) {
375 + $photonic_dependencies[] = 'jquery';
376 + $lb_deps[] = 'jquery';
176 377 }
177 - else if (isset($attr['layout'])) {
178 - $layout = $attr['layout'];
179 - }
180 - else if (isset($photonic_thumbnail_style)) {
181 - $layout = $photonic_thumbnail_style;
182 - }
183 - else {
184 - $layout = 'square';
185 - }
186 378
187 - $photonic_dependencies = ['jquery'];
188 -
189 - if ($photonic_is_IE && $layout == 'masonry') {
190 - wp_enqueue_script('photonic-ie', PHOTONIC_URL.'include/scripts/front-end/src/photonic-ie.js', ['jquery-masonry', 'photonic'], $this->get_version(PHOTONIC_PATH.'/include/scripts/front-end/src/photonic-ie.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
379 + if (in_array(self::$library, ['colorbox', 'fancybox', 'fancybox2', 'prettyphoto'], true)) {
380 + wp_enqueue_script('jquery-detect-swipe', PHOTONIC_URL . 'include/ext/jquery.detect_swipe.js', ['jquery'], $this->get_version(PHOTONIC_PATH . '/include/ext/jquery.detect_swipe.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
381 + $photonic_dependencies[] = 'jquery-detect-swipe';
191 382 }
192 383
193 - if ($photonic_slideshow_library == 'thickbox') {
384 + if ('thickbox' === self::$library) {
194 385 wp_enqueue_script('thickbox');
195 386 $photonic_dependencies[] = 'thickbox';
196 387 }
197 - else if ($photonic_slideshow_library == 'custom') {
388 + elseif ('custom' === $photonic_slideshow_library && 'strip' !== $photonic_custom_lightbox) {
198 389 $counter = 1;
199 390 $dependencies = ['jquery'];
200 - foreach(preg_split("/((\r?\n)|(\r\n?))/", $photonic_custom_lightbox_js) as $line){
201 - wp_enqueue_script('photonic-lightbox-'.$counter, trim($line), $dependencies, PHOTONIC_VERSION, !($photonic_always_load_scripts && $photonic_js_in_header));
202 - $photonic_dependencies[] = 'photonic-lightbox-'.$counter;
391 + foreach (preg_split("/((\r?\n)|(\r\n?))/", $photonic_custom_lightbox_js) as $line) {
392 + wp_enqueue_script('photonic-lightbox-' . $counter, trim($line), $dependencies, PHOTONIC_VERSION, !($photonic_always_load_scripts && $photonic_js_in_header));
393 + $photonic_dependencies[] = 'photonic-lightbox-' . $counter;
203 394 $counter++;
204 395 }
205 396 }
206 - else if ($photonic_slideshow_library != 'none') {
207 - if (empty($photonic_slideshow_library)) {
208 - $photonic_slideshow_library = 'swipebox';
397 + elseif ('none' !== self::$library) {
398 + if (empty($photonic_disable_photonic_lightbox_scripts)) {
399 + $photonic_dependencies[] = self::$library;
209 400 }
210 401
211 402 if (empty($photonic_disable_photonic_lightbox_scripts)) {
212 - $lb_deps = ['jquery'];
213 - if ($photonic_slideshow_library == 'fluidbox') {
214 - $lb_deps[] = 'imagesloaded';
215 - }
216 - if ($photonic_slideshow_library == 'lightgallery') {
217 - global $photonic_enable_lg_zoom, $photonic_enable_lg_thumbnail, $photonic_enable_lg_fullscreen, $photonic_enable_lg_autoplay;
218 - $lightgallery_plugins = [];
219 - if (!empty($photonic_enable_lg_autoplay)) { $lightgallery_plugins[] = 'autoplay'; }
220 - if (!empty($photonic_enable_lg_fullscreen)) { $lightgallery_plugins[] = 'fullscreen'; }
221 - if (!empty($photonic_enable_lg_thumbnail)) { $lightgallery_plugins[] = 'thumbnail'; }
222 - if (!empty($photonic_enable_lg_zoom)) { $lightgallery_plugins[] = 'zoom'; }
403 + if ('lightgallery' === self::$library) {
404 + $lightgallery_plugins = self::get_lightgallery_plugins();
223 405 if (!empty($lightgallery_plugins)) {
224 - wp_enqueue_script('photonic-lightbox', PHOTONIC_URL.'include/scripts/third-party/'.$photonic_slideshow_library.'/'.$photonic_slideshow_library.PHOTONIC_DEV_MODE.'.js', $lb_deps, $this->get_version(PHOTONIC_PATH.'/include/scripts/third-party/'.$photonic_slideshow_library.'/'.$photonic_slideshow_library.PHOTONIC_DEV_MODE.'.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
225 - $photonic_dependencies[] = 'photonic-lightbox';
406 + wp_enqueue_script('lightgallery', PHOTONIC_URL . 'include/ext/' . self::$library . '/' . self::$library . PHOTONIC_DEV_MODE . '.js', $lb_deps, $this->get_version(PHOTONIC_PATH . '/include/ext/' . self::$library . '/' . self::$library . PHOTONIC_DEV_MODE . '.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
407 + $photonic_dependencies[] = 'lightgallery';
226 408 }
227 - if (PHOTONIC_DEV_MODE) {
409 + if (!empty(PHOTONIC_DEV_MODE)) {
228 410 foreach ($lightgallery_plugins as $plugin) {
229 - wp_enqueue_script('photonic-lightbox-'.$plugin, PHOTONIC_URL.'include/scripts/third-party/'.$photonic_slideshow_library.'/lg-plugin-'.$plugin.'.min.js', ['photonic-lightbox'], $this->get_version(PHOTONIC_PATH.'/include/scripts/third-party/'.$photonic_slideshow_library.'/lg-plugin-'.$plugin.'.min.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
411 + wp_enqueue_script('photonic-lightbox-' . $plugin, PHOTONIC_URL . 'include/ext/' . self::$library . '/lg-plugin-' . $plugin . '.min.js', ['lightgallery'], $this->get_version(PHOTONIC_PATH . '/include/ext/' . self::$library . '/lg-plugin-' . $plugin . '.min.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
230 412 }
231 413 }
232 414 else {
233 - wp_enqueue_script('photonic-lightbox-plugins', PHOTONIC_URL.'include/scripts/third-party/'.$photonic_slideshow_library.'/lightgallery-plugins.js', ['photonic-lightbox'], $this->get_version(PHOTONIC_PATH.'/include/scripts/third-party/'.$photonic_slideshow_library.'/lightgallery-plugins.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
415 + wp_enqueue_script('photonic-lightbox-plugins', PHOTONIC_URL . 'include/ext/' . self::$library . '/lightgallery-plugins.js', ['lightgallery'], $this->get_version(PHOTONIC_PATH . '/include/ext/' . self::$library . '/lightgallery-plugins.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
234 416 }
235 417 }
418 + elseif ('photoswipe5' === self::$library) {
419 + wp_deregister_script('photoswipe'); // Remove any older version of PhotoSwipe, since the new version is not compatible with it
420 + }
236 421 }
237 422 }
238 423
239 - $slideshow_library = $photonic_slideshow_library == 'custom' ? $photonic_custom_lightbox : $photonic_slideshow_library;
240 - $slideshow_library = empty($slideshow_library) ? 'swipebox' : $slideshow_library;
424 + if (empty($photonic_disable_photonic_slider_scripts)) {
425 + wp_enqueue_script('splide', PHOTONIC_URL . 'include/ext/splide/splide' . PHOTONIC_DEV_MODE . '.js', [], $library_versions['splide'] . '-' . $this->get_version(PHOTONIC_PATH . '/include/ext/splide/splide' . PHOTONIC_DEV_MODE . '.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
426 + $photonic_dependencies[] = 'splide';
427 + }
241 428
242 - if (empty($photonic_disable_photonic_lightbox_scripts) && !($slideshow_library == 'lightgallery' && !empty($lightgallery_plugins))) {
243 - $script_type = 'combo';
429 + $slideshow_library = self::$library;
430 +
431 + if (empty($photonic_disable_photonic_lightbox_scripts) && 'none' !== $slideshow_library && 'thickbox' !== $slideshow_library && $slideshow_library !== $photonic_custom_lightbox/* && 'photoswipe5' !== $slideshow_library*/) {
432 + wp_enqueue_script($slideshow_library, PHOTONIC_URL . 'include/ext/' . $slideshow_library . '/' . $slideshow_library . PHOTONIC_DEV_MODE . '.js', $lb_deps, (empty($library_versions[$slideshow_library]) ? $this->get_version(PHOTONIC_PATH . "/include/ext/$slideshow_library/$slideshow_library" . PHOTONIC_DEV_MODE . ".js") : $library_versions[$slideshow_library]), !($photonic_always_load_scripts && $photonic_js_in_header));
244 433 }
245 - else {
246 - $script_type = 'solo';
247 - }
248 434
249 - if (empty($photonic_disable_photonic_slider_scripts)) {
250 - $script_type .= '-slider';
251 - }
435 + $module = "include/js/front-end/out/photonic-" . $slideshow_library . PHOTONIC_DEV_MODE . '.js';
252 436
253 - wp_enqueue_script('photonic', PHOTONIC_URL."include/scripts/front-end/jq/$script_type/photonic-".$slideshow_library.PHOTONIC_DEV_MODE.'.js', $photonic_dependencies, $this->get_version(PHOTONIC_PATH."/include/scripts/front-end/jq/$script_type/photonic-".$slideshow_library.PHOTONIC_DEV_MODE.'.js'), !($photonic_always_load_scripts && $photonic_js_in_header));
437 + wp_enqueue_script('photonic', PHOTONIC_URL . $module, $photonic_dependencies, $this->get_version(PHOTONIC_PATH . "/" . $module), !($photonic_always_load_scripts && $photonic_js_in_header));
254 438
255 439 $this->localize_variables_once();
256 -
257 - if (class_exists('\FLBuilderModel') && \FLBuilderModel::is_builder_active()) {
258 - $this->enqueue_widget_scripts();
259 - }
260 440 }
261 441
262 - function localize_variables_once() {
442 + /**
443 + * Special function to ensure that wp_localize_script, defining Photonic_JS is called at the most once.
444 + * Since <code>conditionally_add_scripts</code> is called from <code>modify_gallery</code>, it can include the Photonic_JS
445 + * definition multiple times. This code ensures that it is included just once.
446 + */
447 + public function localize_variables_once() {
263 448 if ($this->localized) {
264 449 return;
265 450 }
266 451 // Technically JS, but needs to happen here, otherwise the script is repeated multiple times, once for each time
267 452 // <code>conditionally_add_scripts</code> is called.
268 - $js_array = $this->get_localized_js_variables();
453 + require_once PHOTONIC_PATH . '/Core/Front_End.php';
454 + $js_array = Front_End::get_instance()->get_localized_js_variables();
269 455 wp_localize_script('photonic', 'Photonic_JS', $js_array);
270 456 $this->localized = true;
271 457 }
272 458
@@ -274,100 +460,89 @@
274 460 * Adds all styles to all pages because styles, if not added in the header can cause issues.
275 461 *
276 462 * @return void
277 463 */
278 - function always_add_styles() {
464 + public function always_add_styles() {
279 465 global $photonic_slideshow_library, $photonic_custom_lightbox_css, $photonic_disable_photonic_lightbox_scripts, $photonic_disable_photonic_slider_scripts;
280 466
281 - if ($photonic_slideshow_library == 'custom') {
467 + if ('custom' === $photonic_slideshow_library) {
282 468 $counter = 1;
283 - foreach(preg_split("/((\r?\n)|(\r\n?))/", $photonic_custom_lightbox_css) as $line){
284 - wp_enqueue_style('photonic-lightbox-'.$counter, trim($line), [], PHOTONIC_VERSION);
469 + foreach (preg_split("/((\r?\n)|(\r\n?))/", $photonic_custom_lightbox_css) as $line) {
470 + wp_enqueue_style('photonic-lightbox-' . $counter, trim($line), [], PHOTONIC_VERSION);
285 471 $counter++;
286 472 }
287 473 }
288 474
289 - if ($photonic_slideshow_library != 'none') {
290 - if (empty($photonic_slideshow_library)) {
291 - $photonic_slideshow_library = 'swipebox';
292 - }
293 - }
475 + $slideshow_library = esc_attr(!empty($photonic_disable_photonic_lightbox_scripts) ? 'none' : self::$library);
294 476
295 - global $photonic_custom_lightbox;
296 - $slideshow_library = !empty($photonic_disable_photonic_lightbox_scripts) ? 'none' :
297 - ($photonic_slideshow_library == 'custom' ? $photonic_custom_lightbox : $photonic_slideshow_library);
298 -
299 477 $this->enqueue_lightbox_styles($slideshow_library, empty($photonic_disable_photonic_slider_scripts));
300 478
301 479 global $photonic_css_in_file;
302 - $file = trailingslashit(PHOTONIC_UPLOAD_DIR).'custom-styles.css';
303 - if (@file_exists($file) && !empty($photonic_css_in_file)) {
304 - wp_enqueue_style('photonic-custom', trailingslashit(PHOTONIC_UPLOAD_URL).'custom-styles.css', ['photonic'], $this->get_version($file));
480 + $file = trailingslashit(PHOTONIC_UPLOAD_DIR) . 'custom-styles.css';
481 + if (@file_exists($file) && !empty($photonic_css_in_file)) { // phpcs:ignore WordPress.PHP.NoSilencedErrors
482 + wp_enqueue_style('photonic-custom', trailingslashit(PHOTONIC_UPLOAD_URL) . 'custom-styles.css', ['photonic'], $this->get_version($file));
305 483 }
484 + else {
485 + wp_add_inline_style('photonic', $this->generate_css());
486 + }
487 +
488 + if (class_exists('\FLBuilder')) {
489 + $this->load_beaver();
490 + }
306 491 }
307 492
308 - function enqueue_lightbox_styles($slideshow_library = 'swipebox', $combine_slider = true) {
309 - $template_directory = get_template_directory();
310 - $stylesheet_directory = get_stylesheet_directory();
493 + public function enqueue_lightbox_styles($slideshow_library = 'swipebox', $include_slider = true) {
494 + if ($include_slider) {
495 + wp_enqueue_style('photonic-slider', PHOTONIC_URL . 'include/ext/splide/splide' . PHOTONIC_DEV_MODE . '.css', [], $this->get_version(PHOTONIC_PATH . '/include/ext/splide/splide' . PHOTONIC_DEV_MODE . '.css'));
496 + }
311 497
312 - $folder = $combine_slider ? 'combo-slider' : 'combo';
498 + $no_css = [
499 + 'bigpicture',
313 500
314 - if ($slideshow_library == 'colorbox') {
501 + 'none',
502 + 'fancybox',
503 + 'fancybox2',
504 + 'fancybox4',
505 + 'magnific',
506 + 'prettyphoto',
507 + ];
508 +
509 + if ('colorbox' === $slideshow_library) {
315 510 global $photonic_cbox_theme;
316 - if ($photonic_cbox_theme == 'theme' && @file_exists($stylesheet_directory.'/scripts/colorbox/colorbox.css')) {
317 - wp_enqueue_style('photonic-lightbox', get_stylesheet_directory_uri().'/scripts/colorbox/colorbox.css', [], PHOTONIC_VERSION);
511 + if ('theme' === $photonic_cbox_theme) {
512 + wp_enqueue_style('photonic-lightbox', PHOTONIC_URL . 'include/ext/colorbox/style-1/colorbox.css', [], $this->get_version(PHOTONIC_PATH . '/include/ext/colorbox/style-1/colorbox.css'));
318 513 }
319 - else if ($photonic_cbox_theme == 'theme' && @file_exists($template_directory.'/scripts/colorbox/colorbox.css')) {
320 - wp_enqueue_style('photonic-lightbox', get_template_directory_uri().'/scripts/colorbox/colorbox.css', [], PHOTONIC_VERSION);
321 - }
322 - else if ($photonic_cbox_theme == 'theme') {
323 - wp_enqueue_style('photonic-lightbox', PHOTONIC_URL.'include/scripts/third-party/colorbox/style-1/colorbox.css', [], $this->get_version(PHOTONIC_PATH.'/include/scripts/third-party/colorbox/style-1/colorbox.css'));
324 - }
325 514 else {
326 - wp_enqueue_style('photonic-lightbox', PHOTONIC_URL.'include/scripts/third-party/colorbox/style-'.$photonic_cbox_theme.'/colorbox.css', [], $this->get_version(PHOTONIC_PATH.'/include/scripts/third-party/colorbox/style-'.$photonic_cbox_theme.'/colorbox.css'));
515 + wp_enqueue_style('photonic-lightbox', PHOTONIC_URL . 'include/ext/colorbox/style-' . $photonic_cbox_theme . '/colorbox.css', [], $this->get_version(PHOTONIC_PATH . '/include/ext/colorbox/style-' . $photonic_cbox_theme . '/colorbox.css'));
327 516 }
328 517 }
329 - else if ($slideshow_library == 'lightgallery') {
518 + elseif ('lightgallery' === $slideshow_library) {
330 519 global $photonic_enable_lg_transitions;
520 + wp_enqueue_style('photonic-lightbox', PHOTONIC_URL . 'include/ext/lightgallery/lightgallery' . PHOTONIC_DEV_MODE . '.css', [], $this->get_version(PHOTONIC_PATH . '/include/ext/lightgallery/lightgallery' . PHOTONIC_DEV_MODE . '.css'));
331 521 if (!empty($photonic_enable_lg_transitions)) {
332 - wp_enqueue_style('photonic-lightbox-lg-transitions', PHOTONIC_URL.'include/scripts/third-party/lightgallery/lightgallery-transitions.min.css', [], $this->get_version(PHOTONIC_PATH.'/include/scripts/third-party/lightgallery/lightgallery-transitions.min.css'));
522 + wp_enqueue_style('photonic-lightbox-lg-transitions', PHOTONIC_URL . 'include/ext/lightgallery/lightgallery-transitions.min.css', [], $this->get_version(PHOTONIC_PATH . '/include/ext/lightgallery/lightgallery-transitions.min.css'));
333 523 }
334 524 }
335 - else if ($slideshow_library == 'thickbox') {
525 + elseif ('thickbox' === $slideshow_library) {
336 526 wp_enqueue_style('thickbox');
337 527 }
528 + elseif (!in_array($slideshow_library, $no_css, true)) {
529 + wp_enqueue_style('photonic-lightbox', PHOTONIC_URL . 'include/ext/' . $slideshow_library . '/' . $slideshow_library . PHOTONIC_DEV_MODE . '.css', [], $this->get_version(PHOTONIC_PATH . '/include/ext/' . $slideshow_library . '/' . $slideshow_library . PHOTONIC_DEV_MODE . '.css'));
530 + }
338 531
339 - wp_enqueue_style('photonic', PHOTONIC_URL."include/css/front-end/$folder/photonic-$slideshow_library.min.css", [], $this->get_version(PHOTONIC_PATH."/include/css/front-end/$folder/photonic-$slideshow_library.min.css"));
532 + wp_enqueue_style('photonic', PHOTONIC_URL . "include/css/front-end/core/photonic" . PHOTONIC_DEV_MODE . ".css", [], $this->get_version(PHOTONIC_PATH . "/include/css/front-end/core/photonic" . PHOTONIC_DEV_MODE . ".css"));
340 533 }
341 534
342 535 /**
343 - * Prints the custom CSS directly in the header if the option is not set to include it as a file
344 - */
345 - function print_scripts() {
346 - global $photonic_css_in_file;
347 - $file = trailingslashit(PHOTONIC_UPLOAD_DIR).'custom-styles.css';
348 - if (!@file_exists($file) || empty($photonic_css_in_file)) {
349 - $this->generate_css();
350 - }
351 - }
352 -
353 - /**
354 536 * Prints the dynamically generated CSS based on option selections.
355 537 *
356 538 * @param bool $header
357 539 * @return string
358 540 */
359 - function generate_css($header = true) {
360 - global $photonic_flickr_collection_set_constrain_by_padding, $photonic_flickr_photos_constrain_by_padding, $photonic_flickr_photos_pop_constrain_by_padding, $photonic_flickr_galleries_constrain_by_padding;
361 - global $photonic_smug_photos_constrain_by_padding, $photonic_smug_photos_pop_constrain_by_padding, $photonic_smug_albums_album_constrain_by_padding, $photonic_instagram_photos_constrain_by_padding;
362 - global $photonic_zenfolio_photos_constrain_by_padding, $photonic_zenfolio_sets_constrain_by_padding, $photonic_tile_spacing, $photonic_masonry_tile_spacing, $photonic_mosaic_tile_spacing, $photonic_masonry_min_width;
363 - global $photonic_google_photos_constrain_by_padding;
541 + public function generate_css(bool $header = true): string {
542 + global $photonic_tile_spacing, $photonic_masonry_tile_spacing, $photonic_mosaic_tile_spacing;
364 543
365 544 $css = '';
366 - if ($header) {
367 - $css .= '<style type="text/css">'."\n";
368 - }
369 -
370 545 $saved_css = get_option('photonic_css');
371 546
372 547 if ($header && !empty($saved_css)) {
373 548 $css .= "/* Retrieved from saved CSS */\n";
@@ -373,67 +548,38 @@
373 548 $css .= "/* Retrieved from saved CSS */\n";
374 549 $css .= $saved_css;
375 550 }
376 551 else {
552 + require_once PHOTONIC_PATH . '/Core/Front_End.php';
553 + $front_end = Front_End::get_instance();
554 +
377 555 if ($header) {
378 556 $css .= "/* Dynamically generated CSS */\n";
379 557 }
380 - $css .= ".photonic-panel { ".
381 - $this->get_bg_css('photonic_flickr_gallery_panel_background').
382 - $this->get_border_css('photonic_flickr_set_popup_thumb_border').
558 + $css .= ".photonic-panel { " .
559 + $front_end->get_bg_css('photonic_flickr_gallery_panel_background') .
383 560 " }\n";
384 561
385 - $css .= ".photonic-flickr-stream .photonic-pad-photosets { margin: {$photonic_flickr_collection_set_constrain_by_padding}px; }\n";
386 - $css .= ".photonic-flickr-stream .photonic-pad-galleries { margin: {$photonic_flickr_galleries_constrain_by_padding}px; }\n";
387 - $css .= ".photonic-flickr-stream .photonic-pad-photos { padding: 5px {$photonic_flickr_photos_constrain_by_padding}px; }\n";
388 -
389 - $css .= ".photonic-google-stream .photonic-pad-photos { padding: 5px {$photonic_google_photos_constrain_by_padding}px; }\n";
390 -
391 - $css .= ".photonic-zenfolio-stream .photonic-pad-photos { padding: 5px {$photonic_zenfolio_photos_constrain_by_padding}px; }\n";
392 - $css .= ".photonic-zenfolio-stream .photonic-pad-photosets { margin: 5px {$photonic_zenfolio_sets_constrain_by_padding}px; }\n";
393 -
394 - $css .= ".photonic-instagram-stream .photonic-pad-photos { padding: 5px {$photonic_instagram_photos_constrain_by_padding}px; }\n";
395 -
396 - $css .= ".photonic-smug-stream .photonic-pad-albums { margin: {$photonic_smug_albums_album_constrain_by_padding}px; }\n";
397 - $css .= ".photonic-smug-stream .photonic-pad-photos { padding: 5px {$photonic_smug_photos_constrain_by_padding}px; }\n";
398 -
399 - $css .= ".photonic-flickr-panel .photonic-pad-photos { padding: 10px {$photonic_flickr_photos_pop_constrain_by_padding}px; box-sizing: border-box; }\n";
400 - $css .= ".photonic-smug-panel .photonic-pad-photos { padding: 10px {$photonic_smug_photos_pop_constrain_by_padding}px; box-sizing: border-box; }\n";
401 -
402 - $css .= ".photonic-random-layout .photonic-thumb { padding: {$photonic_tile_spacing}px}\n";
403 - $css .= ".photonic-masonry-layout .photonic-thumb { padding: {$photonic_masonry_tile_spacing}px}\n";
404 - $css .= ".photonic-mosaic-layout .photonic-thumb { padding: {$photonic_mosaic_tile_spacing}px}\n";
405 -
406 - $css .= ".photonic-ie .photonic-masonry-layout .photonic-level-1, .photonic-ie .photonic-masonry-layout .photonic-level-2 { width: ".(absint($photonic_masonry_min_width) ? absint($photonic_masonry_min_width) : 200)."px; }\n";
562 + $css .= ".photonic-random-layout .photonic-thumb { padding: " . esc_attr($photonic_tile_spacing) . "px}\n";
563 + $css .= ".photonic-masonry-layout .photonic-thumb, .photonic-masonry-horizontal-layout .photonic-thumb { padding: " . esc_attr($photonic_masonry_tile_spacing) . "px}\n";
564 + $css .= ".photonic-mosaic-layout .photonic-thumb { padding: " . esc_attr($photonic_mosaic_tile_spacing) . "px}\n";
407 565 }
408 566
409 - if ($header) {
410 - $css .= "\n</style>\n";
411 - echo $css;
412 - }
413 567 return $css;
414 568 }
415 569
416 570 public static function get_version($file) {
417 - return date("Ymd-Gis", @filemtime($file));
571 + return gmdate("Ymd-Gis", @filemtime($file)); // phpcs:ignore WordPress.PHP.NoSilencedErrors
418 572 }
419 573
420 - function admin_init() {
421 - require_once(PHOTONIC_PATH."/Admin/Admin.php");
422 -
423 - if (!empty($_REQUEST['page']) &&
424 - in_array($_REQUEST['page'], ['photonic-options-manager', 'photonic-options', 'photonic-helpers', 'photonic-getting-started', 'photonic-auth', 'photonic-gutenberg'])) {
425 - require_once(PHOTONIC_PATH."/Admin/Admin_Menu.php");
426 - $this->admin_menu = new Admin_Menu(__FILE__, $this);
427 - }
574 + public function admin_init(): void {
575 + require_once PHOTONIC_PATH . "/Admin/Admin.php";
428 576 }
429 577
430 - function add_extensions() {
431 - require_once("Gallery.php");
432 - require_once(PHOTONIC_PATH."/Modules/Core.php");
433 - require_once(PHOTONIC_PATH.'/Layouts/Core_Layout.php');
434 -
435 - do_action('photonic_register_extensions');
578 + public function add_extensions() {
579 + require_once "Gallery.php";
580 + require_once PHOTONIC_PATH . "/Platforms/Base.php";
581 + require_once PHOTONIC_PATH . '/Layouts/Core_Layout.php';
436 582 }
437 583
438 584 /**
439 585 * Overrides the native gallery short code, and does a lot more.
@@ -438,12 +584,18 @@
438 584 /**
439 585 * Overrides the native gallery short code, and does a lot more.
440 586 *
441 587 * @param $content
442 - * @param array $attr
588 + * @param array|string $attr
443 589 * @return string
444 590 */
445 - function modify_gallery($content, $attr = []) {
591 + public function modify_gallery($content, $attr = []) {
592 + global $photonic_disable_on_home_page, $photonic_disable_on_archives;
593 + if ((is_archive() && !empty($photonic_disable_on_archives)) ||
594 + (is_home() && !empty($photonic_disable_on_home_page))) {
595 + return false;
596 + }
597 +
446 598 global $photonic_alternative_shortcode;
447 599
448 600 // If an alternative shortcode is used, then $content has the shortcode attributes
449 601 if (!empty($photonic_alternative_shortcode)) {
@@ -448,65 +600,45 @@
448 600 // If an alternative shortcode is used, then $content has the shortcode attributes
449 601 if (!empty($photonic_alternative_shortcode)) {
450 602 $attr = $content;
451 603 }
452 - if ($attr == null) {
604 + if (empty($attr)) {
453 605 $attr = [];
454 606 }
455 607
456 - $this->conditionally_add_scripts($attr);
608 + $this->conditionally_add_scripts();
457 609 $images = $this->get_gallery_images($attr);
458 610
459 - if (isset($images) && !is_array($images)) {
460 - return $images;
461 - }
462 -
463 - return $content;
611 + return wp_kses($images, self::$safe_tags);
464 612 }
465 613
466 614 /**
467 - * Adds Photonic attributes to the native WP galleries. This cannot be called in <code>Photonic_Plugin\Modules\Native</code> because
615 + * Adds Photonic attributes to the native WP galleries. This cannot be called in <code>Photonic_Plugin\Platforms\Native</code> because
468 616 * that class is not initialised until a gallery of the native type is encountered
469 617 *
470 - * @param $out
471 - * @param $pairs
472 - * @param $attributes
618 + * @param array $out
619 + * @param array $pairs Not used, but needed since this is for a standard gallery filter.
620 + * @param array $attributes
473 621 * @return mixed
474 622 */
475 - function native_gallery_attributes($out, $pairs, $attributes) {
476 - global $photonic_wp_title_caption, $photonic_enable_popup, $photonic_thumbnail_style, $photonic_alternative_shortcode;
623 + public function native_gallery_attributes(array $out, array $pairs, array $attributes): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter
624 + global $photonic_wp_title_caption, $photonic_thumbnail_style, $photonic_alternative_shortcode;
477 625
478 - $bypass = empty($photonic_enable_popup) || $photonic_enable_popup == 'off';
479 626 $defaults = [
480 - 'layout' => !empty($photonic_thumbnail_style) ? $photonic_thumbnail_style : 'square',
481 - 'more' => '',
482 - 'display' => 'in-page',
483 - 'panel' => '',
484 - 'filter' => '',
485 - 'filter_type' => 'include',
486 - 'fx' => 'slide', // LightSlider effects: fade and slide
487 - 'timeout' => 4000, // Time between slides in ms
488 - 'speed' => 1000, // Time for each transition
489 - 'pause' => true, // Pause on hover
490 - 'strip-style' => 'thumbs',
491 - 'controls' => 'show',
492 - 'popup' => $bypass ? 'hide' : 'show',
627 + 'layout' => esc_attr($photonic_thumbnail_style ?: 'square'),
493 628
494 629 'custom_classes' => '',
495 - 'alignment' => '',
630 + 'alignment' => '',
496 631
497 - 'caption' => $photonic_wp_title_caption,
498 - 'page' => 1,
499 - 'count' => -1,
500 - 'thumb_width' => 75,
501 - 'thumb_height' => 75,
502 - 'thumb_size' => 'thumbnail',
503 - 'slide_size' => 'large',
504 - 'slideshow_height' => 500,
632 + 'caption' => esc_attr($photonic_wp_title_caption),
633 + 'page' => 1,
634 + 'count' => -1,
635 + 'thumb_size' => 'thumbnail',
636 + 'slide_size' => 'large',
505 637 ];
506 638
507 639 $attributes = array_merge($defaults, $attributes);
508 - if (empty($attributes['style']) || ($attributes['style'] == 'default' && !empty($photonic_alternative_shortcode) && $photonic_alternative_shortcode != 'gallery')) {
640 + if (empty($attributes['style']) || ('default' === $attributes['style'] && !empty($photonic_alternative_shortcode) && 'gallery' !== $photonic_alternative_shortcode)) {
509 641 $attributes['style'] = $attributes['layout'];
510 642 }
511 643
512 644 foreach ($attributes as $key => $value) {
@@ -518,15 +650,17 @@
518 650 /**
519 651 * @param array $attr
520 652 * @return string
521 653 */
522 - function helper_shortcode($attr = []) {
523 - if ($attr == null) {
654 + public function helper_shortcode(array $attr = []): string {
655 + if (empty($attr)) {
524 656 $attr = [];
525 657 }
526 658
527 - if (empty($attr['type']) || !in_array(strtolower($attr['type']), ['google', 'flickr', 'smugmug', 'zenfolio'])) {
528 - return sprintf(esc_html__('Please specify a value for %1%s. Accepted values are %2$s, %3$s, %4$s, %5$s', 'photonic'), '<code>type</code>', '<code>google</code>', '<code>flickr</code>', '<code>smugmug</code>', '<code>zenfolio</code>');
659 + $this->conditionally_add_scripts();
660 +
661 + if (empty($attr['type']) || !in_array(strtolower($attr['type']), ['google', 'flickr', 'smugmug', 'zenfolio'], true)) {
662 + return sprintf(esc_html__('Please specify a value for %1$s. Accepted values are %2$s, %3$s, %4$s, %5$s', 'photonic'), '<code>type</code>', '<code>google</code>', '<code>flickr</code>', '<code>smugmug</code>', '<code>zenfolio</code>');
529 663 }
530 664
531 665 $gallery = new Gallery($attr);
532 666 return $gallery->get_helper_contents();
@@ -532,563 +666,57 @@
532 666 return $gallery->get_helper_contents();
533 667 }
534 668
535 669 /**
536 - * @param $attr
537 - * @return array|bool|string
538 - */
539 - function get_gallery_images($attr) {
540 - global $photonic_nested_shortcodes;
541 - $attr = array_merge([
542 - // Especially for Photonic
543 - 'type' => 'default', //default, flickr, smugmug, google, zenfolio, instagram
544 - 'style' => 'default', //default, strip-below, strip-above, strip-right, strip-left, no-strip, launch
545 -// 'id' => $post->ID,
546 -// 'layout' => isset($photonic_thumbnail_style) ? $photonic_thumbnail_style : 'square',
547 - ], $attr);
548 -
549 - if ($photonic_nested_shortcodes) {
550 - $attr = array_map('do_shortcode', $attr);
551 - }
552 -
553 - extract($attr);
554 -
555 - $type = strtolower($attr['type']);
556 -
557 - if ($type == 'picasa') {
558 - $message = esc_html__('Google has deprecated the Picasa API. Please consider switching over to Google Photos', 'photonic');
559 - return "<div class='photonic-error'>\n\t<span class='photonic-error-icon photonic-icon'>&nbsp;</span>\n\t<div class='photonic-message'>\n\t\t$message\n\t</div>\n</div>\n";
560 - }
561 -
562 - if ($type == '500px') {
563 - $message = esc_html__('The API for 500px.com is no longer available for public use.', 'photonic');
564 - return "<div class='photonic-error'>\n\t<span class='photonic-error-icon photonic-icon'>&nbsp;</span>\n\t<div class='photonic-message'>\n\t\t$message\n\t</div>\n</div>\n";
565 - }
566 -
567 - if (!empty($attr['show_gallery']) && in_array($type, ['flickr', 'smugmug', 'google', 'zenfolio', 'instagram'])) { // Lazy button not for WP galleries
568 - $images = $this->get_show_gallery_button($attr);
569 - }
570 - else {
571 - $gallery = new Gallery($attr);
572 - $images = $gallery->get_contents();
573 - }
574 -
575 - return $images;
576 - }
577 -
578 - /**
579 - * Clicking on a level 2 object (i.e. an Album / Set / Gallery) triggers this. This will fetch the contents of the level 2 object and generate the markup for it.
580 - *
581 - * @return void
582 - */
583 - function display_level_2_contents() {
584 - $panel = esc_attr($_POST['panel_id']);
585 - $components = explode('-', $panel);
586 -
587 - if (count($components) <= 5) {
588 - die();
589 - }
590 - $panel = implode('-', array_slice($components, 4, 10, true));
591 - $query = sanitize_text_field($_POST['query']);
592 - $query = wp_parse_args($query);
593 -
594 - $args = [
595 - 'display' => 'popup',
596 - 'layout' => 'square',
597 - 'panel' => $panel,
598 - 'password' => !empty($_POST['password']) ? sanitize_text_field($_POST['password']) : '',
599 - 'count' => sanitize_text_field($_POST['photo_count']),
600 - 'photo_more' => sanitize_text_field($_POST['photo_more']),
601 - 'main_size' => $query['main_size'],
602 - 'type' => $components[1]
603 - ];
604 -
605 - $provider = $components[1];
606 - $type = $components[2];
607 - if (in_array($provider, ['smug', 'smugmug', 'zenfolio', 'google', 'flickr'])) {
608 - if ($provider == 'smug') {
609 - $args['view'] = 'album';
610 - $args['album_key'] = $components[4];
611 - }
612 - else if ($provider == 'zenfolio') {
613 - $args['view'] = 'photosets';
614 - $args['object_id'] = $components[4];
615 - $args['thumb_size'] = sanitize_text_field($_POST['overlay_size']);
616 - $args['video_size'] = sanitize_text_field($_POST['overlay_video_size']);
617 - $args['realm_id'] = sanitize_text_field($_POST['realm_id']);
618 - }
619 - else if ($provider == 'google') {
620 - $args['view'] = 'photos';
621 - $args['album_id'] = implode('-', array_slice($components, 4, (count($components) - 1) - 4));
622 - $args['thumb_size'] = sanitize_text_field($_POST['overlay_size']);
623 - $args['video_size'] = sanitize_text_field($_POST['overlay_video_size']);
624 - $args['crop_thumb'] = sanitize_text_field($_POST['overlay_crop']);
625 - }
626 - else if ($provider == 'flickr') {
627 - if ($type == 'gallery') {
628 - $args['gallery_id'] = $components[4].'-'.$components[5];
629 - $args['gallery_id_computed'] = true;
630 - }
631 - else if ($type = 'set') {
632 - $args['photoset_id'] = $components[4];
633 - }
634 - $args['thumb_size'] = sanitize_text_field($_POST['overlay_size']);
635 - $args['video_size'] = sanitize_text_field($_POST['overlay_video_size']);
636 - }
637 -
638 - $gallery = new Gallery($args);
639 - echo $gallery->get_contents();
640 - }
641 - die();
642 - }
643 -
644 - function display_level_3_contents() {
645 - $node = esc_attr($_POST['node']);
646 - $components = explode('-', $node);
647 -
648 - if (count($components) <= 3) {
649 - die();
650 - }
651 -
652 - $args = ['display' => 'in-page', 'headers' => '', 'layout' => esc_attr($_POST['layout'])];
653 -
654 - $provider = $components[0];
655 - if ($provider == 'flickr') {
656 - $args['collection_id'] = implode('-', array_slice($components, 2, 2, true));
657 - $args['user_id'] = $components[4];
658 - $args['type'] = 'flickr';
659 - $gallery = new Gallery($args);
660 - echo $gallery->get_contents();
661 - }
662 - die();
663 - }
664 -
665 - /**
666 - * Constructs the CSS for a "background" option
667 - *
668 - * @param $option
670 + * @param array $attr
669 671 * @return string
670 672 */
671 - function get_bg_css($option) {
672 - global ${$option};
673 - $option_val = ${$option};
674 - if (!is_array($option_val)) {
675 - $val_array = [];
676 - $vals = explode(';', $option_val);
677 - foreach ($vals as $val) {
678 - if (trim($val) == '') { continue; }
679 - $pair = explode('=', $val);
680 - $val_array[$pair[0]] = $pair[1];
681 - }
682 - $option_val = $val_array;
683 - }
684 - $bg_string = "";
685 - $bg_rgba_string = "";
686 - if (!isset($option_val['colortype']) || $option_val['colortype'] == 'transparent') {
687 - $bg_string .= " transparent ";
688 - }
689 - else {
690 - if (isset($option_val['color'])) {
691 - if (substr($option_val['color'], 0, 1) == '#') {
692 - $color_string = substr($option_val['color'],1);
693 - }
694 - else {
695 - $color_string = $option_val['color'];
696 - }
697 - $rgb_str_array = [];
698 - if (strlen($color_string)==3) {
699 - $rgb_str_array[] = substr($color_string, 0, 1).substr($color_string, 0, 1);
700 - $rgb_str_array[] = substr($color_string, 1, 1).substr($color_string, 1, 1);
701 - $rgb_str_array[] = substr($color_string, 2, 1).substr($color_string, 2, 1);
702 - }
703 - else {
704 - $rgb_str_array[] = substr($color_string, 0, 2);
705 - $rgb_str_array[] = substr($color_string, 2, 2);
706 - $rgb_str_array[] = substr($color_string, 4, 2);
707 - }
708 - $rgb_array = [];
709 - $rgb_array[] = hexdec($rgb_str_array[0]);
710 - $rgb_array[] = hexdec($rgb_str_array[1]);
711 - $rgb_array[] = hexdec($rgb_str_array[2]);
712 - $rgb_string = implode(',',$rgb_array);
713 - $rgb_string = ' rgb('.$rgb_string.') ';
714 -
715 - if (isset($option_val['trans'])) {
716 - $bg_rgba_string = $bg_string;
717 - $transparency = (int)$option_val['trans'];
718 - if ($transparency != 0) {
719 - $trans_dec = $transparency/100;
720 - $rgba_string = implode(',', $rgb_array);
721 - $rgba_string = ' rgba('.$rgba_string.','.$trans_dec.') ';
722 - $bg_rgba_string .= $rgba_string;
723 - }
724 - }
725 -
726 - $bg_string .= $rgb_string;
727 - }
728 - }
729 - if (isset($option_val['image']) && trim($option_val['image']) != '') {
730 - $bg_string .= " url(".$option_val['image'].") ";
731 - $bg_string .= $option_val['position']." ".$option_val['repeat'];
732 -
733 - if (trim($bg_rgba_string) != '') {
734 - $bg_rgba_string .= " url(".$option_val['image'].") ";
735 - $bg_rgba_string .= $option_val['position']." ".$option_val['repeat'];
736 - }
737 - }
738 -
739 - if (trim($bg_string) != '') {
740 - $bg_string = "background: ".$bg_string." !important;\n";
741 - if (trim($bg_rgba_string) != '') {
742 - $bg_string .= "\tbackground: ".$bg_rgba_string." !important;\n";
743 - }
744 - }
745 - return $bg_string;
673 + public function get_gallery_images(array $attr): string {
674 + require_once PHOTONIC_PATH . '/Core/Front_End.php';
675 + return Front_End::get_instance()->get_gallery_images($attr);
746 676 }
747 677
748 678 /**
749 - * Generates the CSS for borders. Each border, top, right, bottom and left is generated as a separate line.
750 - *
751 - * @param $option
752 - * @return string
753 - */
754 - function get_border_css($option) {
755 - global ${$option};
756 - $option_val = ${$option};
757 - if (!is_array($option_val)) {
758 - $option_val = stripslashes($option_val);
759 - $edge_array = $this->build_edge_array($option_val);
760 - $option_val = $edge_array;
761 - }
762 - $border_string = '';
763 - foreach ($option_val as $edge => $selections) {
764 - $border_string .= "\tborder-$edge: ";
765 - if (!isset($selections['style'])) {
766 - $selections['style'] = 'none';
767 - }
768 - if ($selections['style'] == 'none') {
769 - $border_string .= "none";
770 - }
771 - else {
772 - if (isset($selections['border-width'])) {
773 - $border_string .= $selections['border-width'];
774 - }
775 - if (isset($selections['border-width-type'])) {
776 - $border_string .= $selections['border-width-type'];
777 - }
778 - else {
779 - $border_string .= "px";
780 - }
781 - $border_string .= " ".$selections['style']." ";
782 - if ($selections['colortype'] == 'transparent') {
783 - $border_string .= "transparent";
784 - }
785 - else {
786 - if (substr($selections['color'], 0, 1) == '#') {
787 - $border_string .= $selections['color'];
788 - }
789 - else {
790 - $border_string .= '#'.$selections['color'];
791 - }
792 - }
793 - }
794 - $border_string .= ";\n";
795 - }
796 - return "\n".$border_string;
797 - }
798 -
799 - public function build_edge_array($option_val) {
800 - $edge_array = [];
801 - $edges = explode('||', $option_val);
802 - foreach ($edges as $edge_val) {
803 - if (trim($edge_val) != '') {
804 - $edge_options = explode('::', trim($edge_val));
805 - if (is_array($edge_options) && count($edge_options) > 1) {
806 - $val_array = [];
807 - $vals = explode(';', $edge_options[1]);
808 - foreach ($vals as $val) {
809 - $pair = explode('=', $val);
810 - if (is_array($pair) && count($pair) > 1) {
811 - $val_array[$pair[0]] = $pair[1];
812 - }
813 - }
814 - $edge_array[$edge_options[0]] = $val_array;
815 - }
816 - }
817 - }
818 - return $edge_array;
819 - }
820 -
821 - /**
822 679 * Make an HTTP request
823 680 *
824 681 * @static
825 - * @param $url
826 - * @param string $method GET | POST | DELETE
827 - * @param null $post_fields
828 - * @param string $user_agent
829 - * @param int $timeout
830 - * @param bool $ssl_verify_peer
831 - * @param array $headers
832 - * @param array $cookies
682 + * @param string $url
683 + * @param string $method GET | POST.
684 + * @param array|null $post_fields
685 + * @param string|null $user_agent
686 + * @param int $timeout
687 + * @param bool $ssl_verify_peer
688 + * @param array $headers
689 + * @param array $cookies
833 690 * @return array|WP_Error
834 691 */
835 - static function http($url, $method = 'POST', $post_fields = NULL, $user_agent = null, $timeout = 90, $ssl_verify_peer = false, $headers = [], $cookies = []) {
692 + public static function http(string $url, string $method = 'POST', ?array $post_fields = null, ?string $user_agent = null, int $timeout = 90, bool $ssl_verify_peer = false, array $headers = [], array $cookies = []) {
836 693 $curl_args = [
837 694 'user-agent' => $user_agent,
838 - 'timeout' => $timeout,
839 - 'sslverify' => $ssl_verify_peer,
840 - 'headers' => array_merge(['Expect:'], $headers),
841 - 'method' => $method,
842 - 'body' => $post_fields,
843 - 'cookies' => $cookies,
695 + 'timeout' => $timeout,
696 + 'sslverify' => $ssl_verify_peer,
697 + 'headers' => array_merge(['Expect:'], $headers),
698 + 'method' => $method,
699 + 'body' => $post_fields,
700 + 'cookies' => $cookies,
844 701 ];
845 702
846 - switch ($method) {
847 - case 'DELETE':
848 - if (!empty($post_fields)) {
849 - $url = "{$url}?{$post_fields}";
850 - }
851 - break;
852 - }
853 -
854 - $response = wp_remote_request($url, $curl_args);
855 - return $response;
703 + return wp_remote_request($url, $curl_args);
856 704 }
857 705
858 - function obtain_token() {
859 - require_once(PHOTONIC_PATH."/Admin/Authentication.php");
860 - $auth = Authentication::get_instance();
861 - $auth->obtain_token();
862 - die();
706 + public function enable_translations() {
707 + load_plugin_textdomain('photonic');
863 708 }
864 709
865 710 /**
866 - * Invoked via AJAX in the "Authentication" page, when the user clicks on "Save Token"
867 - */
868 - function save_token_in_options() {
869 - $provider = strtolower(sanitize_text_field($_POST['provider']));
870 - $token = esc_attr($_POST['token']);
871 - $secret = esc_attr($_POST['secret']);
872 - if (!empty($_POST['expires_in'])) {
873 - $expires_in = esc_attr($_POST['expires_in']);
874 - }
875 -
876 - $options = get_option('photonic_options');
877 - if (empty($options)) {
878 - $options = [];
879 - }
880 - $option_set = false;
881 - if (in_array($provider, ['flickr', 'smug', 'zenfolio'])) {
882 - $options[$provider.'_access_token'] = $token;
883 - $options[$provider.'_token_secret'] = $secret;
884 - $option_set = true;
885 - }
886 - else if (in_array($provider, ['google'])) {
887 - $options[$provider.'_refresh_token'] = $token;
888 - $option_set = true;
889 - }
890 - else if (in_array($provider, ['instagram'])) {
891 - $client_id = esc_attr($_POST['client_id']);
892 - $user = esc_attr($_POST['user']);
893 -
894 - $options[$provider.'_access_token'] = $token;
895 -
896 - $auth_token = [];
897 - $auth_token['oauth_token'] = $token;
898 - $auth_token['oauth_token_created'] = time();
899 - if (!empty($expires_in)) {
900 - $auth_token['oauth_token_expires'] = $expires_in;
901 - }
902 - $auth_token['client_id'] = $client_id;
903 - $auth_token['user'] = $user;
904 -
905 - self::save_provider_authentication($provider, $auth_token);
906 -
907 - $option_set = true;
908 - }
909 -
910 - if ($option_set) {
911 - update_option('photonic_options', $options);
912 - echo admin_url('admin.php?page=photonic-options-manager&tab='.$this->provider_map[$provider].'.php');
913 - }
914 - die();
915 - }
916 -
917 - function delete_token_from_options() {
918 - $provider = strtolower(sanitize_text_field($_POST['provider']));
919 - $photonic_authentication = get_option('photonic_authentication');
920 - if ($provider == 'zenfolio') {
921 - if (isset($photonic_authentication[$provider])) {
922 - unset($photonic_authentication[$provider]);
923 - }
924 - }
925 - update_option('photonic_authentication', $photonic_authentication);
926 - die();
927 - }
928 -
929 - function invoke_helper() {
930 - require_once(PHOTONIC_PATH."/Admin/Helper.php");
931 - $helper = new Helper();
932 - $helper->invoke_helper();
933 - }
934 -
935 - /**
936 - * @return array
937 - */
938 - public function get_localized_js_variables() {
939 - global $photonic_lightbox_no_loop, $photonic_slideshow_mode, $photonic_slideshow_interval, $photonic_slideshow_library, $photonic_custom_lightbox,
940 - $photonic_cb_transition_effect, $photonic_cb_transition_speed,
941 - $photonic_fbox_title_position, $photonic_fb3_transition_effect, $photonic_fb3_transition_speed, $photonic_fb3_show_fullscreen, $photonic_enable_fb3_fullscreen,
942 - $photonic_fb3_hide_thumbs, $photonic_enable_fb3_thumbnail, $photonic_fb3_disable_zoom, $photonic_fb3_disable_slideshow, $photonic_fb3_enable_download, $photonic_fb3_disable_right_click,
943 - $photonic_lc_transition_effect, $photonic_lc_transition_speed_in, $photonic_lc_transition_speed_out, $photonic_lc_enable_shrink,
944 - $photonic_lg_transition_effect, $photonic_lg_transition_speed, $photonic_disable_lg_download, $photonic_lg_hide_bars_delay,
945 - $photonic_tile_spacing, $photonic_tile_min_height, $photonic_pphoto_theme, $photonic_pp_animation_speed,
946 - $photonic_enable_swipebox_mobile_bars, $photonic_sb_hide_mobile_close, $photonic_sb_hide_bars_delay,
947 - $photonic_lightbox_for_all, $photonic_lightbox_for_videos, $photonic_popup_panel_width, $photonic_deep_linking, $photonic_social_media,
948 - $photonic_slideshow_prevent_autostart, $photonic_wp_slide_adjustment, $photonic_masonry_min_width, $photonic_mosaic_trigger_width,
949 - $photonic_is_IE, $photonic_debug_on;
950 -
951 - global $photonic_js_variables;
952 -
953 - $slideshow_library = $photonic_slideshow_library == 'custom' ? $photonic_custom_lightbox : $photonic_slideshow_library;
954 - $js_array = [
955 - 'ajaxurl' => admin_url('admin-ajax.php'),
956 - 'plugin_url' => PHOTONIC_URL,
957 - 'is_old_IE' => $photonic_is_IE,
958 - 'debug_on' => !empty($photonic_debug_on),
959 -
960 - 'fbox_show_title' => $photonic_fbox_title_position == 'none' ? false : true,
961 - 'fbox_title_position' => $photonic_fbox_title_position == 'none' ? 'outside' : $photonic_fbox_title_position,
962 -
963 - 'slide_adjustment' => empty($photonic_wp_slide_adjustment) ? 'adapt-height-width' : $photonic_wp_slide_adjustment,
964 -
965 - 'deep_linking' => isset($photonic_deep_linking) ? $photonic_deep_linking : 'none',
966 - 'social_media' => isset($photonic_deep_linking) ? $photonic_deep_linking != 'none' && empty($photonic_social_media) : '',
967 -
968 - 'slideshow_library' => $slideshow_library,
969 - 'tile_spacing' => (empty($photonic_tile_spacing) || !absint($photonic_tile_spacing)) ? 0 : absint($photonic_tile_spacing),
970 - 'tile_min_height' => (empty($photonic_tile_min_height) || !absint($photonic_tile_min_height)) ? 200 : absint($photonic_tile_min_height),
971 - 'masonry_min_width' => (empty($photonic_masonry_min_width) || !absint($photonic_masonry_min_width)) ? 200 : absint($photonic_masonry_min_width),
972 - 'mosaic_trigger_width' => (empty($photonic_mosaic_trigger_width) || !absint($photonic_mosaic_trigger_width)) ? 200 : absint($photonic_mosaic_trigger_width),
973 -
974 - 'slideshow_mode' => (isset($photonic_slideshow_mode) && $photonic_slideshow_mode == 'on') ? true : false,
975 - 'slideshow_interval' => (isset($photonic_slideshow_interval) && absint($photonic_slideshow_interval)) ? absint($photonic_slideshow_interval) : 5000,
976 - 'lightbox_loop' => empty($photonic_lightbox_no_loop),
977 -
978 - 'gallery_panel_width' => (empty($photonic_popup_panel_width) || !absint($photonic_popup_panel_width) || absint($photonic_popup_panel_width) > 100) ? 80 : absint($photonic_popup_panel_width),
979 -
980 - 'cb_transition_effect' => empty($photonic_cb_transition_effect) ? 'elastic' : $photonic_cb_transition_effect,
981 - 'cb_transition_speed' => (isset($photonic_cb_transition_speed) && absint($photonic_cb_transition_speed)) ? absint($photonic_cb_transition_speed) : 350,
982 -
983 - 'fb3_transition_effect' => empty($photonic_fb3_transition_effect) ? 'zoom' : $photonic_fb3_transition_effect,
984 - 'fb3_transition_speed' => (isset($photonic_fb3_transition_speed) && absint($photonic_fb3_transition_speed)) ? absint($photonic_fb3_transition_speed) : 366,
985 - 'fb3_fullscreen_button' => !empty($photonic_fb3_show_fullscreen),
986 - 'fb3_fullscreen' => isset($photonic_enable_fb3_fullscreen) && $photonic_enable_fb3_fullscreen == 'on' ? true : false,
987 - 'fb3_thumbs_button' => empty($photonic_fb3_hide_thumbs),
988 - 'fb3_thumbs' => isset($photonic_enable_fb3_thumbnail) && $photonic_enable_fb3_thumbnail == 'on' ? true : false,
989 - 'fb3_zoom' => empty($photonic_fb3_disable_zoom),
990 - 'fb3_slideshow' => empty($photonic_fb3_disable_slideshow),
991 - 'fb3_download' => !empty($photonic_fb3_enable_download),
992 - 'fb3_disable_right_click' => !empty($photonic_fb3_disable_right_click),
993 -
994 - 'lc_transition_effect' => empty($photonic_lc_transition_effect) ? 'scrollHorizontal' : $photonic_lc_transition_effect,
995 - 'lc_transition_speed_in' => (isset($photonic_lc_transition_speed_in) && absint($photonic_lc_transition_speed_in)) ? absint($photonic_lc_transition_speed_in) : 350,
996 - 'lc_transition_speed_out' => (isset($photonic_lc_transition_speed_out) && absint($photonic_lc_transition_speed_out)) ? absint($photonic_lc_transition_speed_out) : 250,
997 - 'lc_disable_shrink' => empty($photonic_lc_enable_shrink),
998 -
999 - 'lg_transition_effect' => empty($photonic_lg_transition_effect) ? 'lg-slide' : $photonic_lg_transition_effect,
1000 - 'lg_enable_download' => empty($photonic_disable_lg_download),
1001 - 'lg_hide_bars_delay' => (isset($photonic_lg_hide_bars_delay) && absint($photonic_lg_hide_bars_delay)) ? absint($photonic_lg_hide_bars_delay) : 6000,
1002 - 'lg_transition_speed' => (isset($photonic_lg_transition_speed) && absint($photonic_lg_transition_speed)) ? absint($photonic_lg_transition_speed) : 600,
1003 -
1004 - 'pphoto_theme' => isset($photonic_pphoto_theme) ? $photonic_pphoto_theme : 'pp_default',
1005 - 'pphoto_animation_speed' => empty($photonic_pp_animation_speed) ? 'fast' : $photonic_pp_animation_speed,
1006 -
1007 - 'enable_swipebox_mobile_bars' => !empty($photonic_enable_swipebox_mobile_bars),
1008 - 'sb_hide_mobile_close' => !empty($photonic_sb_hide_mobile_close),
1009 - 'sb_hide_bars_delay' => (isset($photonic_sb_hide_bars_delay) && absint($photonic_sb_hide_bars_delay)) ? absint($photonic_sb_hide_bars_delay) : 0,
1010 -
1011 - 'lightbox_for_all' => !empty($photonic_lightbox_for_all),
1012 - 'lightbox_for_videos' => !empty($photonic_lightbox_for_videos),
1013 -
1014 - 'slideshow_autostart' => !(isset($photonic_slideshow_prevent_autostart) && $photonic_slideshow_prevent_autostart == 'on'),
1015 -
1016 - 'password_failed' => esc_attr__('This album is password-protected. Please provide a valid password.', 'photonic'),
1017 - 'incorrect_password' => esc_attr__('Incorrect password.', 'photonic'),
1018 - 'maximize_panel' => esc_attr__('Show', 'photonic'),
1019 - 'minimize_panel' => esc_attr__('Hide', 'photonic'),
1020 - ];
1021 - $photonic_js_variables = $js_array;
1022 - return $js_array;
1023 - }
1024 -
1025 - function enable_translations() {
1026 - load_plugin_textdomain('photonic', FALSE, FALSE);
1027 - }
1028 -
1029 - function load_more() {
1030 - $provider = esc_attr($_POST['provider']);
1031 - $query = sanitize_text_field($_POST['query']);
1032 - $attr = wp_parse_args($query);
1033 -
1034 - $attr['type'] = $provider;
1035 - if ($provider == 'flickr') {
1036 - $attr['page'] = isset($attr['page']) ? $attr['page'] + 1 : 0;
1037 - }
1038 - else if ($provider == 'google') {
1039 - }
1040 - else if ($provider == 'smug') {
1041 - $attr['start'] = $attr['start'] + $attr['count'];
1042 - }
1043 - else if ($provider == 'zenfolio') {
1044 - $attr['offset'] = $attr['offset'] + $attr['limit'];
1045 - }
1046 - else if ($provider == 'instagram') {
1047 - }
1048 - else if ($provider == 'wp') {
1049 - $attr['page'] = $attr['page'] + 1;
1050 - }
1051 - else {
1052 - unset($attr['type']);
1053 - }
1054 -
1055 - if (!empty($attr['type'])) {
1056 - $gallery = new Gallery($attr);
1057 - echo $gallery->get_contents();
1058 - }
1059 - die();
1060 - }
1061 -
1062 - function helper_shortcode_more() {
1063 - if (!empty($_POST['provider'])) {
1064 - $provider = sanitize_text_field($_POST['provider']);
1065 - if (in_array($provider, ['google'])) {
1066 - $attr = ['type' => $provider];
1067 - if ($provider == 'google') {
1068 - $attr['nextPageToken'] = sanitize_text_field($_POST['nextPageToken']);
1069 - $gallery = new Gallery($attr);
1070 - echo $gallery->get_helper_contents();
1071 - }
1072 - }
1073 - }
1074 - die();
1075 - }
1076 -
1077 - /**
1078 711 * @param string|array $classes
1079 712 * @return array
1080 713 */
1081 - function body_class($classes = []) {
714 + public function body_class($classes = []) {
1082 715 if (!is_array($classes)) {
1083 716 $classes = explode(' ', $classes);
1084 717 }
1085 718
1086 - global $photonic_is_IE;
1087 - if ($photonic_is_IE) {
1088 - $classes[] = 'photonic-ie';
1089 - }
1090 -
1091 719 return $classes;
1092 720 }
1093 721
1094 722 /**
@@ -1094,22 +722,22 @@
1094 722 /**
1095 723 * Used for handling the front-end for Gutenberg blocks
1096 724 *
1097 725 * @param $attributes
1098 - * @return array|bool|string
726 + * @return string
1099 727 */
1100 - function render_block($attributes) {
728 + public function render_block($attributes): string {
1101 729 if (!empty($attributes['shortcode'])) {
1102 - $shortcode = (array)(json_decode($attributes['shortcode']));
730 + $shortcode = (array) (json_decode($attributes['shortcode']));
1103 731
1104 732 if (!empty($attributes['align'])) {
1105 - $shortcode['alignment'] = $attributes['align'];
733 + $shortcode['alignment'] = esc_attr($attributes['align']);
1106 734 }
1107 735 if (!empty($attributes['className'])) {
1108 - $shortcode['custom_classes'] = $attributes['className'];
736 + $shortcode['custom_classes'] = esc_attr($attributes['className']);
1109 737 }
1110 738
1111 - $this->conditionally_add_scripts($shortcode);
739 + $this->conditionally_add_scripts();
1112 740 return $this->get_gallery_images($shortcode);
1113 741 }
1114 742 return '';
1115 743 }
@@ -1115,11 +743,12 @@
1115 743 }
1116 744
1117 745 private function add_gutenberg_support() {
1118 746 if (function_exists('register_block_type')) {
1119 - register_block_type('photonic/gallery',
747 + register_block_type(
748 + 'photonic/gallery',
1120 749 [
1121 - 'attributes' => [
750 + 'attributes' => [
1122 751 'shortcode' => [
1123 752 'type' => 'string',
1124 753 ],
1125 754 ],
@@ -1128,87 +757,82 @@
1128 757 );
1129 758 }
1130 759 }
1131 760
1132 - function dismiss_warning() {
1133 - $user_id = get_current_user_id();
1134 - $response = [];
1135 - if (!empty($_POST['dismissible'])) {
1136 - add_user_meta( $user_id, "photonic_".esc_sql($_POST['dismissible']), 'true', true );
1137 - $response[$_POST['dismissible']] = 'true';
1138 - }
1139 - echo json_encode($response);
1140 - die();
761 + public function curl_timeout($handle) {
762 + // Forcing phpcs:ignore here, since the explicit purpose is to change cURL's timeout.
763 + curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, PHOTONIC_CURL_TIMEOUT); // phpcs:ignore WordPress.WP.AlternativeFunctions
764 + curl_setopt($handle, CURLOPT_TIMEOUT, max(PHOTONIC_CURL_TIMEOUT, 30)); // phpcs:ignore WordPress.WP.AlternativeFunctions
1141 765 }
1142 766
1143 - function curl_timeout($handle) {
1144 - curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, PHOTONIC_CURL_TIMEOUT);
1145 - curl_setopt($handle, CURLOPT_TIMEOUT, PHOTONIC_CURL_TIMEOUT);
1146 - }
1147 -
1148 - static function log($element) {
767 + public static function log($element) {
1149 768 if (PHOTONIC_DEBUG) {
1150 - print_r($element);
769 + echo wp_kses($element, self::$safe_tags);
1151 770 }
1152 771 }
1153 772
1154 - static function doc_link($link) {
1155 - return ' '.sprintf(esc_html__('See %1$shere%2$s for documentation.', 'photonic'), "<a href='$link'>", '</a>');
773 + /**
774 + * @param $link
775 + * @return string
776 + */
777 + public static function doc_link($link): string {
778 + return ' ' . sprintf(esc_html__('See %1$shere%2$s for documentation.', 'photonic'), "<a href='$link'>", '</a>');
1156 779 }
1157 780
1158 - function get_show_gallery_button($attr = []) {
1159 - $button = esc_attr($attr['show_gallery']);
1160 - $button_attr = [];
781 + public function load_widget() {
782 + require_once PHOTONIC_PATH . '/Add_Ons/WP/Widget.php';
783 + register_widget("Photonic_Plugin\Add_Ons\WP\Widget");
784 + }
1161 785
1162 - if (!empty($attr['show_gallery_button_type']) && $attr['show_gallery_button_type'] == 'image' && !empty($attr['show_gallery_button_image'])) {
1163 - $button_attr['type'] = 'image';
1164 - $button_attr['alt'] = $button;
1165 - $button_attr['src'] = esc_url($attr['show_gallery_button_image']);
786 + public function load_beaver() {
787 + require_once PHOTONIC_PATH . '/Add_Ons/Beaver/Beaver_Module.php';
788 + if (class_exists('\FLBuilderModel') && \FLBuilderModel::is_builder_active()) {
789 + $this->enqueue_widget_scripts();
1166 790 }
1167 - else {
1168 - $button_attr['type'] = 'button';
1169 - $button_attr['value'] = $button;
1170 - }
1171 - $button_attr['class'] = 'photonic-show-gallery-button';
1172 -
1173 - unset($attr['show_gallery']);
1174 - unset($attr['show_gallery_button_type']);
1175 - unset($attr['show_gallery_button_image']);
1176 -
1177 - $attr_str = http_build_query($attr);
1178 - $button_attr['data-photonic-shortcode'] = $attr_str;
1179 -
1180 - $input_attr = [];
1181 - foreach ($button_attr as $name => $value) {
1182 - $input_attr[] = "$name='$value'";
1183 - }
1184 - $input_attr = implode(' ', $input_attr);
1185 -
1186 - return "<input $input_attr/>";
1187 791 }
1188 792
1189 - function lazy_load() {
1190 - $shortcode = $_POST['shortcode'];
1191 - parse_str($shortcode, $attr);
1192 - $images = $this->get_gallery_images($attr);
1193 - echo $images;
1194 - die();
793 + public static function enqueue_widget_scripts() {
794 + global $photonic_alternative_shortcode;
795 + $js_array = [
796 + 'ajaxurl' => admin_url('admin-ajax.php'),
797 + 'shortcode' => esc_js($photonic_alternative_shortcode ?: 'gallery'),
798 + 'current_shortcode' => esc_html__('Current shortcode', 'photonic'),
799 + 'edit_message' => esc_html__('Click on the icon to edit your gallery.', 'photonic'),
800 + ];
801 + wp_enqueue_script('photonic-native-ui', PHOTONIC_URL . 'include/js/admin/native-ui.js', ['shortcode', 'thickbox'], self::get_version(PHOTONIC_PATH . '/include/js/admin/native-ui.js'), false);
802 + wp_enqueue_script('photonic-widget', PHOTONIC_URL . 'include/js/admin/widget.js', ['photonic-native-ui'], self::get_version(PHOTONIC_PATH . '/include/js/admin/widget.js'), true);
803 + wp_localize_script('photonic-widget', 'Photonic_Widget_JS', $js_array);
804 + wp_enqueue_style('photonic-widget', PHOTONIC_URL . 'include/css/admin/widget.css', [], self::get_version(PHOTONIC_PATH . '/include/css/admin/widget.css'));
1195 805 }
1196 806
1197 - function load_widget() {
1198 - require_once(PHOTONIC_PATH. '/Add_Ons/WP/Widget.php');
1199 - register_widget("Photonic_Plugin\Add_Ons\WP\Widget");
807 + /**
808 + * Custom style attributes, primarily required for the Justified Grid layout. Since <code>wp_kses_post</code> strips out tags that it doesn't recognize, we have this.
809 + *
810 + * @param $styles
811 + * @return mixed
812 + */
813 + public function safe_styles($styles) {
814 + $styles[] = '--dw';
815 + $styles[] = '--dh';
816 + $styles[] = '--tile-min-height';
817 + $styles[] = 'display';
818 + return $styles;
1200 819 }
1201 820
1202 - static function enqueue_widget_scripts() {
1203 - global $photonic_alternative_shortcode;
1204 - $js_array = [
1205 - 'ajaxurl' => admin_url('admin-ajax.php'),
1206 - 'shortcode' => empty($photonic_alternative_shortcode) ? 'gallery' : $photonic_alternative_shortcode,
1207 - 'current_shortcode' => esc_html__('Current shortcode', 'photonic'),
1208 - 'edit_message' => esc_html__('Click on the icon to edit your gallery.', 'photonic'),
1209 - ];
1210 - wp_enqueue_script('photonic-widget', PHOTONIC_URL.'include/scripts/admin/widget.js', ['jquery'], Photonic::get_version(PHOTONIC_PATH.'/include/scripts/admin/widget.js'));
1211 - wp_localize_script('photonic-widget', 'Photonic_Widget_JS', $js_array);
1212 - wp_enqueue_style('photonic-widget', PHOTONIC_URL.'include/css/admin/widget.css', [], Photonic::get_version(PHOTONIC_PATH.'/include/css/admin/widget.css'));
821 + public static function get_lightgallery_plugins(): array {
822 + global $photonic_enable_lg_zoom, $photonic_enable_lg_thumbnail, $photonic_enable_lg_fullscreen, $photonic_enable_lg_autoplay;
823 + $lightgallery_plugins = [];
824 + if (!empty($photonic_enable_lg_autoplay)) {
825 + $lightgallery_plugins[] = 'autoplay';
826 + }
827 + if (!empty($photonic_enable_lg_fullscreen)) {
828 + $lightgallery_plugins[] = 'fullscreen';
829 + }
830 + if (!empty($photonic_enable_lg_thumbnail)) {
831 + $lightgallery_plugins[] = 'thumbnail';
832 + }
833 + if (!empty($photonic_enable_lg_zoom)) {
834 + $lightgallery_plugins[] = 'zoom';
835 + }
836 + return $lightgallery_plugins;
1213 837 }
1214 838 }