Unyson - Version 2.6.8

Version Description

  • Extensions are installed on plugin install with TGM 'is_automatic' => true #2117
  • Fixed #2134, #2104, #2106, #1144
Download this release

Release Info

Developer Unyson
Plugin Icon 128x128 Unyson
Version 2.6.8
Comparing to
See all releases

Code changes from version 2.6.7 to 2.6.8

framework/core/components/backend.php CHANGED
@@ -1169,7 +1169,7 @@ final class _FW_Component_Backend {
1169
  */
1170
  {
1171
  if (
1172
- 'edit-tags' === $current_screen->base
1173
  &&
1174
  $current_screen->taxonomy
1175
  ) {
1169
  */
1170
  {
1171
  if (
1172
+ in_array($current_screen->base, array('edit-tags', 'term'), true)
1173
  &&
1174
  $current_screen->taxonomy
1175
  ) {
framework/core/components/extensions/manager/class--fw-extensions-manager.php CHANGED
@@ -55,6 +55,7 @@ final class _FW_Extensions_Manager
55
  add_action('upgrader_process_complete', array($this, '_action_theme_available_extensions_restore'), 999, 2);
56
  }
57
 
 
58
  add_action('fw_after_plugin_activate', array($this, '_action_after_plugin_activate'), 100);
59
  add_action('after_switch_theme', array($this, '_action_theme_switch'));
60
 
@@ -399,7 +400,7 @@ final class _FW_Extensions_Manager
399
  /** @var WP_Filesystem_Base $wp_filesystem */
400
  global $wp_filesystem;
401
 
402
- if (!$wp_filesystem || (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code())) {
403
  return;
404
  }
405
 
@@ -448,7 +449,7 @@ final class _FW_Extensions_Manager
448
  /** @var WP_Filesystem_Base $wp_filesystem */
449
  global $wp_filesystem;
450
 
451
- if ( !$wp_filesystem || (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) ) {
452
  return;
453
  }
454
 
@@ -1124,7 +1125,7 @@ final class _FW_Extensions_Manager
1124
 
1125
  global $wp_filesystem;
1126
 
1127
- if (!$wp_filesystem || (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code())) {
1128
  return new WP_Error(
1129
  'fs_not_initialized',
1130
  __('WP Filesystem is not initialized', 'fw')
@@ -1609,7 +1610,7 @@ final class _FW_Extensions_Manager
1609
  /** @var WP_Filesystem_Base $wp_filesystem */
1610
  global $wp_filesystem;
1611
 
1612
- if (!$wp_filesystem || (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code())) {
1613
  return new WP_Error(
1614
  'fs_not_initialized',
1615
  __('WP Filesystem is not initialized', 'fw')
@@ -3237,7 +3238,7 @@ final class _FW_Extensions_Manager
3237
  /** @var WP_Filesystem_Base $wp_filesystem */
3238
  global $wp_filesystem;
3239
 
3240
- if (!$wp_filesystem || (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code())) {
3241
  return new WP_Error(
3242
  'fs_not_initialized',
3243
  __('WP Filesystem is not initialized', 'fw')
@@ -3327,7 +3328,7 @@ final class _FW_Extensions_Manager
3327
  /** @var WP_Filesystem_Base $wp_filesystem */
3328
  global $wp_filesystem;
3329
 
3330
- if (!$wp_filesystem || (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code())) {
3331
  return new WP_Error(
3332
  'fs_not_initialized',
3333
  __('WP Filesystem is not initialized', 'fw')
@@ -3448,4 +3449,23 @@ final class _FW_Extensions_Manager
3448
  fw()->extensions->manager->theme_available_extensions_restore();
3449
  }
3450
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3451
  }
55
  add_action('upgrader_process_complete', array($this, '_action_theme_available_extensions_restore'), 999, 2);
56
  }
57
 
58
+ add_action('fw_plugin_activate', array($this, '_action_plugin_activate_install_compatible_extensions'), 100);
59
  add_action('fw_after_plugin_activate', array($this, '_action_after_plugin_activate'), 100);
60
  add_action('after_switch_theme', array($this, '_action_theme_switch'));
61
 
400
  /** @var WP_Filesystem_Base $wp_filesystem */
401
  global $wp_filesystem;
402
 
403
+ if (!FW_WP_Filesystem::is_ready()) {
404
  return;
405
  }
406
 
449
  /** @var WP_Filesystem_Base $wp_filesystem */
450
  global $wp_filesystem;
451
 
452
+ if (!FW_WP_Filesystem::is_ready()) {
453
  return;
454
  }
455
 
1125
 
1126
  global $wp_filesystem;
1127
 
1128
+ if (!FW_WP_Filesystem::is_ready()) {
1129
  return new WP_Error(
1130
  'fs_not_initialized',
1131
  __('WP Filesystem is not initialized', 'fw')
1610
  /** @var WP_Filesystem_Base $wp_filesystem */
1611
  global $wp_filesystem;
1612
 
1613
+ if (!FW_WP_Filesystem::is_ready()) {
1614
  return new WP_Error(
1615
  'fs_not_initialized',
1616
  __('WP Filesystem is not initialized', 'fw')
3238
  /** @var WP_Filesystem_Base $wp_filesystem */
3239
  global $wp_filesystem;
3240
 
3241
+ if (!FW_WP_Filesystem::is_ready()) {
3242
  return new WP_Error(
3243
  'fs_not_initialized',
3244
  __('WP Filesystem is not initialized', 'fw')
3328
  /** @var WP_Filesystem_Base $wp_filesystem */
3329
  global $wp_filesystem;
3330
 
3331
+ if (!FW_WP_Filesystem::is_ready()) {
3332
  return new WP_Error(
3333
  'fs_not_initialized',
3334
  __('WP Filesystem is not initialized', 'fw')
3449
  fw()->extensions->manager->theme_available_extensions_restore();
3450
  }
3451
  }
3452
+
3453
+ /**
3454
+ * Install compatible extensions on plugin install -> activate
3455
+ *
3456
+ * In order for this to work, int TGM config must be set: 'is_automatic' => true
3457
+ * http://tgmpluginactivation.com/configuration/
3458
+ *
3459
+ * @internal
3460
+ */
3461
+ public function _action_plugin_activate_install_compatible_extensions() {
3462
+ if (!FW_WP_Filesystem::is_ready()) {
3463
+ return;
3464
+ }
3465
+
3466
+ if ($compatible_extensions = $this->get_supported_extensions_for_install()) {
3467
+ $this->install_extensions($compatible_extensions);
3468
+ // the result is not used because we don't know here if we can print the errors or not
3469
+ }
3470
+ }
3471
  }
framework/helpers/class-fw-file-cache.php CHANGED
@@ -80,7 +80,12 @@ class FW_File_Cache {
80
  * Fixes https://github.com/ThemeFuse/Unyson/issues/2029
81
  * Disable entirely file-cache. Maybe in future somebody will find a solution.
82
  */
83
- return false;
 
 
 
 
 
84
 
85
  if ( is_null(self::$blog_id) ) {
86
  self::$blog_id = get_current_blog_id();
80
  * Fixes https://github.com/ThemeFuse/Unyson/issues/2029
81
  * Disable entirely file-cache. Maybe in future somebody will find a solution.
82
  */
83
+ {
84
+ if (file_exists(self::get_path())) {
85
+ unlink(self::get_path());
86
+ }
87
+ return false;
88
+ }
89
 
90
  if ( is_null(self::$blog_id) ) {
91
  self::$blog_id = get_current_blog_id();
framework/helpers/class-fw-wp-filesystem.php CHANGED
@@ -145,7 +145,7 @@ class FW_WP_Filesystem
145
  $real_path = fw_fix_path($real_path);
146
 
147
  foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) {
148
- $prefix_regex = '/^'. preg_quote($base_real_path, '/') .'/';
149
 
150
  // check if path is inside base path
151
  if (!preg_match($prefix_regex, $real_path)) {
@@ -155,7 +155,7 @@ class FW_WP_Filesystem
155
  if ($base_real_path === '/') {
156
  $relative_path = $real_path;
157
  } else {
158
- $relative_path = preg_replace($prefix_regex, '', $real_path);
159
  }
160
 
161
  return $base_wp_filesystem_path . $relative_path;
@@ -182,7 +182,7 @@ class FW_WP_Filesystem
182
  $wp_filesystem_path = fw_fix_path($wp_filesystem_path);
183
 
184
  foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) {
185
- $prefix_regex = '/^'. preg_quote($base_wp_filesystem_path, '/') .'/';
186
 
187
  // check if path is inside base path
188
  if (!preg_match($prefix_regex, $wp_filesystem_path)) {
@@ -192,7 +192,7 @@ class FW_WP_Filesystem
192
  if ($base_wp_filesystem_path === '/') {
193
  $relative_path = $wp_filesystem_path;
194
  } else {
195
- $relative_path = preg_replace($prefix_regex, '', $wp_filesystem_path);
196
  }
197
 
198
  return $base_real_path . $relative_path;
@@ -254,7 +254,7 @@ class FW_WP_Filesystem
254
  $path = false;
255
 
256
  foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) {
257
- $prefix_regex = '/^'. preg_quote($base_wp_filesystem_path, '/') .'/';
258
 
259
  // check if path is inside base path
260
  if (!preg_match($prefix_regex, $wp_filesystem_dir_path)) {
@@ -280,7 +280,7 @@ class FW_WP_Filesystem
280
  if ($path === '/') {
281
  $rel_path = $wp_filesystem_dir_path;
282
  } else {
283
- $rel_path = preg_replace('/^'. preg_quote($path, '/') .'/', '', $wp_filesystem_dir_path);
284
  }
285
 
286
  // improvement: do not check directory for existence if it's known that sure it doesn't exist
@@ -309,4 +309,16 @@ class FW_WP_Filesystem
309
 
310
  return true;
311
  }
 
 
 
 
 
 
 
 
 
 
 
 
312
  }
145
  $real_path = fw_fix_path($real_path);
146
 
147
  foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) {
148
+ $prefix_regex = '/^'. preg_quote($base_real_path, '/') .'($|\/.*)/';
149
 
150
  // check if path is inside base path
151
  if (!preg_match($prefix_regex, $real_path)) {
155
  if ($base_real_path === '/') {
156
  $relative_path = $real_path;
157
  } else {
158
+ $relative_path = preg_replace($prefix_regex, '$1', $real_path);
159
  }
160
 
161
  return $base_wp_filesystem_path . $relative_path;
182
  $wp_filesystem_path = fw_fix_path($wp_filesystem_path);
183
 
184
  foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) {
185
+ $prefix_regex = '/^'. preg_quote($base_wp_filesystem_path, '/') .'($|\/.*)/';
186
 
187
  // check if path is inside base path
188
  if (!preg_match($prefix_regex, $wp_filesystem_path)) {
192
  if ($base_wp_filesystem_path === '/') {
193
  $relative_path = $wp_filesystem_path;
194
  } else {
195
+ $relative_path = preg_replace($prefix_regex, '$1', $wp_filesystem_path);
196
  }
197
 
198
  return $base_real_path . $relative_path;
254
  $path = false;
255
 
256
  foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) {
257
+ $prefix_regex = '/^'. preg_quote($base_wp_filesystem_path, '/') .'($|\/)/';
258
 
259
  // check if path is inside base path
260
  if (!preg_match($prefix_regex, $wp_filesystem_dir_path)) {
280
  if ($path === '/') {
281
  $rel_path = $wp_filesystem_dir_path;
282
  } else {
283
+ $rel_path = preg_replace('/^'. preg_quote($path, '/') .'($|\/.*)/', '$1', $wp_filesystem_dir_path);
284
  }
285
 
286
  // improvement: do not check directory for existence if it's known that sure it doesn't exist
309
 
310
  return true;
311
  }
312
+
313
+ /**
314
+ * If is initialized and has no errors
315
+ * @return bool
316
+ * @since 2.6.8
317
+ */
318
+ public static function is_ready() {
319
+ /** @var WP_Filesystem_Base $wp_filesystem */
320
+ global $wp_filesystem;
321
+
322
+ return $wp_filesystem && is_wp_error($wp_filesystem->errors) && !$wp_filesystem->errors->get_error_code();
323
+ }
324
  }
framework/helpers/database.php CHANGED
@@ -589,7 +589,9 @@ class FW_Db_Options_Model_Customizer extends FW_Db_Options_Model {
589
  }
590
 
591
  // Fixes https://github.com/ThemeFuse/Unyson/issues/2053
592
- add_action('customize_preview_init', array($this, '_reset_cache'));
 
 
593
  }
594
  }
595
  new FW_Db_Options_Model_Customizer();
@@ -638,7 +640,8 @@ new FW_Db_Options_Model_Customizer();
638
 
639
  return false;
640
  }
641
- $data = get_user_meta( $user_id, 'fw_data', true );
 
642
 
643
  if ( $keys == null ) {
644
  fw_aks( $extension_name, $value, $data );
589
  }
590
 
591
  // Fixes https://github.com/ThemeFuse/Unyson/issues/2053
592
+ add_action('customize_preview_init', array($this, '_reset_cache'),
593
+ 1 // Fixes https://github.com/ThemeFuse/Unyson/issues/2104
594
+ );
595
  }
596
  }
597
  new FW_Db_Options_Model_Customizer();
640
 
641
  return false;
642
  }
643
+
644
+ $data = get_user_meta( $user_id, 'fw_data', true );
645
 
646
  if ( $keys == null ) {
647
  fw_aks( $extension_name, $value, $data );
framework/helpers/general.php CHANGED
@@ -530,6 +530,13 @@ function fw_locate_theme_path($rel_path) {
530
  }
531
  }
532
 
 
 
 
 
 
 
 
533
  /**
534
  * Safe render a view and return html
535
  * In view will be accessible only passed variables
@@ -551,6 +558,7 @@ function fw_render_view($file_path, $view_variables = array(), $return = true) {
551
  require $file_path;
552
  }
553
  }
 
554
 
555
  /**
556
  * Safe load variables from an file
530
  }
531
  }
532
 
533
+ /**
534
+ * There is a theme which does: if (!defined('FW')): function fw_render_view() { ... } endif;
535
+ * It works fine, except in this case
536
+ * https://github.com/ThemeFuse/Unyson/commit/07be8b1f4b50eaf0f1f7e85ea1c6912a0415d241#diff-cf866bf08b8f747e3120221a6b1b07cfR48
537
+ * it throws fatal error because this function here is defined after that
538
+ */
539
+ if (!function_exists('fw_render_view')):
540
  /**
541
  * Safe render a view and return html
542
  * In view will be accessible only passed variables
558
  require $file_path;
559
  }
560
  }
561
+ endif;
562
 
563
  /**
564
  * Safe load variables from an file
framework/includes/option-types/multi-upload/class-fw-option-type-multi-upload.php CHANGED
@@ -219,19 +219,18 @@ class FW_Option_Type_Multi_Upload extends FW_Option_Type
219
  if (empty($input_value)) {
220
  return $option['value'];
221
  } else {
222
- return $this->get_attachments_info($input_value);
223
  }
224
  }
225
 
226
- private function get_attachments_info($attachment_ids)
227
  {
228
- $decoded_ids = json_decode($attachment_ids, true);
229
- if (
230
- !is_array($decoded_ids) ||
231
- empty($decoded_ids)
232
- ) {
233
- $defaults = $this->get_defaults();
234
- return $defaults['value'];
235
  }
236
 
237
  $return_arr = array();
219
  if (empty($input_value)) {
220
  return $option['value'];
221
  } else {
222
+ return $this->get_attachments_info($input_value, $option);
223
  }
224
  }
225
 
226
+ private function get_attachments_info($attachment_ids, $option)
227
  {
228
+ if (!(
229
+ is_string($attachment_ids)
230
+ &&
231
+ is_array($decoded_ids = json_decode($attachment_ids, true))
232
+ )) {
233
+ return $option['value'];
 
234
  }
235
 
236
  $return_arr = array();
framework/includes/option-types/popup/class-fw-option-type-popup.php CHANGED
@@ -117,35 +117,34 @@ class FW_Option_Type_Popup extends FW_Option_Type {
117
  * @internal
118
  */
119
  protected function _get_value_from_input( $option, $input_value ) {
120
- if ( empty( $input_value ) ) {
121
- if ( empty( $option['popup-options'] ) ) {
122
- return array();
123
- }
124
 
125
- /**
126
- * $option['value'] has DB format (not $input_value HTML format)
127
- * so it can't be used as second parameter in fw_get_options_values_from_input()
128
- * thus we need to move each option value in option array default values
129
- */
130
- $popup_options = array();
131
- foreach (fw_extract_only_options($option['popup-options']) as $popup_option_id => $popup_option) {
132
- if (isset($option['value'][$popup_option_id])) {
133
- $popup_option['value'] = $option['value'][$popup_option_id];
134
- }
135
- $popup_options[ $popup_option_id ] = $popup_option;
136
  }
 
137
 
138
- $values = fw_get_options_values_from_input($popup_options, array());
139
- } else if (is_array( $input_value )) {
140
- /**
141
- * Don't decode if we have already an array
142
- */
143
- $values = fw_get_options_values_from_input($option['popup-options'], $input_value);
144
- } else {
145
- $values = fw_get_options_values_from_input($option['popup-options'], json_decode( $input_value, true ));
 
 
 
146
  }
147
 
148
- return $values;
149
  }
150
 
151
  /**
117
  * @internal
118
  */
119
  protected function _get_value_from_input( $option, $input_value ) {
120
+ if ( empty( $option['popup-options'] ) ) {
121
+ return array();
122
+ }
 
123
 
124
+ if (is_null($input_value)) {
125
+ $input_value = $option['value'];
126
+ } else {
127
+ if (is_array($input_value)) {
128
+ // Don't decode if we have already an array
129
+ } else {
130
+ $input_value = json_decode($input_value, true);
 
 
 
 
131
  }
132
+ }
133
 
134
+ /**
135
+ * Move each option value in option array default values
136
+ * because popup <input> contains options db values got from fw.OptionsModal
137
+ * which can't be used as $input_value in second parameter of fw_get_options_values_from_input()
138
+ */
139
+ $popup_options = array();
140
+ foreach (fw_extract_only_options($option['popup-options']) as $popup_option_id => $popup_option) {
141
+ if (isset($input_value[$popup_option_id])) {
142
+ $popup_option['value'] = $input_value[$popup_option_id];
143
+ }
144
+ $popup_options[ $popup_option_id ] = $popup_option;
145
  }
146
 
147
+ return fw_get_options_values_from_input($popup_options, array());
148
  }
149
 
150
  /**
framework/manifest.php CHANGED
@@ -4,4 +4,4 @@ $manifest = array();
4
 
5
  $manifest['name'] = __('Unyson', 'fw');
6
 
7
- $manifest['version'] = '2.6.7';
4
 
5
  $manifest['name'] = __('Unyson', 'fw');
6
 
7
+ $manifest['version'] = '2.6.8';
framework/views/backend-settings-form.php CHANGED
@@ -17,6 +17,8 @@ function _action_fw_theme_settings_footer_scripts() {
17
  (function ($) {
18
  var fwLoadingId = 'fw-theme-settings';
19
 
 
 
20
  {
21
  fw.loading.show(fwLoadingId);
22
 
@@ -24,6 +26,7 @@ function _action_fw_theme_settings_footer_scripts() {
24
  fw.loading.hide(fwLoadingId);
25
  });
26
  }
 
27
 
28
  $(function ($) {
29
  $(document.body).on({
17
  (function ($) {
18
  var fwLoadingId = 'fw-theme-settings';
19
 
20
+ <?php if (wp_script_is('fw-option-types')): ?>
21
+ // there are options on the page. show loading now and hide it after the options were initialized
22
  {
23
  fw.loading.show(fwLoadingId);
24
 
26
  fw.loading.hide(fwLoadingId);
27
  });
28
  }
29
+ <?php endif; ?>
30
 
31
  $(function ($) {
32
  $(document.body).on({
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: unyson
3
  Tags: page builder, grid, layout, responsive, back up, backup, db backup, dump, migrate, schedule, search engine optimization, seo, media, slideshow, shortcode, slide, slideshare, slideshow, google sitemaps, sitemaps, analytics, google analytics, calendar, event, events, google maps, learning, lessons, sidebars, breadcrumbs, review, portfolio, framework
4
  Requires at least: 4.4
5
  Tested up to: 4.6
6
- Stable tag: 2.6.7
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -83,6 +83,10 @@ Yes; Unyson will work with any theme.
83
 
84
  == Changelog ==
85
 
 
 
 
 
86
  = 2.6.7 =
87
  * Fixed [#2053](https://github.com/ThemeFuse/Unyson/issues/2053), [#2024](https://github.com/ThemeFuse/Unyson/issues/2024)
88
 
3
  Tags: page builder, grid, layout, responsive, back up, backup, db backup, dump, migrate, schedule, search engine optimization, seo, media, slideshow, shortcode, slide, slideshare, slideshow, google sitemaps, sitemaps, analytics, google analytics, calendar, event, events, google maps, learning, lessons, sidebars, breadcrumbs, review, portfolio, framework
4
  Requires at least: 4.4
5
  Tested up to: 4.6
6
+ Stable tag: 2.6.8
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
83
 
84
  == Changelog ==
85
 
86
+ = 2.6.8 =
87
+ * Extensions are installed on plugin install with TGM `'is_automatic' => true` [#2117](https://github.com/ThemeFuse/Unyson/issues/2117)
88
+ * Fixed [#2134](https://github.com/ThemeFuse/Unyson/pull/2134), [#2104](https://github.com/ThemeFuse/Unyson/issues/2104), [#2106](https://github.com/ThemeFuse/Unyson/issues/2106), [#1144](https://github.com/ThemeFuse/Unyson/issues/1144#issuecomment-250257511)
89
+
90
  = 2.6.7 =
91
  * Fixed [#2053](https://github.com/ThemeFuse/Unyson/issues/2053), [#2024](https://github.com/ThemeFuse/Unyson/issues/2024)
92
 
unyson.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Unyson
4
  * Plugin URI: http://unyson.io/
5
  * Description: A free drag & drop framework that comes with a bunch of built in extensions that will help you develop premium themes fast & easy.
6
- * Version: 2.6.7
7
  * Author: ThemeFuse
8
  * Author URI: http://themefuse.com
9
  * License: GPL2+
@@ -16,7 +16,6 @@ if (defined('FW')) {
16
  * The plugin was already loaded (maybe as another plugin with different directory name)
17
  */
18
  } else {
19
-
20
  {
21
  /** @internal */
22
  function _filter_fw_framework_plugin_directory_uri() {
@@ -39,6 +38,17 @@ if (defined('FW')) {
39
  /** @internal */
40
  function _action_fw_plugin_activate() {
41
  update_option('_fw_plugin_activated', true, false); // add special option (is used in another action)
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
  register_activation_hook( __FILE__, '_action_fw_plugin_activate' );
44
 
3
  * Plugin Name: Unyson
4
  * Plugin URI: http://unyson.io/
5
  * Description: A free drag & drop framework that comes with a bunch of built in extensions that will help you develop premium themes fast & easy.
6
+ * Version: 2.6.8
7
  * Author: ThemeFuse
8
  * Author URI: http://themefuse.com
9
  * License: GPL2+
16
  * The plugin was already loaded (maybe as another plugin with different directory name)
17
  */
18
  } else {
 
19
  {
20
  /** @internal */
21
  function _filter_fw_framework_plugin_directory_uri() {
38
  /** @internal */
39
  function _action_fw_plugin_activate() {
40
  update_option('_fw_plugin_activated', true, false); // add special option (is used in another action)
41
+
42
+ if (
43
+ did_action('after_setup_theme') // @see framework/bootstrap.php
44
+ &&
45
+ !did_action('fw_init') // must not be loaded
46
+ ) {
47
+ _action_init_framework(); // load (prematurely) the plugin
48
+
49
+ /** @since 2.6.8 */
50
+ do_action('fw_plugin_activate');
51
+ }
52
  }
53
  register_activation_hook( __FILE__, '_action_fw_plugin_activate' );
54