PluginProbe ʕ •ᴥ•ʔ
Gallery : FooGallery / 3.3.0
Gallery : FooGallery v3.3.0
3.3.0 3.1.31 3.1.32 3.1.34 3.1.36 3.2.0 3.2.6 trunk 1.10.3 2.0.24 2.1.34 2.2.44 2.3.3 2.4.32 3.0.6 3.1.11 3.1.12 3.1.13 3.1.20 3.1.25 3.1.26 3.1.26.1 3.1.26.2
foogallery / includes / extensions / class-extensions-api.php
foogallery / includes / extensions Last commit date
class-extension.php 1 week ago class-extensions-api.php 1 week ago class-extensions-loader.php 1 week ago
class-extensions-api.php
732 lines
1 <?php
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit;
5 }
6
7 /**
8 * @TODO
9 */
10
11 if ( ! class_exists( 'FooGallery_Extensions_API' ) ) {
12
13 define( 'FOOGALLERY_EXTENSIONS_MESSAGE_TRANSIENT_KEY', 'foogallery_extensions_message' );
14 define( 'FOOGALLERY_EXTENSIONS_ACTIVATED_OPTIONS_KEY', 'foogallery_extensions_activated' );
15 define( 'FOOGALLERY_EXTENSIONS_ERRORS_OPTIONS_KEY', 'foogallery_extensions_errors' );
16 define( 'FOOGALLERY_EXTENSIONS_AUTO_ACTIVATED_OPTIONS_KEY', 'foogallery_extensions_auto_activated' );
17 define( 'FOOGALLERY_EXTENSIONS_OVERRIDES_OPTIONS_KEY', 'foogallery_extensions_overrides' );
18
19 /**
20 * FooGallery Extensions Manager Class
21 * Class FooGallery_Extensions_API
22 */
23 class FooGallery_Extensions_API {
24
25 /**
26 * Internal list of all extensions
27 * @var array
28 */
29 private $extensions = false;
30
31 /**
32 * Internal list of all extension slugs
33 * @var array
34 */
35 private $extension_slugs = false;
36
37 /**
38 * Extension API constructor
39 * @param bool $load
40 */
41 function __construct( $load = false ) {
42 if ( $load ) {
43 $this->load_available_extensions();
44 }
45 }
46
47 /**
48 * Reset all previous errors
49 */
50 public function reset_errors() {
51 //delete_option( FOOGALLERY_EXTENSIONS_LOADING_ERRORS );
52 //delete_option( FOOGALLERY_EXTENSIONS_LOADING_ERRORS_RESPONSE );
53 }
54
55 /**
56 * Load all available extensions
57 */
58 private function load_available_extensions() {
59 $this->extensions = array();
60
61 $this->extensions[] = array(
62 'slug' => 'albums',
63 'class' => 'FooGallery_Albums_Extension',
64 'title' => 'Albums',
65 'categories' => array( 'Featured', 'Free' ),
66 'description' => foogallery__( 'Group your galleries into albums. Albums comes with 2 unique album templates to showcase your galleries.', 'foogallery' ),
67 'external_link_text' => foogallery__( 'Read documentation', 'foogallery' ),
68 'external_link_url' => 'https://fooplugins.com/documentation/foogallery/getting-started-foogallery/adding-albums/',
69 'dashicon' => 'dashicons-book-alt',
70 'tags' => array( 'functionality', 'free', ),
71 'source' => 'bundled'
72 );
73
74 // The FooGallery Migrate feature.
75 $this->extensions[] = array(
76 'slug' => 'foogallery-migrate',
77 'class' => 'FooGallery_Migrate_Dummy',
78 'categories' => array( 'Free' ),
79 'title' => 'FooGallery Migrate',
80 'file' => 'migrate.php',
81 'description' => foogallery__( 'Migrate to FooGallery from other gallery plugins', 'foogallery' ),
82 'external_link_text' => foogallery__( 'Read about FooGallery Migrate', 'foogallery' ),
83 'external_link_url' => 'https://fooplugins.com/foogallery-migrate-for-wordpress-galleries/',
84 'dashicon' => 'dashicons-migrate',
85 'tags' => array( 'tools', 'free', ),
86 'source' => 'repo',
87 'download_link' => 'https://downloads.wordpress.org/plugin/foogallery-migrate.latest-stable.zip',
88 );
89 }
90
91 /**
92 * Get all loaded extensions
93 * @return array
94 */
95 function get_all() {
96
97 //check if we need to load
98 if ( false === $this->extensions ) {
99 $this->load_available_extensions();
100 }
101
102 //get any extra extensions from plugins
103 $extra_extensions = apply_filters( 'foogallery_available_extensions', array() );
104
105 if ( count( $extra_extensions ) > 0 ) {
106 //get a list of slugs so we can determine duplicates!
107 $this->extension_slugs = array();
108 foreach ( $this->extensions as $extension ) {
109 $this->extension_slugs[] = $extension['slug'];
110 }
111
112 //only add if not a duplicate
113 foreach ( $extra_extensions as $extension ) {
114 if ( ! in_array( $extension['slug'], $this->extension_slugs ) ) {
115 $this->extensions[] = $extension;
116 $this->extension_slugs[] = $extension['slug'];
117 }
118 }
119 }
120
121 return $this->extensions;
122 }
123
124
125 /**
126 * return a list of all extensions for the extension view.
127 * This list could be changed based on other plugin
128 */
129 function get_all_for_view() {
130 $extensions = array();
131
132 //add all extensions to an array using the slug as the array key
133 foreach ( $this->get_all() as &$extension ) {
134 $active = $this->is_active( $extension['slug'], true );
135 $extension['downloaded'] = $active || $this->is_downloaded( $extension );
136 $extension['is_active'] = $active;
137 $extension['has_errors'] = $this->has_errors( $extension['slug'] );
138
139 $extensions[ $extension['slug'] ] = $extension;
140 }
141
142 $extensions = apply_filters( 'foogallery_extensions_for_view', $extensions );
143
144 return $extensions;
145 }
146 /**
147 * Get all loaded extensions slugs
148 * @return array
149 */
150 function get_all_slugs() {
151 //load all extensions first!
152 $this->get_all();
153
154 return $this->extension_slugs;
155 }
156
157 /**
158 * @TODO
159 * @param $slug
160 *
161 * @return bool
162 */
163 public function get_extension( $slug ) {
164 foreach ( $this->get_all() as $extension ) {
165 if ( $extension['slug'] === $slug ) {
166 return $extension;
167 }
168 }
169 return false;
170 }
171
172 /**
173 * @TODO
174 * @param $file
175 *
176 * @return bool
177 */
178 public function get_extension_by_file( $file ) {
179 $file = basename( $file ); //normalize to just the filename
180
181 foreach ( $this->get_all() as $extension ) {
182 if ( foo_safe_get( $extension, 'file' ) === $file ) {
183 return $extension;
184 }
185 }
186 return false;
187 }
188
189 /**
190 * @TODO
191 * @param $slug
192 *
193 * @return bool
194 */
195 public function is_active( $slug ) {
196 $overrides = $this->get_overrides();
197 if ( array_key_exists( $slug, $overrides ) ) {
198 return $overrides[$slug] === 'active';
199 }
200
201 $active_extensions = $this->get_active_extensions();
202 if ( array_key_exists( $slug, $active_extensions ) ) {
203 //it has been previously activated through the extensions page
204 return true;
205 }
206
207 $extension = $this->get_extension( $slug );
208
209 //if we have an 'plugin_active_class' attribute and that class exists, it means our plugin must be active
210 if ( isset( $extension['plugin_active_class'] ) ) {
211 if ( class_exists( $extension['plugin_active_class'] ) ) {
212 return true;
213 }
214 }
215
216 //if we have an 'activated_by_default' attribute and it is true, it means the extension is active
217 if ( isset( $extension['activated_by_default'] ) && $extension['activated_by_default'] ) {
218 return true;
219 }
220
221 //if we cannot find the extension class in memory, then check to see if the extension plugin is activated
222 if ( isset( $extension['perform_plugin_active_check'] ) && true === $extension['perform_plugin_active_check'] &&
223 isset( $extension['file'] ) ) {
224 $plugin = $this->find_active_wordpress_plugin( $extension );
225
226 return $plugin !== false;
227 }
228
229 return false;
230 }
231
232 /**
233 * @TODO
234 *
235 * @param bool $extension
236 *
237 * @param bool $slug
238 *
239 * @return bool
240 */
241 public function is_downloaded( $extension = false, $slug = false ) {
242 //allow you to pass in a slug rather
243 if ( ! $extension && $slug !== false ) {
244 $extension = $this->get_extension( $slug );
245 }
246 if ( $extension ) {
247 //first check if the class exists
248 if ( class_exists( $extension['class'] ) ) {
249 return true;
250 }
251
252 //next fallback to see if a plugin exists that has the same file name
253 $plugin = $this->find_wordpress_plugin( $extension );
254 return false !== $plugin;
255 }
256 return false;
257 }
258
259 /**
260 * @TODO
261 * @param $slug
262 *
263 * @return bool
264 */
265 public function has_errors( $slug ) {
266 $error_extensions = $this->get_error_extensions();
267
268 if ( $error_extensions ) {
269 return array_key_exists( $slug, $error_extensions );
270 }
271 return false;
272 }
273
274 /**
275 * @TODO
276 * @param $plugin
277 */
278 public function handle_wordpress_plugin_deactivation( $plugin ) {
279 $extension = $this->get_extension_by_file( $plugin );
280 if ( $extension ) {
281 //we have found a matching extension
282 $this->deactivate( $extension['slug'], false );
283 }
284 }
285
286 /**
287 * @TODO
288 * @param $plugin
289 */
290 public function handle_wordpress_plugin_activation( $plugin ) {
291 $extension = $this->get_extension_by_file( $plugin );
292 if ( $extension ) {
293 //we have found a matching extension
294 $this->activate( $extension['slug'], false );
295 }
296 }
297
298 /**
299 * @TODO
300 * @param $slug
301 * @param bool $deactivate_wordpress_plugin
302 * @param bool $error_loading
303 * @param bool $network_wide Whether to deactivate the plugin network-wide.
304 *
305 * @return array|mixed|void
306 */
307 public function deactivate( $slug, $deactivate_wordpress_plugin = true, $error_loading = false, $network_wide = false ) {
308 $extension = $this->get_extension( $slug );
309 if ( $extension ) {
310 if ( $deactivate_wordpress_plugin && 'bundled' !== foo_safe_get( $extension, 'source', false ) ) {
311 $plugin = $this->find_wordpress_plugin( $extension );
312 if ( ! $plugin ) {
313 return array(
314 /* translators: %s: Value inserted at runtime. */
315 'message' => sprintf( __( 'The feature %s could NOT be deactivated!', 'foogallery' ), "<strong>{$extension['title']}</strong>" ),
316 'type' => 'error',
317 );
318 }
319
320 $failure = deactivate_plugins( $plugin['file'], true, $network_wide );
321 if ( null !== $failure ) {
322 return array(
323 /* translators: %s: Value inserted at runtime. */
324 'message' => sprintf( __( 'The feature %s could NOT be deactivated!', 'foogallery' ), "<strong>{$extension['title']}</strong>" ),
325 'type' => 'error'
326 );
327 }
328 }
329
330 $active_extensions = $this->get_active_extensions();
331 if ( array_key_exists( $slug, $active_extensions ) ) {
332 unset( $active_extensions[ $slug ] );
333 if ( empty($active_extensions) ) {
334 delete_option( FOOGALLERY_EXTENSIONS_ACTIVATED_OPTIONS_KEY );
335 } else {
336 update_option( FOOGALLERY_EXTENSIONS_ACTIVATED_OPTIONS_KEY, $active_extensions );
337 }
338 }
339
340 $this->set_override( $slug, 'deactivated' );
341
342 if ( $error_loading ) {
343 $this->add_to_error_extensions( $slug );
344 }
345
346 //we are done, allow for extensions to do something after an extension is activated
347 do_action( 'foogallery_extension_deactivated-' . $slug );
348
349 return apply_filters( 'foogallery_extensions_deactivated_message-' . $slug, array(
350 /* translators: %s: Value inserted at runtime. */
351 'message' => sprintf( __( 'The feature %s was successfully deactivated', 'foogallery' ), "<strong>{$extension['title']}</strong>" ),
352 'type' => 'success',
353 ) );
354 }
355 return array(
356 /* translators: %s: Value inserted at runtime. */
357 'message' => sprintf( __( 'Unknown feature : %s', 'foogallery' ), $slug ),
358 'type' => 'error',
359 );
360 }
361
362 private function set_override( $slug, $status ) {
363 $overrides = $this->get_overrides();
364 $overrides[$slug] = $status;
365 update_option( FOOGALLERY_EXTENSIONS_OVERRIDES_OPTIONS_KEY, $overrides );
366 }
367
368 /**
369 * @TODO
370 *
371 * @param $slug
372 * @param bool $activate_wordpress_plugin
373 * @param bool $network_wide Whether to activate the plugin network-wide.
374 *
375 * @return array|mixed|void
376 */
377 public function activate( $slug, $activate_wordpress_plugin = true, $network_wide = false ) {
378 $extension = $this->get_extension( $slug );
379 if ( $extension ) {
380 $plugin = false;
381 if ( $activate_wordpress_plugin && 'bundled' !== foo_safe_get( $extension, 'source', false ) ) {
382 $plugin = $this->find_wordpress_plugin( $extension );
383 if ( ! $plugin ) {
384 return array(
385 /* translators: %s: Value inserted at runtime. */
386 'message' => sprintf( __( 'The feature %s could NOT be activated!', 'foogallery' ), "<strong>{$extension['title']}</strong>" ),
387 'type' => 'error',
388 );
389 }
390 }
391
392 //first remove it from our error list (if it was there before)
393 $this->remove_from_error_extensions( $slug );
394
395 if ( $plugin ) {
396 //activate the plugin, WordPress style!
397
398 //check min version
399 $minimum_version = foo_safe_get( $extension, 'minimum_version' );
400 if ( !empty($minimum_version) ) {
401 $actual_version = $plugin['plugin']['Version'];
402 if ( version_compare( $actual_version, $minimum_version ) < 0 ) {
403 /* translators: %s: Value inserted at runtime. */
404 $this->add_to_error_extensions( $slug, sprintf( __( 'Requires %s version %s','foogallery' ), $extension['title'], $minimum_version ) );
405 return array(
406 /* translators: %s: Value inserted at runtime. */
407 'message' => sprintf( __( 'The feature %s could not be activated, because you are using an outdated version! Please update %s to at least version %s.', 'foogallery' ), $extension['title'], $extension['title'], $minimum_version ),
408 'type' => 'error',
409 );
410 }
411 }
412
413 //try to activate the plugin
414 $failure = activate_plugin( $plugin['file'], '', $network_wide, false );
415 if ( null !== $failure ) {
416 return array(
417 /* translators: %s: Value inserted at runtime. */
418 'message' => sprintf( __( 'The feature %s could NOT be activated!', 'foogallery' ), "<strong>{$extension['title']}</strong>" ),
419 'type' => 'error',
420 );
421 }
422 }
423 //load an instance of the extension class into memory
424 $loader = new FooGallery_Extensions_Loader();
425 $loader->load_extension( $slug, foo_safe_get( $extension, 'class', false ) );
426
427 //then add the extension to our saved option so that it can be loaded on startup
428 $this->add_to_activated_extensions( $extension );
429
430 $this->set_override( $slug, 'active' );
431
432 //we are done, allow for extensions to do something after an extension is activated
433 do_action( 'foogallery_extension_activated-' . $slug );
434
435 //return our result
436 return apply_filters( 'foogallery_extension_activated_message-' . $slug, array(
437 /* translators: %s: Value inserted at runtime. */
438 'message' => sprintf( __( 'The feature %s was successfully activated', 'foogallery' ), "<strong>{$extension['title']}</strong>" ),
439 'type' => 'success',
440 ) );
441 }
442 return array(
443 /* translators: %s: Value inserted at runtime. */
444 'message' => sprintf( __( 'Unknown feature : %s', 'foogallery' ), $slug ),
445 'type' => 'error',
446 );
447 }
448
449 /**
450 * @TODO
451 * @param boolean $extension
452 *
453 * @return array|bool
454 */
455 private function find_wordpress_plugin( $extension ) {
456 $this->load_wordpress_plugin_functions();
457
458 $plugins = get_plugins();
459 foreach ( $plugins as $plugin_file => $plugin ) {
460 if ( isset($extension['file']) && foo_ends_with( $plugin_file, $extension['file'] ) ) {
461 return array(
462 'file' => $plugin_file,
463 'plugin' => $plugin,
464 'active' => is_plugin_active( $plugin_file ),
465 );
466 }
467 }
468 return false;
469 }
470
471 /**
472 * Resolve an installed WordPress plugin for a registered extension.
473 *
474 * @param array $extension Registered extension data.
475 * @return array|bool Plugin data or false when no installed plugin matches.
476 */
477 public function get_wordpress_plugin( $extension ) {
478 return $this->find_wordpress_plugin( $extension );
479 }
480
481 /**
482 * @TODO
483 * @param boolean $extension
484 *
485 * @return array|bool
486 */
487 private function find_active_wordpress_plugin( $extension ) {
488 $this->load_wordpress_plugin_functions();
489
490 $plugins = get_plugins();
491 foreach ( $plugins as $plugin_file => $plugin ) {
492 if ( is_plugin_active( $plugin_file ) && isset($extension['file']) && foo_ends_with( $plugin_file, $extension['file'] ) ) {
493 return array(
494 'file' => $plugin_file,
495 'plugin' => $plugin
496 );
497 }
498 }
499 return false;
500 }
501
502 /**
503 * Load plugin administration functions when extension checks run on the frontend.
504 *
505 * WordPress 5.3 does not load these functions during a normal frontend bootstrap.
506 *
507 * @return void
508 */
509 private function load_wordpress_plugin_functions() {
510 if ( ! function_exists( 'get_plugins' ) || ! function_exists( 'is_plugin_active' ) ) {
511 require_once ABSPATH . 'wp-admin/includes/plugin.php';
512 }
513 }
514
515 /**
516 * @TODO
517 * @param $slug
518 *
519 * @return array|mixed|void
520 */
521 public function download( $slug ) {
522 $extension = $this->get_extension( $slug );
523 if ( $extension ) {
524
525 //we need some files!
526 require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; // plugins_api calls
527 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; // Plugin_Upgrader class
528 require_once FOOGALLERY_PATH . 'includes/admin/class-silent-installer-skin.php'; //our silent installer skin
529
530 $download_link = isset( $extension['download_link'] ) ? $extension['download_link'] : false;
531
532 if ( 'repo' === $extension['source'] ) {
533 $plugins_api = plugins_api( 'plugin_information', array( 'slug' => $slug, 'fields' => array( 'sections' => false ) ) );
534
535 if ( is_wp_error( $plugins_api ) ) {
536 return array(
537 /* translators: %s: Value inserted at runtime. */
538 'message' => sprintf( __( 'Unable to connect to the WordPress.org plugin API to download %s. Full error log: %s', 'foogallery' ), $slug, '<br />' . var_export( $plugins_api, true ) ),
539 'type' => 'error',
540 );
541 }
542
543 //get the download link from the API call
544 if ( isset( $plugins_api->download_link ) ) {
545 $download_link = $plugins_api->download_link;
546 }
547 }
548
549 //check we have something to download
550 if ( empty( $download_link ) ) {
551 return array(
552 /* translators: %s: Value inserted at runtime. */
553 'message' => sprintf( __( 'The feature %s has no download link!', 'foogallery' ), $slug ),
554 'type' => 'error',
555 );
556 }
557
558 $skin = new FooGallery_Silent_Installer_Skin();
559
560 //instantiate Plugin_Upgrader
561 $upgrader = new Plugin_Upgrader( $skin );
562
563 $upgrader->install( $download_link );
564
565 if ( 'process_failed' === $skin->feedback ) {
566 $error_message = is_wp_error( $skin->result ) ? $skin->result->get_error_message() : __( 'Unknown!', 'foogallery' );
567
568 //save the error message for the extension
569 /* translators: %s: Value inserted at runtime. */
570 $this->add_to_error_extensions( $slug, sprintf( __('Could not be downloaded! Error : %s', 'foogallery' ), $error_message ) );
571
572 //we had an error along the way
573 return apply_filters( 'foogallery_extensions_download_failure-' . $slug, array(
574 /* translators: %s: Value inserted at runtime. */
575 'message' => sprintf( __( 'The feature %s could NOT be downloaded! Error : %s', 'foogallery' ), "<strong>{$extension['title']}</strong>", $error_message ),
576 'type' => 'error'
577 ) );
578 }
579
580 //return our result
581 return apply_filters( 'foogallery_extensions_download_success-' . $slug, array(
582 /* translators: %s: Value inserted at runtime. */
583 'message' => sprintf( __( 'The feature %s was successfully downloaded and can now be activated. %s', 'foogallery' ),
584 "<strong>{$extension['title']}</strong>",
585 '<a href="' . esc_url( add_query_arg( array(
586 'action' => 'activate',
587 'extension' => $slug, ) ) ) . '">' . __( 'Activate immediately', 'foogallery' ) . '</a>'
588 ),
589 'type' => 'success',
590 ) );
591 }
592 return array(
593 /* translators: %s: Value inserted at runtime. */
594 'message' => sprintf( __( 'Unknown feature : %s', 'foogallery' ), $slug ),
595 'type' => 'error',
596 );
597 }
598
599 /**
600 * @TODO
601 * @return mixed|void
602 */
603 public function get_active_extensions() {
604 return get_option( FOOGALLERY_EXTENSIONS_ACTIVATED_OPTIONS_KEY, array() );
605 }
606
607 /**
608 * Return extensions that should be loaded on startup.
609 *
610 * This mirrors is_active() so explicit active/deactivated overrides and
611 * default/plugin-backed extensions cannot drift from the runtime loader.
612 *
613 * @return array<string,string>
614 */
615 public function get_loadable_extensions() {
616 $loadable_extensions = $this->get_active_extensions();
617 if ( ! is_array( $loadable_extensions ) ) {
618 $loadable_extensions = array();
619 }
620
621 $overrides = $this->get_overrides();
622 if ( ! is_array( $overrides ) ) {
623 $overrides = array();
624 }
625
626 foreach ( $overrides as $slug => $status ) {
627 if ( 'deactivated' === $status ) {
628 unset( $loadable_extensions[ $slug ] );
629 }
630 }
631
632 foreach ( $this->get_all() as $extension ) {
633 $slug = foo_safe_get( $extension, 'slug' );
634 $class = foo_safe_get( $extension, 'class' );
635
636 if ( empty( $slug ) || empty( $class ) ) {
637 continue;
638 }
639
640 if ( $this->is_active( $slug ) && $this->is_downloaded( $extension ) ) {
641 $loadable_extensions[ $slug ] = $class;
642 }
643 }
644
645 return $loadable_extensions;
646 }
647
648 /**
649 * Returns the extension overrides.
650 * @return mixed|void
651 */
652 public function get_overrides() {
653 return get_option( FOOGALLERY_EXTENSIONS_OVERRIDES_OPTIONS_KEY, array() );
654 }
655
656 /**
657 * @TODO
658 * @return mixed|void
659 */
660 public function get_error_extensions() {
661 return get_option( FOOGALLERY_EXTENSIONS_ERRORS_OPTIONS_KEY, array() );
662 }
663
664 public function get_error_message( $slug ) {
665 $error_extensions = $this->get_error_extensions();
666 if ( array_key_exists( $slug, $error_extensions ) ) {
667 return $error_extensions[ $slug ];
668 }
669 return '';
670 }
671
672 /**
673 * @TODO
674 * @param $extension
675 */
676 private function add_to_activated_extensions( $extension ) {
677 $slug = $extension['slug'];
678 $active_extensions = $this->get_active_extensions();
679 if ( !array_key_exists( $slug, $active_extensions ) ) {
680 $active_extensions[ $slug ] = $extension['class'];
681 update_option( FOOGALLERY_EXTENSIONS_ACTIVATED_OPTIONS_KEY, $active_extensions );
682 }
683 }
684
685 /**
686 * @TODO
687 * @param $slug
688 */
689 public function add_to_error_extensions( $slug, $error_message = '' ) {
690 $error_extensions = $this->get_error_extensions();
691
692 if ( empty($error_message) ) {
693 $error_message = __( 'Error loading feature!', 'foogallery' );
694 }
695
696 if ( array_key_exists( $slug, $error_extensions ) &&
697 $error_message === $error_extensions[$slug]) {
698 //do nothing!
699 } else {
700 $error_extensions[$slug] = $error_message;
701 update_option( FOOGALLERY_EXTENSIONS_ERRORS_OPTIONS_KEY, $error_extensions );
702 }
703 }
704
705 /**
706 * @TODO
707 * @param $slug
708 */
709 private function remove_from_error_extensions( $slug ) {
710 $error_extensions = $this->get_error_extensions();
711 if ( array_key_exists( $slug, $error_extensions ) ) {
712 unset( $error_extensions[ $slug ] );
713 update_option( FOOGALLERY_EXTENSIONS_ERRORS_OPTIONS_KEY, $error_extensions );
714 }
715 }
716
717 /**
718 * @TODO
719 */
720 public function auto_activate_extensions() {
721 foreach ( $this->get_all() as $extension ) {
722 if ( true === foo_safe_get( $extension, 'activated_by_default' ) ) {
723 //check to see if the extension is downloaded
724 if ( $this->is_downloaded( $extension ) ) {
725 $this->add_to_activated_extensions( $extension );
726 }
727 }
728 }
729 }
730 }
731 }
732