Orbit Fox by ThemeIsle - Version 2.5.8

Version Description

  • 2018-09-12
Download this release

Release Info

Developer codeinwp
Plugin Icon 128x128 Orbit Fox by ThemeIsle
Version 2.5.8
Comparing to
See all releases

Code changes from version 2.5.7 to 2.5.8

CHANGELOG.md CHANGED
@@ -1,4 +1,10 @@
1
 
 
 
 
 
 
 
2
  ### v2.5.7 - 2018-08-13
3
  **Changes:**
4
  * -fixed fatal error with Elementor extra widgets
1
 
2
+ ### v2.5.8 - 2018-09-12
3
+ **Changes:**
4
+ * Extend image optimization module for 50% of users.
5
+ * Enable safe updates for all users.
6
+ * Adds image optimization integration with Optimole.
7
+
8
  ### v2.5.7 - 2018-08-13
9
  **Changes:**
10
  * -fixed fatal error with Elementor extra widgets
core/app/class-orbit-fox-admin.php CHANGED
@@ -119,7 +119,10 @@ class Orbit_Fox_Admin {
119
  */
120
  public function menu_pages() {
121
  add_menu_page(
122
- __( 'Orbit Fox', 'themeisle-companion' ), __( 'Orbit Fox', 'themeisle-companion' ), 'manage_options', 'obfx_companion',
 
 
 
123
  array(
124
  $this,
125
  'page_modules_render',
119
  */
120
  public function menu_pages() {
121
  add_menu_page(
122
+ __( 'Orbit Fox', 'themeisle-companion' ),
123
+ __( 'Orbit Fox', 'themeisle-companion' ),
124
+ 'manage_options',
125
+ 'obfx_companion',
126
  array(
127
  $this,
128
  'page_modules_render',
core/assets/css/orbit-fox-admin.css CHANGED
@@ -8,7 +8,7 @@
8
  * Extends Spectre.css Library
9
  */
10
  /*
11
- Version: 2.5.7
12
  */
13
 
14
  /* Document
8
  * Extends Spectre.css Library
9
  */
10
  /*
11
+ Version: 2.5.8
12
  */
13
 
14
  /* Document
core/includes/class-orbit-fox.php CHANGED
@@ -69,7 +69,7 @@ class Orbit_Fox {
69
 
70
  $this->plugin_name = 'orbit-fox';
71
 
72
- $this->version = '2.5.7';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
69
 
70
  $this->plugin_name = 'orbit-fox';
71
 
72
+ $this->version = '2.5.8';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
obfx_modules/beaver-widgets/modules/post-grid/includes/loop-settings.php CHANGED
@@ -27,27 +27,32 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
27
 
28
  // Post type
29
  FLBuilder::render_settings_field(
30
- 'post_type', array(
 
31
  'type' => 'post-type',
32
  'label' => esc_html__( 'Post Type', 'themeisle-companion' ),
33
- ), $settings
 
34
  );
35
 
36
  // Order
37
  FLBuilder::render_settings_field(
38
- 'order', array(
 
39
  'type' => 'select',
40
  'label' => esc_html__( 'Order', 'themeisle-companion' ),
41
  'options' => array(
42
  'DESC' => esc_html__( 'Descending', 'themeisle-companion' ),
43
  'ASC' => esc_html__( 'Ascending', 'themeisle-companion' ),
44
  ),
45
- ), $settings
 
46
  );
47
 
48
  // Order by
49
  FLBuilder::render_settings_field(
50
- 'order_by', array(
 
51
  'type' => 'select',
52
  'label' => esc_html__( 'Order By', 'themeisle-companion' ),
53
  'options' => array(
@@ -70,48 +75,57 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
70
  'fields' => array( 'order_by_meta_key' ),
71
  ),
72
  ),
73
- ), $settings
 
74
  );
75
 
76
  // Meta Key
77
  FLBuilder::render_settings_field(
78
- 'order_by_meta_key', array(
 
79
  'type' => 'text',
80
  'label' => esc_html__( 'Meta Key', 'themeisle-companion' ),
81
- ), $settings
 
82
  );
83
 
84
  // Offset
85
  FLBuilder::render_settings_field(
86
- 'offset', array(
 
87
  'type' => 'text',
88
  'label' => _x( 'Offset', 'How many posts to skip.', 'themeisle-companion' ),
89
  'default' => '0',
90
  'size' => '4',
91
  'help' => esc_html__( 'Skip this many posts that match the specified criteria.', 'themeisle-companion' ),
92
- ), $settings
 
93
  );
94
 
95
  // Posts per page
96
  FLBuilder::render_settings_field(
97
- 'posts_per_page', array(
 
98
  'type' => 'obfx_number',
99
  'label' => esc_html__( 'Posts per page', 'themeisle-companion' ),
100
  'default' => $default_posts_per_page,
101
  'min' => '-1',
102
  'help' => esc_html__( '-1 means all posts', 'themeisle-companion' ),
103
- ), $settings
 
104
  );
105
 
106
  // Columns
107
  FLBuilder::render_settings_field(
108
- 'columns', array(
 
109
  'type' => 'obfx_number',
110
  'label' => esc_html__( 'Number of columns', 'themeisle-companion' ),
111
  'default' => '3',
112
  'min' => '1',
113
  'max' => '5',
114
- ), $settings
 
115
  );
116
  ?>
117
  </table>
@@ -129,14 +143,16 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
129
 
130
  // Posts
131
  FLBuilder::render_settings_field(
132
- 'posts_' . $slug, array(
 
133
  'type' => 'suggest',
134
  'action' => 'fl_as_posts',
135
  'data' => $slug,
136
  'label' => $type->label,
137
  'help' => sprintf( esc_html__( 'Enter a list of %1$s.', 'themeisle-companion' ), $type->label ),
138
  'matching' => true,
139
- ), $settings
 
140
  );
141
 
142
  // Taxonomies
@@ -145,14 +161,16 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
145
  foreach ( $taxonomies as $tax_slug => $tax ) {
146
 
147
  FLBuilder::render_settings_field(
148
- 'tax_' . $slug . '_' . $tax_slug, array(
 
149
  'type' => 'suggest',
150
  'action' => 'fl_as_terms',
151
  'data' => $tax_slug,
152
  'label' => $tax->label,
153
  'help' => sprintf( esc_html__( 'Enter a list of %1$s.', 'themeisle-companion' ), $tax->label ),
154
  'matching' => true,
155
- ), $settings
 
156
  );
157
  }
158
 
@@ -164,13 +182,15 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
164
 
165
  // Author
166
  FLBuilder::render_settings_field(
167
- 'users', array(
 
168
  'type' => 'suggest',
169
  'action' => 'fl_as_users',
170
  'label' => esc_html__( 'Authors', 'themeisle-companion' ),
171
  'help' => esc_html__( 'Enter a list of authors usernames.', 'themeisle-companion' ),
172
  'matching' => true,
173
- ), $settings
 
174
  );
175
 
176
  ?>
@@ -183,7 +203,8 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
183
  <?php
184
  // Vertical align
185
  FLBuilder::render_settings_field(
186
- 'card_vertical_align', array(
 
187
  'type' => 'select',
188
  'label' => esc_html__( 'Vertical align', 'themeisle-companion' ),
189
  'default' => 'grid',
@@ -192,12 +213,14 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
192
  'middle' => esc_html__( 'Middle', 'themeisle-companion' ),
193
  'bottom' => esc_html__( 'Bottom', 'themeisle-companion' ),
194
  ),
195
- ), $settings
 
196
  );
197
 
198
  // Display type
199
  FLBuilder::render_settings_field(
200
- 'display_type', array(
 
201
  'type' => 'select',
202
  'label' => esc_html__( 'Display type', 'themeisle-companion' ),
203
  'default' => 'grid',
@@ -205,40 +228,48 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
205
  'grid' => esc_html__( 'Grid', 'themeisle-companion' ),
206
  'list' => esc_html__( 'List', 'themeisle-companion' ),
207
  ),
208
- ), $settings
 
209
  );
210
 
211
  // Card layout
212
  FLBuilder::render_settings_field(
213
- 'card_layout', array(
 
214
  'type' => 'obfx_toggle',
215
  'label' => esc_html__( 'Card layout', 'themeisle-companion' ),
216
- ), $settings
 
217
  );
218
 
219
  // Padding top
220
  FLBuilder::render_settings_field(
221
- 'card_margin_top', array(
 
222
  'type' => 'obfx_number',
223
  'label' => esc_html__( 'Margin top', 'themeisle-companion' ),
224
  'default' => '0',
225
  'min' => '0',
226
- ), $settings
 
227
  );
228
 
229
  // Padding bottom
230
  FLBuilder::render_settings_field(
231
- 'card_margin_bottom', array(
 
232
  'type' => 'obfx_number',
233
  'label' => esc_html__( 'Margin bottom', 'themeisle-companion' ),
234
  'default' => '30',
235
  'min' => '0',
236
- ), $settings
 
237
  );
238
 
239
  // Background color
240
  FLBuilder::render_settings_field(
241
- 'post_bg_color', array(
 
242
  'type' => 'color',
243
  'label' => __( 'Background color', 'themeisle-companion' ),
244
  'show_reset' => true,
@@ -249,12 +280,14 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
249
  'property' => 'background-color',
250
  ),
251
 
252
- ), $settings
 
253
  );
254
 
255
  // Link color
256
  FLBuilder::render_settings_field(
257
- 'post_link_color', array(
 
258
  'type' => 'color',
259
  'label' => __( 'Link color', 'themeisle-companion' ),
260
  'show_reset' => true,
@@ -263,12 +296,14 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
263
  'selector' => '.obfx-post-grid a, .obfx-post-grid-pagination a',
264
  'property' => 'color',
265
  ),
266
- ), $settings
 
267
  );
268
 
269
  // Link color
270
  FLBuilder::render_settings_field(
271
- 'post_text_color', array(
 
272
  'type' => 'color',
273
  'label' => __( 'Text color', 'themeisle-companion' ),
274
  'show_reset' => true,
@@ -277,7 +312,8 @@ do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custo
277
  'selector' => '.obfx-post-grid, .obfx-post-grid-pagination',
278
  'property' => 'color',
279
  ),
280
- ), $settings
 
281
  );
282
  ?>
283
  </table>
27
 
28
  // Post type
29
  FLBuilder::render_settings_field(
30
+ 'post_type',
31
+ array(
32
  'type' => 'post-type',
33
  'label' => esc_html__( 'Post Type', 'themeisle-companion' ),
34
+ ),
35
+ $settings
36
  );
37
 
38
  // Order
39
  FLBuilder::render_settings_field(
40
+ 'order',
41
+ array(
42
  'type' => 'select',
43
  'label' => esc_html__( 'Order', 'themeisle-companion' ),
44
  'options' => array(
45
  'DESC' => esc_html__( 'Descending', 'themeisle-companion' ),
46
  'ASC' => esc_html__( 'Ascending', 'themeisle-companion' ),
47
  ),
48
+ ),
49
+ $settings
50
  );
51
 
52
  // Order by
53
  FLBuilder::render_settings_field(
54
+ 'order_by',
55
+ array(
56
  'type' => 'select',
57
  'label' => esc_html__( 'Order By', 'themeisle-companion' ),
58
  'options' => array(
75
  'fields' => array( 'order_by_meta_key' ),
76
  ),
77
  ),
78
+ ),
79
+ $settings
80
  );
81
 
82
  // Meta Key
83
  FLBuilder::render_settings_field(
84
+ 'order_by_meta_key',
85
+ array(
86
  'type' => 'text',
87
  'label' => esc_html__( 'Meta Key', 'themeisle-companion' ),
88
+ ),
89
+ $settings
90
  );
91
 
92
  // Offset
93
  FLBuilder::render_settings_field(
94
+ 'offset',
95
+ array(
96
  'type' => 'text',
97
  'label' => _x( 'Offset', 'How many posts to skip.', 'themeisle-companion' ),
98
  'default' => '0',
99
  'size' => '4',
100
  'help' => esc_html__( 'Skip this many posts that match the specified criteria.', 'themeisle-companion' ),
101
+ ),
102
+ $settings
103
  );
104
 
105
  // Posts per page
106
  FLBuilder::render_settings_field(
107
+ 'posts_per_page',
108
+ array(
109
  'type' => 'obfx_number',
110
  'label' => esc_html__( 'Posts per page', 'themeisle-companion' ),
111
  'default' => $default_posts_per_page,
112
  'min' => '-1',
113
  'help' => esc_html__( '-1 means all posts', 'themeisle-companion' ),
114
+ ),
115
+ $settings
116
  );
117
 
118
  // Columns
119
  FLBuilder::render_settings_field(
120
+ 'columns',
121
+ array(
122
  'type' => 'obfx_number',
123
  'label' => esc_html__( 'Number of columns', 'themeisle-companion' ),
124
  'default' => '3',
125
  'min' => '1',
126
  'max' => '5',
127
+ ),
128
+ $settings
129
  );
130
  ?>
131
  </table>
143
 
144
  // Posts
145
  FLBuilder::render_settings_field(
146
+ 'posts_' . $slug,
147
+ array(
148
  'type' => 'suggest',
149
  'action' => 'fl_as_posts',
150
  'data' => $slug,
151
  'label' => $type->label,
152
  'help' => sprintf( esc_html__( 'Enter a list of %1$s.', 'themeisle-companion' ), $type->label ),
153
  'matching' => true,
154
+ ),
155
+ $settings
156
  );
157
 
158
  // Taxonomies
161
  foreach ( $taxonomies as $tax_slug => $tax ) {
162
 
163
  FLBuilder::render_settings_field(
164
+ 'tax_' . $slug . '_' . $tax_slug,
165
+ array(
166
  'type' => 'suggest',
167
  'action' => 'fl_as_terms',
168
  'data' => $tax_slug,
169
  'label' => $tax->label,
170
  'help' => sprintf( esc_html__( 'Enter a list of %1$s.', 'themeisle-companion' ), $tax->label ),
171
  'matching' => true,
172
+ ),
173
+ $settings
174
  );
175
  }
176
 
182
 
183
  // Author
184
  FLBuilder::render_settings_field(
185
+ 'users',
186
+ array(
187
  'type' => 'suggest',
188
  'action' => 'fl_as_users',
189
  'label' => esc_html__( 'Authors', 'themeisle-companion' ),
190
  'help' => esc_html__( 'Enter a list of authors usernames.', 'themeisle-companion' ),
191
  'matching' => true,
192
+ ),
193
+ $settings
194
  );
195
 
196
  ?>
203
  <?php
204
  // Vertical align
205
  FLBuilder::render_settings_field(
206
+ 'card_vertical_align',
207
+ array(
208
  'type' => 'select',
209
  'label' => esc_html__( 'Vertical align', 'themeisle-companion' ),
210
  'default' => 'grid',
213
  'middle' => esc_html__( 'Middle', 'themeisle-companion' ),
214
  'bottom' => esc_html__( 'Bottom', 'themeisle-companion' ),
215
  ),
216
+ ),
217
+ $settings
218
  );
219
 
220
  // Display type
221
  FLBuilder::render_settings_field(
222
+ 'display_type',
223
+ array(
224
  'type' => 'select',
225
  'label' => esc_html__( 'Display type', 'themeisle-companion' ),
226
  'default' => 'grid',
228
  'grid' => esc_html__( 'Grid', 'themeisle-companion' ),
229
  'list' => esc_html__( 'List', 'themeisle-companion' ),
230
  ),
231
+ ),
232
+ $settings
233
  );
234
 
235
  // Card layout
236
  FLBuilder::render_settings_field(
237
+ 'card_layout',
238
+ array(
239
  'type' => 'obfx_toggle',
240
  'label' => esc_html__( 'Card layout', 'themeisle-companion' ),
241
+ ),
242
+ $settings
243
  );
244
 
245
  // Padding top
246
  FLBuilder::render_settings_field(
247
+ 'card_margin_top',
248
+ array(
249
  'type' => 'obfx_number',
250
  'label' => esc_html__( 'Margin top', 'themeisle-companion' ),
251
  'default' => '0',
252
  'min' => '0',
253
+ ),
254
+ $settings
255
  );
256
 
257
  // Padding bottom
258
  FLBuilder::render_settings_field(
259
+ 'card_margin_bottom',
260
+ array(
261
  'type' => 'obfx_number',
262
  'label' => esc_html__( 'Margin bottom', 'themeisle-companion' ),
263
  'default' => '30',
264
  'min' => '0',
265
+ ),
266
+ $settings
267
  );
268
 
269
  // Background color
270
  FLBuilder::render_settings_field(
271
+ 'post_bg_color',
272
+ array(
273
  'type' => 'color',
274
  'label' => __( 'Background color', 'themeisle-companion' ),
275
  'show_reset' => true,
280
  'property' => 'background-color',
281
  ),
282
 
283
+ ),
284
+ $settings
285
  );
286
 
287
  // Link color
288
  FLBuilder::render_settings_field(
289
+ 'post_link_color',
290
+ array(
291
  'type' => 'color',
292
  'label' => __( 'Link color', 'themeisle-companion' ),
293
  'show_reset' => true,
296
  'selector' => '.obfx-post-grid a, .obfx-post-grid-pagination a',
297
  'property' => 'color',
298
  ),
299
+ ),
300
+ $settings
301
  );
302
 
303
  // Link color
304
  FLBuilder::render_settings_field(
305
+ 'post_text_color',
306
+ array(
307
  'type' => 'color',
308
  'label' => __( 'Text color', 'themeisle-companion' ),
309
  'show_reset' => true,
312
  'selector' => '.obfx-post-grid, .obfx-post-grid-pagination',
313
  'property' => 'color',
314
  ),
315
+ ),
316
+ $settings
317
  );
318
  ?>
319
  </table>
obfx_modules/beaver-widgets/modules/post-grid/post-grid.php CHANGED
@@ -46,7 +46,8 @@ if ( ! empty( $image_sizes ) ) {
46
  }
47
  }
48
  FLBuilder::register_module(
49
- 'PostGridModule', array(
 
50
  'loop_settings' => array(
51
  'title' => esc_html__( 'Loop Settings', 'themeisle-companion' ),
52
  'file' => BEAVER_WIDGETS_PATH . 'modules/post-grid/includes/loop-settings.php',
46
  }
47
  }
48
  FLBuilder::register_module(
49
+ 'PostGridModule',
50
+ array(
51
  'loop_settings' => array(
52
  'title' => esc_html__( 'Loop Settings', 'themeisle-companion' ),
53
  'file' => BEAVER_WIDGETS_PATH . 'modules/post-grid/includes/loop-settings.php',
obfx_modules/beaver-widgets/modules/pricing-table/pricing-table.php CHANGED
@@ -44,7 +44,8 @@ class PricingTableModule extends FLBuilderModule {
44
  * Register the module and its form settings.
45
  */
46
  FLBuilder::register_module(
47
- 'PricingTableModule', array(
 
48
  'content' => array(
49
  'title' => esc_html__( 'Content', 'themeisle-companion' ), // Tab title
50
  'sections' => array(
@@ -556,7 +557,8 @@ FLBuilder::register_module(
556
 
557
 
558
  FLBuilder::register_settings_form(
559
- 'feature_field', array(
 
560
  'title' => __( 'Feature', 'themeisle-companion' ),
561
  'tabs' => array(
562
  'general' => array(
44
  * Register the module and its form settings.
45
  */
46
  FLBuilder::register_module(
47
+ 'PricingTableModule',
48
+ array(
49
  'content' => array(
50
  'title' => esc_html__( 'Content', 'themeisle-companion' ), // Tab title
51
  'sections' => array(
557
 
558
 
559
  FLBuilder::register_settings_form(
560
+ 'feature_field',
561
+ array(
562
  'title' => __( 'Feature', 'themeisle-companion' ),
563
  'tabs' => array(
564
  'general' => array(
obfx_modules/beaver-widgets/modules/services/services.php CHANGED
@@ -42,7 +42,8 @@ class ServicesModule extends FLBuilderModule {
42
  * Register the module and its form settings.
43
  */
44
  FLBuilder::register_module(
45
- 'ServicesModule', array(
 
46
  'content' => array(
47
  'title' => esc_html__( 'Content', 'themeisle-companion' ), // Tab title
48
  'sections' => array(
@@ -214,7 +215,8 @@ FLBuilder::register_module(
214
  );
215
 
216
  FLBuilder::register_settings_form(
217
- 'service_content', array(
 
218
  'title' => __( 'Service', 'themeisle-companion' ),
219
  'tabs' => array(
220
  'general' => array(
42
  * Register the module and its form settings.
43
  */
44
  FLBuilder::register_module(
45
+ 'ServicesModule',
46
+ array(
47
  'content' => array(
48
  'title' => esc_html__( 'Content', 'themeisle-companion' ), // Tab title
49
  'sections' => array(
215
  );
216
 
217
  FLBuilder::register_settings_form(
218
+ 'service_content',
219
+ array(
220
  'title' => __( 'Service', 'themeisle-companion' ),
221
  'tabs' => array(
222
  'general' => array(
obfx_modules/image-cdn/inc/class-orbit-fox-connector.php CHANGED
@@ -151,7 +151,7 @@ class Connector {
151
 
152
  $("#obfx_connect_api_key").val(response.data.api_key);
153
  $("#obfx-img-display-name").text(response.data.display_name);
154
- $("#obfx-img-cdn-url").text(response.data.image_cdn.key + '.i.orbitfox.com');
155
  $("#obfx-img-traffic-usage").text((parseInt(response.data.image_cdn.usage) / 1000).toFixed(3) + 'GB');
156
  $(".obfx-img-traffic-quota").text((parseInt(response.data.image_cdn.quota) / 1000).toFixed(0) + 'GB');
157
  elements.addClass('obfx-img-logged-in');
151
 
152
  $("#obfx_connect_api_key").val(response.data.api_key);
153
  $("#obfx-img-display-name").text(response.data.display_name);
154
+ $("#obfx-img-cdn-url").text(response.data.image_cdn.key + '.i.optimole.com');
155
  $("#obfx-img-traffic-usage").text((parseInt(response.data.image_cdn.usage) / 1000).toFixed(3) + 'GB');
156
  $(".obfx-img-traffic-quota").text((parseInt(response.data.image_cdn.quota) / 1000).toFixed(0) + 'GB');
157
  elements.addClass('obfx-img-logged-in');
obfx_modules/image-cdn/inc/class-orbit-fox-image-replacer.php CHANGED
@@ -16,15 +16,22 @@ class Image_CDN_Replacer {
16
  */
17
  protected static $instance = null;
18
 
 
 
 
 
 
 
 
19
  /**
20
  * A list of allowd extensions.
21
  *
22
  * @var array
23
  */
24
  protected static $extensions = array(
25
- 'jpg',
26
- 'webp',
27
- 'png',
28
  );
29
 
30
  /**
@@ -34,7 +41,6 @@ class Image_CDN_Replacer {
34
  */
35
  protected static $image_sizes;
36
 
37
- // @TODO provide a filter for this
38
  /**
39
  * Te cdn url, it will be build on the run.
40
  *
@@ -43,25 +49,25 @@ class Image_CDN_Replacer {
43
  protected $cdn_url = null;
44
 
45
  /**
46
- * A data holder.
47
  *
48
  * @var null
49
  */
50
- protected $connect_data = null;
51
 
52
  /**
53
  * Defines which is the maximum width accepted in the optimization process.
54
  *
55
  * @var int
56
  */
57
- protected $max_width = 2000;
58
 
59
  /**
60
  * Defines which is the maximum width accepted in the optimization process.
61
  *
62
  * @var int
63
  */
64
- protected $max_height = 2000;
65
 
66
  /**
67
  * Holds the real images sizes as an array.
@@ -100,10 +106,11 @@ class Image_CDN_Replacer {
100
  function init() {
101
  $this->set_properties();
102
 
103
- add_filter( 'image_downsize', array( $this, 'filter_image_downsize' ), 10, 3 );
104
- add_filter( 'the_content', array( $this, 'filter_the_content' ), 999999 );
105
- add_filter( 'wp_calculate_image_srcset', array( $this, 'filter_srcset_attr' ), 10, 5 );
106
  add_filter( 'init', array( $this, 'filter_options_and_mods' ) );
 
107
  }
108
 
109
  /**
@@ -121,15 +128,74 @@ class Image_CDN_Replacer {
121
  if ( empty( $this->connect_data['image_cdn'] ) ) {
122
  return;
123
  }
124
-
125
  $this->cdn_url = sprintf(
126
- 'https://%s.%s/%s',
127
  strtolower( $this->connect_data['image_cdn']['key'] ),
128
- 'i.orbitfox.com',
129
- 'i' // api root; almost like /wp-json/
 
 
 
 
 
 
 
 
 
 
 
130
  );
131
  }
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  /**
134
  * This filter will replace all the images retrieved via "wp_get_image" type of functions.
135
  *
@@ -154,8 +220,8 @@ class Image_CDN_Replacer {
154
 
155
  // default size
156
  $sizes = array(
157
- 'width' => $image_meta['width'],
158
- 'height' => $image_meta['height'],
159
  );
160
 
161
  // in case there is a custom image size $size will be an array.
@@ -264,7 +330,7 @@ class Image_CDN_Replacer {
264
  if (
265
  doing_filter( 'the_content' )
266
  && isset( $GLOBALS['content_width'] )
267
- && apply_filters( 'obfx_imgcdn_allow_resize_images_from_content_width', true )
268
  ) {
269
  $content_width = (int) $GLOBALS['content_width'];
270
 
@@ -279,7 +345,7 @@ class Image_CDN_Replacer {
279
  // we need to remember how much in percentage the width was resized and apply the same treatment to the height.
280
  $percentWidth = ( 1 - $this->max_width / $width ) * 100;
281
  $width = $this->max_width;
282
- $height = round( $height * ( ( 100 - $percentWidth ) / 100 ), 2 );
283
  }
284
 
285
  // now for the height
@@ -287,7 +353,7 @@ class Image_CDN_Replacer {
287
  $percentHeight = ( 1 - $this->max_height / $height ) * 100;
288
  // if we reduce the height to max_height by $x percentage than we'll also reduce the width for the same amount.
289
  $height = $this->max_height;
290
- $width = round( $width * ( ( 100 - $percentHeight ) / 100 ), 2 );
291
  }
292
 
293
  return array(
@@ -306,15 +372,7 @@ class Image_CDN_Replacer {
306
  */
307
  protected function get_imgcdn_url( $url, $args = array( 'width' => 'auto', 'height' => 'auto' ) ) {
308
 
309
- $mimes = array(
310
- 'jpg|jpeg|jpe' => 'image/jpeg',
311
- 'png' => 'image/png',
312
- 'webp' => 'image/webp',
313
- );
314
-
315
- $type = wp_check_filetype( $url, $mimes );
316
-
317
- if ( ! isset( $type['ext'] ) || empty( $type['ext'] ) ) {
318
  return $url;
319
  }
320
  // not used yet.
@@ -330,15 +388,17 @@ class Image_CDN_Replacer {
330
  $args['height'] = round( $args['height'], 0 );
331
  }
332
  $payload = array(
333
- 'path' => $this->urlception_encode( $path ),
334
- 'scheme' => $scheme,
335
- 'width' => (string) $args['width'],
336
- 'height' => (string) $args['height'],
337
- 'compress' => $compress_level,
338
- 'secret' => $this->connect_data['image_cdn']['secret'],
339
  );
 
340
 
341
- $hash = md5( json_encode( $payload ) );
 
 
342
 
343
  $new_url = sprintf(
344
  '%s/%s/%s/%s/%s/%s/%s',
@@ -346,7 +406,7 @@ class Image_CDN_Replacer {
346
  $hash,
347
  (string) $args['width'],
348
  (string) $args['height'],
349
- $compress_level,
350
  $scheme,
351
  $path
352
  );
@@ -368,12 +428,10 @@ class Image_CDN_Replacer {
368
  }
369
 
370
  /**
371
- * Identify images in post content, and if images are local (uploaded to the current site), pass through Photon.
372
  *
373
  * @param string $content The post content which will be filtered.
374
  *
375
- * @uses self::validate_image_url, apply_filters, jetpack_photon_url, esc_url
376
- * @filter the_content<
377
  * @return string
378
  */
379
  public function filter_the_content( $content ) {
@@ -384,17 +442,16 @@ class Image_CDN_Replacer {
384
  }
385
 
386
  $image_sizes = self::image_sizes();
387
-
388
  foreach ( $images[0] as $index => $tag ) {
389
  $width = $height = false;
390
  $new_tag = $tag;
391
  $src = $images['img_url'][ $index ];
392
 
393
- if ( apply_filters( 'obfx_imgcdn_disable_optimization_for_link', false, $src ) ) {
394
  continue;
395
  }
396
 
397
- if ( false !== strpos( $src, 'i.orbitfox.com' ) ) {
398
  continue; // we already have this
399
  }
400
 
@@ -425,11 +482,14 @@ class Image_CDN_Replacer {
425
  }
426
 
427
  $new_sizes = $this->validate_image_sizes( $width, $height );
428
- $new_url = $this->get_imgcdn_url( $src, $new_sizes );
 
429
 
430
  // replace the url in hrefs or links
431
  if ( ! empty( $images['link_url'][ $index ] ) ) {
432
- $new_tag = preg_replace( '#(href=["|\'])' . $images['link_url'][ $index ] . '(["|\'])#i', '\1' . $new_url . '\2', $tag, 1 );
 
 
433
  }
434
 
435
  // replace the new sizes
@@ -485,7 +545,8 @@ class Image_CDN_Replacer {
485
  if ( ! is_array( $sources ) ) {
486
  return $sources;
487
  }
488
-
 
489
  foreach ( $sources as $i => $source ) {
490
 
491
  list( $width, $height ) = self::parse_dimensions_from_filename( $source['url'] );
@@ -500,12 +561,18 @@ class Image_CDN_Replacer {
500
 
501
  $new_sizes = $this->validate_image_sizes( $width, $height );
502
  $new_url = $this->get_imgcdn_url( $source['url'], $new_sizes );
 
 
 
 
 
 
 
503
 
504
- $sources[ $i ]['url'] = $new_url;
505
- if ( $sources[ $i ]['descriptor'] ) {
506
- $sources[ $i ]['value'] = $new_sizes['width'];
507
  } else {
508
- $sources[ $i ]['value'] = $new_sizes['height'];
509
  }
510
  }
511
 
@@ -521,8 +588,8 @@ class Image_CDN_Replacer {
521
  */
522
  public static function parse_dimensions_from_filename( $src ) {
523
  $width_height_string = array();
524
-
525
- if ( preg_match( '#-(\d+)x(\d+)\.(?:' . implode( '|', self::$extensions ) . '){1}$#i', $src, $width_height_string ) ) {
526
  $width = (int) $width_height_string[1];
527
  $height = (int) $width_height_string[2];
528
 
@@ -539,13 +606,14 @@ class Image_CDN_Replacer {
539
  */
540
  public function filter_options_and_mods() {
541
  /**
542
- * `obfx_imgcdn_options_with_url` is a filter that allows themes or plugins to select which option
543
  * holds an url and needs an optimization.
544
  */
545
  $theme_slug = get_option( 'stylesheet' );
546
 
547
  $options_list = apply_filters(
548
- 'obfx_imgcdn_options_with_url', array(
 
549
  "theme_mods_$theme_slug",
550
  )
551
  );
@@ -564,13 +632,12 @@ class Image_CDN_Replacer {
564
  *
565
  * @param string $url The url which should be replaced.
566
  *
567
- * @return array|mixed|object|string|void
568
  */
569
  public function replace_option_url( $url ) {
570
  if ( empty( $url ) ) {
571
  return $url;
572
  }
573
-
574
  // $url might be an array or an json encoded array with urls.
575
  if ( is_array( $url ) || filter_var( $url, FILTER_VALIDATE_URL ) === false ) {
576
  $array = $url;
@@ -637,5 +704,4 @@ class Image_CDN_Replacer {
637
  // Unserializing instances of the class is forbidden.
638
  _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin&#8217; huh?', 'themeisle-companion' ), '1.0.0' );
639
  }
640
-
641
  }
16
  */
17
  protected static $instance = null;
18
 
19
+
20
+ /**
21
+ * A data holder.
22
+ *
23
+ * @var null
24
+ */
25
+ protected $connect_data = null;
26
  /**
27
  * A list of allowd extensions.
28
  *
29
  * @var array
30
  */
31
  protected static $extensions = array(
32
+ 'jpg|jpeg|jpe' => 'image/jpeg',
33
+ 'png' => 'image/png',
34
+ 'webp' => 'image/webp',
35
  );
36
 
37
  /**
41
  */
42
  protected static $image_sizes;
43
 
 
44
  /**
45
  * Te cdn url, it will be build on the run.
46
  *
49
  protected $cdn_url = null;
50
 
51
  /**
52
+ * A secret key to encode payload.
53
  *
54
  * @var null
55
  */
56
+ protected $cdn_secret = null;
57
 
58
  /**
59
  * Defines which is the maximum width accepted in the optimization process.
60
  *
61
  * @var int
62
  */
63
+ protected $max_width = 3000;
64
 
65
  /**
66
  * Defines which is the maximum width accepted in the optimization process.
67
  *
68
  * @var int
69
  */
70
+ protected $max_height = 3000;
71
 
72
  /**
73
  * Holds the real images sizes as an array.
106
  function init() {
107
  $this->set_properties();
108
 
109
+ add_filter( 'image_downsize', array( $this, 'filter_image_downsize' ), PHP_INT_MAX, 3 );
110
+ add_filter( 'the_content', array( $this, 'filter_the_content' ), PHP_INT_MAX );
111
+ add_filter( 'wp_calculate_image_srcset', array( $this, 'filter_srcset_attr' ), PHP_INT_MAX, 5 );
112
  add_filter( 'init', array( $this, 'filter_options_and_mods' ) );
113
+ add_action( 'init', array( $this, 'init_html_replacer' ), PHP_INT_MAX );
114
  }
115
 
116
  /**
128
  if ( empty( $this->connect_data['image_cdn'] ) ) {
129
  return;
130
  }
131
+ $this->cdn_secret = $this->connect_data['image_cdn']['secret'];
132
  $this->cdn_url = sprintf(
133
+ 'https://%s.%s',
134
  strtolower( $this->connect_data['image_cdn']['key'] ),
135
+ 'i.optimole.com'
136
+ );
137
+ }
138
+
139
+ /**
140
+ * Init html replacer handler.
141
+ */
142
+ public function init_html_replacer() {
143
+ if ( is_admin() ) {
144
+ return;
145
+ }
146
+ ob_start(
147
+ array( &$this, 'filter_raw_content' )
148
  );
149
  }
150
 
151
+ /**
152
+ * Filter raw content for urls.
153
+ *
154
+ * @param string $html HTML to filter.
155
+ *
156
+ * @return mixed Filtered content.
157
+ */
158
+ public function filter_raw_content( $html ) {
159
+ $urls = wp_extract_urls( $html );
160
+ $cdn_url = $this->cdn_url;
161
+ $site_url = get_site_url();
162
+ $urls = array_filter(
163
+ $urls,
164
+ function ( $url ) use ( $cdn_url, $site_url ) {
165
+ if ( strpos( $url, $cdn_url ) !== false ) {
166
+ return false;
167
+ }
168
+ if ( strpos( $url, $site_url ) === false ) {
169
+ return false;
170
+ }
171
+
172
+ return $this->check_mimetype( $url );
173
+ }
174
+ );
175
+ $new_urls = array_map( array( $this, 'get_imgcdn_url' ), $urls );
176
+
177
+ return str_replace( $urls, $new_urls, $html );
178
+ }
179
+
180
+ /**
181
+ * Check url mimetype.
182
+ *
183
+ * @param string $url Url to check.
184
+ *
185
+ * @return bool Is a valid image url or not.
186
+ */
187
+ private function check_mimetype( $url ) {
188
+
189
+ $mimes = self::$extensions;
190
+ $type = wp_check_filetype( $url, $mimes );
191
+
192
+ if ( ! isset( $type['ext'] ) || empty( $type['ext'] ) ) {
193
+ return false;
194
+ }
195
+
196
+ return true;
197
+ }
198
+
199
  /**
200
  * This filter will replace all the images retrieved via "wp_get_image" type of functions.
201
  *
220
 
221
  // default size
222
  $sizes = array(
223
+ 'width' => isset( $image_meta['width'] ) ? $image_meta['width'] : 'auto',
224
+ 'height' => isset( $image_meta['height'] ) ? $image_meta['height'] : 'auto',
225
  );
226
 
227
  // in case there is a custom image size $size will be an array.
330
  if (
331
  doing_filter( 'the_content' )
332
  && isset( $GLOBALS['content_width'] )
333
+ && apply_filters( 'optml_imgcdn_allow_resize_images_from_content_width', true )
334
  ) {
335
  $content_width = (int) $GLOBALS['content_width'];
336
 
345
  // we need to remember how much in percentage the width was resized and apply the same treatment to the height.
346
  $percentWidth = ( 1 - $this->max_width / $width ) * 100;
347
  $width = $this->max_width;
348
+ $height = round( $height * ( ( 100 - $percentWidth ) / 100 ), 0 );
349
  }
350
 
351
  // now for the height
353
  $percentHeight = ( 1 - $this->max_height / $height ) * 100;
354
  // if we reduce the height to max_height by $x percentage than we'll also reduce the width for the same amount.
355
  $height = $this->max_height;
356
+ $width = round( $width * ( ( 100 - $percentHeight ) / 100 ), 0 );
357
  }
358
 
359
  return array(
372
  */
373
  protected function get_imgcdn_url( $url, $args = array( 'width' => 'auto', 'height' => 'auto' ) ) {
374
 
375
+ if ( ! $this->check_mimetype( $url ) ) {
 
 
 
 
 
 
 
 
376
  return $url;
377
  }
378
  // not used yet.
388
  $args['height'] = round( $args['height'], 0 );
389
  }
390
  $payload = array(
391
+ 'path' => $this->urlception_encode( $path ),
392
+ 'scheme' => $scheme,
393
+ 'width' => (string) $args['width'],
394
+ 'height' => (string) $args['height'],
395
+ 'quality' => (string) $compress_level,
 
396
  );
397
+ ksort( $payload );
398
 
399
+ $values = array_values( $payload );
400
+ $payload = implode( '', $values );
401
+ $hash = hash_hmac( 'md5', $payload, $this->cdn_secret );
402
 
403
  $new_url = sprintf(
404
  '%s/%s/%s/%s/%s/%s/%s',
406
  $hash,
407
  (string) $args['width'],
408
  (string) $args['height'],
409
+ (string) $compress_level,
410
  $scheme,
411
  $path
412
  );
428
  }
429
 
430
  /**
431
+ * Identify images in post content.
432
  *
433
  * @param string $content The post content which will be filtered.
434
  *
 
 
435
  * @return string
436
  */
437
  public function filter_the_content( $content ) {
442
  }
443
 
444
  $image_sizes = self::image_sizes();
 
445
  foreach ( $images[0] as $index => $tag ) {
446
  $width = $height = false;
447
  $new_tag = $tag;
448
  $src = $images['img_url'][ $index ];
449
 
450
+ if ( apply_filters( 'optml_imgcdn_disable_optimization_for_link', false, $src ) ) {
451
  continue;
452
  }
453
 
454
+ if ( false !== strpos( $src, 'i.optimole.com' ) ) {
455
  continue; // we already have this
456
  }
457
 
482
  }
483
 
484
  $new_sizes = $this->validate_image_sizes( $width, $height );
485
+
486
+ $new_url = $this->get_imgcdn_url( $src, $new_sizes );
487
 
488
  // replace the url in hrefs or links
489
  if ( ! empty( $images['link_url'][ $index ] ) ) {
490
+ if ( $this->check_mimetype( $images['link_url'][ $index ] ) ) {
491
+ $new_tag = preg_replace( '#(href=["|\'])' . $images['link_url'][ $index ] . '(["|\'])#i', '\1' . $new_url . '\2', $tag, 1 );
492
+ }
493
  }
494
 
495
  // replace the new sizes
545
  if ( ! is_array( $sources ) ) {
546
  return $sources;
547
  }
548
+ $used = array();
549
+ $new_sources = array();
550
  foreach ( $sources as $i => $source ) {
551
 
552
  list( $width, $height ) = self::parse_dimensions_from_filename( $source['url'] );
561
 
562
  $new_sizes = $this->validate_image_sizes( $width, $height );
563
  $new_url = $this->get_imgcdn_url( $source['url'], $new_sizes );
564
+ if ( isset( $used[ md5( $new_url ) ] ) ) {
565
+ continue;
566
+ }
567
+
568
+ $used[ md5( $new_url ) ] = true;
569
+ $new_sources[ $i ] = $sources[ $i ];
570
+ $new_sources[ $i ]['url'] = $new_url;
571
 
572
+ if ( $new_sources[ $i ]['descriptor'] ) {
573
+ $new_sources[ $i ]['value'] = $new_sizes['width'];
 
574
  } else {
575
+ $new_sources[ $i ]['value'] = $new_sizes['height'];
576
  }
577
  }
578
 
588
  */
589
  public static function parse_dimensions_from_filename( $src ) {
590
  $width_height_string = array();
591
+ $extensions = array_keys( self::$extensions );
592
+ if ( preg_match( '#-(\d+)x(\d+)\.(?:' . implode( '|', $extensions ) . '){1}$#i', $src, $width_height_string ) ) {
593
  $width = (int) $width_height_string[1];
594
  $height = (int) $width_height_string[2];
595
 
606
  */
607
  public function filter_options_and_mods() {
608
  /**
609
+ * `optml_imgcdn_options_with_url` is a filter that allows themes or plugins to select which option
610
  * holds an url and needs an optimization.
611
  */
612
  $theme_slug = get_option( 'stylesheet' );
613
 
614
  $options_list = apply_filters(
615
+ 'optml_imgcdn_options_with_url',
616
+ array(
617
  "theme_mods_$theme_slug",
618
  )
619
  );
632
  *
633
  * @param string $url The url which should be replaced.
634
  *
635
+ * @return string Replaced url.
636
  */
637
  public function replace_option_url( $url ) {
638
  if ( empty( $url ) ) {
639
  return $url;
640
  }
 
641
  // $url might be an array or an json encoded array with urls.
642
  if ( is_array( $url ) || filter_var( $url, FILTER_VALIDATE_URL ) === false ) {
643
  $array = $url;
704
  // Unserializing instances of the class is forbidden.
705
  _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin&#8217; huh?', 'themeisle-companion' ), '1.0.0' );
706
  }
 
707
  }
obfx_modules/image-cdn/init.php CHANGED
@@ -40,8 +40,8 @@ class Image_CDN_OBFX_Module extends Orbit_Fox_Module_Abstract {
40
  }
41
  $this->beta = true;
42
  $this->no_save = true;
43
- $this->name = __( 'Image Optimization &amp; CDN Module', 'themeisle-companion' );
44
- $this->description = __( 'Let us take care of you images sizes. With this feature we\'ll compress and resize every image on your website.<br/> <strong>* Requires account on orbitfox.com</strong>', 'themeisle-companion' );
45
  }
46
 
47
  /**
@@ -52,7 +52,7 @@ class Image_CDN_OBFX_Module extends Orbit_Fox_Module_Abstract {
52
  * @return bool
53
  */
54
  public function enable_module() {
55
- return ( $this->beta ) ? $this->is_lucky_user( 30 ) : true;
56
  }
57
 
58
  /**
@@ -96,16 +96,6 @@ class Image_CDN_OBFX_Module extends Orbit_Fox_Module_Abstract {
96
 
97
  return class_exists( '\OrbitFox\Connector' ) ? get_option( \OrbitFox\Connector::API_DATA_KEY, '' ) : '';
98
  }
99
- /**
100
- * Return api data.
101
- *
102
- * @return mixed|string APi data.
103
- */
104
- private function clear_api_data() {
105
-
106
-
107
- return update_option( \OrbitFox\Connector::API_DATA_KEY, '' );
108
- }
109
 
110
  /**
111
  * Render data from dashboard of orbitfox.com.
@@ -145,7 +135,7 @@ class Image_CDN_OBFX_Module extends Orbit_Fox_Module_Abstract {
145
  return '';
146
  }
147
 
148
- return sprintf( '%s.i.orbitfox.com', strtolower( $obfx_user_data['image_cdn']['key'] ) );
149
 
150
  }
151
 
@@ -301,6 +291,17 @@ class Image_CDN_OBFX_Module extends Orbit_Fox_Module_Abstract {
301
 
302
  }
303
 
 
 
 
 
 
 
 
 
 
 
 
304
  /**
305
  * Check if the image replacement is enabled.
306
  *
40
  }
41
  $this->beta = true;
42
  $this->no_save = true;
43
+ $this->name = __( 'Image Optimization &amp; CDN Module ', 'themeisle-companion' );
44
+ $this->description = __( 'Let us take care of your images sizes. With this feature we\'ll compress and resize every image on your website. <i>This service is powered by Optimole</i><br/> <strong>* Requires account on orbitfox.com</strong>', 'themeisle-companion' );
45
  }
46
 
47
  /**
52
  * @return bool
53
  */
54
  public function enable_module() {
55
+ return ( $this->beta ) ? $this->is_lucky_user( 50 ) : true;
56
  }
57
 
58
  /**
96
 
97
  return class_exists( '\OrbitFox\Connector' ) ? get_option( \OrbitFox\Connector::API_DATA_KEY, '' ) : '';
98
  }
 
 
 
 
 
 
 
 
 
 
99
 
100
  /**
101
  * Render data from dashboard of orbitfox.com.
135
  return '';
136
  }
137
 
138
+ return sprintf( '%s.i.optimole.com', strtolower( $obfx_user_data['image_cdn']['key'] ) );
139
 
140
  }
141
 
291
 
292
  }
293
 
294
+ /**
295
+ * Return api data.
296
+ *
297
+ * @return mixed|string APi data.
298
+ */
299
+ private function clear_api_data() {
300
+
301
+
302
+ return update_option( \OrbitFox\Connector::API_DATA_KEY, '' );
303
+ }
304
+
305
  /**
306
  * Check if the image replacement is enabled.
307
  *
obfx_modules/safe-updates/init.php CHANGED
@@ -29,7 +29,7 @@ class Safe_Updates_OBFX_Module extends Orbit_Fox_Module_Abstract {
29
  */
30
  public function __construct() {
31
  parent::__construct();
32
- $this->beta = true;
33
  $this->no_save = true;
34
  $this->name = __( 'Safe Updates', 'themeisle-companion' );
35
  $this->description = __( 'OrbitFox will give you visual feedback on how your current theme updates will affect your site. For the moment this is available only for wordpress.org themes.', 'themeisle-companion' );
@@ -43,6 +43,7 @@ class Safe_Updates_OBFX_Module extends Orbit_Fox_Module_Abstract {
43
  * @return bool
44
  */
45
  public function enable_module() {
 
46
  return ( $this->beta ) ? $this->is_lucky_user() : true;
47
  }
48
 
29
  */
30
  public function __construct() {
31
  parent::__construct();
32
+ $this->beta = false;
33
  $this->no_save = true;
34
  $this->name = __( 'Safe Updates', 'themeisle-companion' );
35
  $this->description = __( 'OrbitFox will give you visual feedback on how your current theme updates will affect your site. For the moment this is available only for wordpress.org themes.', 'themeisle-companion' );
43
  * @return bool
44
  */
45
  public function enable_module() {
46
+
47
  return ( $this->beta ) ? $this->is_lucky_user() : true;
48
  }
49
 
readme.md CHANGED
@@ -103,6 +103,13 @@ Activating the Orbit Fox plugin is just like any other plugin. If you've uploade
103
  5. Social Sharing Module
104
 
105
  ## Changelog ##
 
 
 
 
 
 
 
106
  ### 2.5.7 - 2018-08-13 ###
107
 
108
  * -fixed fatal error with Elementor extra widgets
103
  5. Social Sharing Module
104
 
105
  ## Changelog ##
106
+ ### 2.5.8 - 2018-09-12 ###
107
+
108
+ * Extend image optimization module for 50% of users.
109
+ * Enable safe updates for all users.
110
+ * Adds image optimization integration with Optimole.
111
+
112
+
113
  ### 2.5.7 - 2018-08-13 ###
114
 
115
  * -fixed fatal error with Elementor extra widgets
readme.txt CHANGED
@@ -103,6 +103,13 @@ Activating the Orbit Fox plugin is just like any other plugin. If you've uploade
103
  5. Social Sharing Module
104
 
105
  == Changelog ==
 
 
 
 
 
 
 
106
  = 2.5.7 - 2018-08-13 =
107
 
108
  * -fixed fatal error with Elementor extra widgets
103
  5. Social Sharing Module
104
 
105
  == Changelog ==
106
+ = 2.5.8 - 2018-09-12 =
107
+
108
+ * Extend image optimization module for 50% of users.
109
+ * Enable safe updates for all users.
110
+ * Adds image optimization integration with Optimole.
111
+
112
+
113
  = 2.5.7 - 2018-08-13 =
114
 
115
  * -fixed fatal error with Elementor extra widgets
themeisle-companion.php CHANGED
@@ -15,7 +15,7 @@
15
  * Plugin Name: Orbit Fox Companion
16
  * Plugin URI: https://orbitfox.com/
17
  * Description: This swiss-knife plugin comes with a quality template library, menu/sharing icons modules, and newly added Elementor/BeaverBuilder page builder widgets on each release.
18
- * Version: 2.5.7
19
  * Author: Themeisle
20
  * Author URI: https://orbitfox.com/
21
  * License: GPL-2.0+
@@ -71,7 +71,8 @@ function run_orbit_fox() {
71
  require_once $vendor_file;
72
  }
73
  add_filter(
74
- 'themeisle_sdk_products', function ( $products ) {
 
75
  $products[] = __FILE__;
76
 
77
  return $products;
@@ -79,7 +80,8 @@ function run_orbit_fox() {
79
  );
80
 
81
  add_filter(
82
- 'themeisle_companion_friendly_name', function( $name ) {
 
83
  return 'Orbit Fox';
84
  }
85
  );
15
  * Plugin Name: Orbit Fox Companion
16
  * Plugin URI: https://orbitfox.com/
17
  * Description: This swiss-knife plugin comes with a quality template library, menu/sharing icons modules, and newly added Elementor/BeaverBuilder page builder widgets on each release.
18
+ * Version: 2.5.8
19
  * Author: Themeisle
20
  * Author URI: https://orbitfox.com/
21
  * License: GPL-2.0+
71
  require_once $vendor_file;
72
  }
73
  add_filter(
74
+ 'themeisle_sdk_products',
75
+ function ( $products ) {
76
  $products[] = __FILE__;
77
 
78
  return $products;
80
  );
81
 
82
  add_filter(
83
+ 'themeisle_companion_friendly_name',
84
+ function( $name ) {
85
  return 'Orbit Fox';
86
  }
87
  );
themeisle-hash.json CHANGED
@@ -1 +1 @@
1
- {"class-autoloader.php":"57e533b653d235e76cb9953720e4f5e9","index.php":"39ab8276fb0e4bd3fcab3270822c5977","themeisle-companion.php":"957f2c6f9d7cb37a622ac1e5a4798e92","uninstall.php":"7abf753a29e0eb3a844c8a0ba9493b7c"}
1
+ {"class-autoloader.php":"57e533b653d235e76cb9953720e4f5e9","index.php":"39ab8276fb0e4bd3fcab3270822c5977","themeisle-companion.php":"4265fcd5c0f102fdc80ad3b4ca405574","uninstall.php":"7abf753a29e0eb3a844c8a0ba9493b7c"}
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInite2ebe98296207e7c5425999ef1a181be::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit874bfa5516b43214bcbbf7c9c47900dd::getLoader();
vendor/codeinwp/templates-directory/class-page-templates-directory.php CHANGED
@@ -14,7 +14,7 @@ if ( ! class_exists( '\ThemeIsle\PageTemplatesDirectory' ) ) {
14
  * The version of this library
15
  * @var string
16
  */
17
- public static $version = '1.0.5';
18
 
19
  /**
20
  * Holds the module slug.
@@ -256,6 +256,13 @@ if ( ! class_exists( '\ThemeIsle\PageTemplatesDirectory' ) ) {
256
  'screenshot' => esc_url( $this->get_source_url() . 'zerif-elementor/screenshot.jpg' ),
257
  'import_file' => esc_url( $this->get_source_url() . 'zerif-elementor/template.json' ),
258
  ),
 
 
 
 
 
 
 
259
  );
260
 
261
  foreach ( $templates_list as $template => $properties ) {
14
  * The version of this library
15
  * @var string
16
  */
17
+ public static $version = '1.0.6';
18
 
19
  /**
20
  * Holds the module slug.
256
  'screenshot' => esc_url( $this->get_source_url() . 'zerif-elementor/screenshot.jpg' ),
257
  'import_file' => esc_url( $this->get_source_url() . 'zerif-elementor/template.json' ),
258
  ),
259
+ 'notify' => array(
260
+ 'title' => __( 'Notify - Landing Page', 'themeisle-companion' ),
261
+ 'description' => __( 'A beautiful landing page to showcase your new application. It has a features section to present your app, a subscribe section where you can also add a video showcasing your new app and a testimonials section so you can present the feedback from your beta testers.', 'themeisle-companion' ),
262
+ 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/notify-elementor/',
263
+ 'screenshot' => esc_url( $this->get_source_url() . 'zerif-elementor/screenshot.jpg' ),
264
+ 'import_file' => esc_url( $this->get_source_url() . 'zerif-elementor/template.json' ),
265
+ )
266
  );
267
 
268
  foreach ( $templates_list as $template => $properties ) {
vendor/codeinwp/templates-directory/composer.json CHANGED
@@ -2,7 +2,7 @@
2
  "name": "codeinwp/templates-directory",
3
  "description": "A WordPress library to manage page templates.",
4
  "type": "library",
5
- "version": "1.0.5",
6
  "license": "GPL-2.0-or-later",
7
  "homepage": "https://github.com/Codeinwp/templates-directory",
8
  "authors": [
2
  "name": "codeinwp/templates-directory",
3
  "description": "A WordPress library to manage page templates.",
4
  "type": "library",
5
+ "version": "1.0.6",
6
  "license": "GPL-2.0-or-later",
7
  "homepage": "https://github.com/Codeinwp/templates-directory",
8
  "authors": [
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInite2ebe98296207e7c5425999ef1a181be
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInite2ebe98296207e7c5425999ef1a181be
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInite2ebe98296207e7c5425999ef1a181be', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInite2ebe98296207e7c5425999ef1a181be', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
@@ -42,14 +42,14 @@ class ComposerAutoloaderInite2ebe98296207e7c5425999ef1a181be
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
- composerRequiree2ebe98296207e7c5425999ef1a181be($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
- function composerRequiree2ebe98296207e7c5425999ef1a181be($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit874bfa5516b43214bcbbf7c9c47900dd
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit874bfa5516b43214bcbbf7c9c47900dd', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit874bfa5516b43214bcbbf7c9c47900dd', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
+ composerRequire874bfa5516b43214bcbbf7c9c47900dd($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
+ function composerRequire874bfa5516b43214bcbbf7c9c47900dd($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
vendor/composer/installed.json CHANGED
@@ -119,18 +119,18 @@
119
  "source": {
120
  "type": "git",
121
  "url": "https://github.com/Codeinwp/templates-directory.git",
122
- "reference": "a34078b8ee5bbe6ce18a932f0d189102b416aec4"
123
  },
124
  "dist": {
125
  "type": "zip",
126
- "url": "https://api.github.com/repos/Codeinwp/templates-directory/zipball/a34078b8ee5bbe6ce18a932f0d189102b416aec4",
127
- "reference": "a34078b8ee5bbe6ce18a932f0d189102b416aec4",
128
  "shasum": ""
129
  },
130
  "require": {
131
  "codeinwp/full-width-page-templates": "master"
132
  },
133
- "time": "2018-07-31 15:51:25",
134
  "type": "library",
135
  "installation-source": "dist",
136
  "autoload": {
119
  "source": {
120
  "type": "git",
121
  "url": "https://github.com/Codeinwp/templates-directory.git",
122
+ "reference": "07c51340f9abb30af565e63303a21ea11e86ee2f"
123
  },
124
  "dist": {
125
  "type": "zip",
126
+ "url": "https://api.github.com/repos/Codeinwp/templates-directory/zipball/07c51340f9abb30af565e63303a21ea11e86ee2f",
127
+ "reference": "07c51340f9abb30af565e63303a21ea11e86ee2f",
128
  "shasum": ""
129
  },
130
  "require": {
131
  "codeinwp/full-width-page-templates": "master"
132
  },
133
+ "time": "2018-08-16 10:37:58",
134
  "type": "library",
135
  "installation-source": "dist",
136
  "autoload": {