PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / trunk
MainWP Dashboard: Self-hosted WordPress Management for Agencies vtrunk
6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 5.2.2 5.3 All 153 releases
mainwp / class / class-mainwp-extensions-view.php

class-mainwp-extensions-view.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies trunk, at class/class-mainwp-extensions-view.php

2,381 lines 148.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Extensions View
4 *
5 * Renders MainWP Extensions Page.
6 *
7 * @package MainWP/Dashboard
8 */
9
10 namespace MainWP\Dashboard;
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Class MainWP_Extensions_View
19 *
20 * @package MainWP\Dashboard
21 */
22 class MainWP_Extensions_View { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
23 /**
24 * Get Class name.
25 *
26 * @return string __CLASS__.
27 */
28 public static function get_class_name() {
29 return __CLASS__;
30 }
31
32 /**
33 * Method init_menu()
34 *
35 * Add MainWP > Extensions Submenu
36 *
37 * @return $page
38 *
39 * @uses \MainWP\Dashboard\MainWP_Extensions::get_class_name()
40 */
41 public static function init_menu() {
42 return add_submenu_page(
43 'mainwp_tab',
44 __( 'Add-ons', 'mainwp' ),
45 ' <span id="mainwp-Extensions">' . esc_html__( 'Add-ons', 'mainwp' ) . '</span>',
46 'read',
47 'Extensions',
48 array(
49 MainWP_Extensions::get_class_name(),
50 'render',
51 )
52 );
53 }
54
55 /**
56 * Method render_header()
57 *
58 * Render page header.
59 *
60 * @param string $shownPage The page slug shown at this moment.
61 *
62 * @uses \MainWP\Dashboard\MainWP_UI::render_top_header()
63 * @uses \MainWP\Dashboard\MainWP_UI::render_page_navigation()
64 * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_extensions()
65 */
66 public static function render_header( $shownPage = '' ) {
67 $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
68 if ( ! empty( $page ) && 'Extensions' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
69 $params = array(
70 'title' => esc_html__( 'Extensions', 'mainwp' ),
71 );
72 } else {
73 $extension_name_raw = $page;
74 $extension_name = str_replace( array( '-' ), ' ', $extension_name_raw );
75 $extension_name = MainWP_Extensions_Handler::polish_string_name( $extension_name );
76 $extension_name = apply_filters( 'mainwp_extensions_page_top_header', $extension_name, $extension_name_raw );
77 $params = array(
78 'title' => $extension_name,
79 );
80 }
81
82 MainWP_UI::render_top_header( $params );
83
84 $renderItems = array();
85 $renderItems[] = array(
86 'title' => esc_html__( 'Manage Add-ons', 'mainwp' ),
87 'href' => 'admin.php?page=Extensions',
88 'active' => ( '' === $shownPage ) ? true : false,
89 );
90
91 // get extensions to generate manage site page header.
92 $extensions = MainWP_Extensions_Handler::get_extensions();
93 foreach ( $extensions as $extension ) {
94 if ( $extension['plugin'] === $shownPage ) {
95 $renderItems[] = array(
96 'title' => $extension['name'],
97 'href' => 'admin.php?page=' . $extension['page'],
98 'active' => true,
99 );
100 break;
101 }
102 }
103 MainWP_UI::render_page_navigation( $renderItems );
104 do_action( 'mainwp_extensions_top_header_after_tab', $shownPage );
105 }
106
107 /**
108 * Method render_footer()
109 *
110 * Render page footer.
111 */
112 public static function render_footer() {
113 echo '</div>';
114 }
115
116 /**
117 * Check if any installed extension (enabled or disabled) is a Pro type.
118 *
119 * @param array $extensions Enabled extensions.
120 * @param array $extensions_disabled Disabled extensions.
121 * @param array $all_available All available extensions data keyed by slug.
122 *
123 * @return bool True if at least one installed extension is Pro, false otherwise.
124 */
125 private static function has_pro_extension_installed( $extensions, $extensions_disabled, $all_available ) {
126 $all_installed = array_merge( (array) $extensions, (array) $extensions_disabled );
127 foreach ( $all_installed as $extension ) {
128 $slug = dirname( $extension['slug'] );
129 if ( isset( $all_available[ $slug ]['type'] ) && 'pro' === $all_available[ $slug ]['type'] ) {
130 return true;
131 }
132 }
133 return false;
134 }
135
136 /**
137 * Render the extensions page.
138 *
139 * Displays the main extensions management interface including enabled/disabled add-ons,
140 * search functionality, category filtering, and privacy information. Handles both empty
141 * state with intro notice and populated state with extension cards.
142 *
143 * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_extensions()
144 * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_extensions_disabled()
145 * @uses \MainWP\Dashboard\MainWP_Utility::remove_http_prefix()
146 * @uses \MainWP\Dashboard\MainWP_Api_Manager_Key::instance()
147 *
148 * @return void
149 */
150 public static function render() { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
151 $mainwp_api_key = false;
152 if ( get_option( 'mainwp_extensions_api_save_login' ) ) {
153 $mainwp_api_key = MainWP_Api_Manager_Key::instance()->get_decrypt_master_api_key();
154 }
155
156 if ( 1 === (int) get_option( 'mainwp_api_sslVerifyCertificate' ) ) {
157 update_option( 'mainwp_api_sslVerifyCertificate', 0 );
158 }
159
160 $all_available_extensions = static::get_available_extensions( 'all' );
161
162 $extensions_disabled = MainWP_Extensions_Handler::get_extensions_disabled();
163
164 $extensions = MainWP_Extensions_Handler::get_extensions();
165 $extension_update = get_site_transient( 'update_plugins' );
166
167 $extensions_count = 0;
168 $extensions_disabled_count = 0;
169
170 static::sort_extensions( $extensions );
171 static::sort_extensions( $extensions_disabled );
172
173 ?>
174 <div id="mainwp-manage-extensions" class="ui padded segment">
175
176 <?php if ( empty( $extensions ) && empty( $extensions_disabled ) ) { ?>
177 <?php static::render_intro_notice( $mainwp_api_key ); ?>
178 <?php } else { ?>
179 <?php
180 if ( \mainwp_current_user_can( 'dashboard', 'manage_extensions' ) ) {
181 static::render_licensing_actions_bar( $mainwp_api_key );
182 }
183 ?>
184 <div class="ui hidden divider"></div>
185 <div class="ui stackable grid">
186 <div class="eight wide column" data-tooltip="<?php esc_attr_e( 'Extensions are purpose-built add-ons that expand your Dashboard\'s functionality without relying on external services. Integrations are add-ons that connect MainWP with third-party tools, bringing their power directly into your Dashboard.', 'mainwp' ); ?>" data-inverted="" data-position="bottom left">
187 <button class="ui mini basic green button" id="mainwp-extensions-show-all"><i class="box icon"></i><?php esc_html_e( 'Show All Add-ons', 'mainwp' ); ?></button>
188 <button class="ui mini basic button" id="mainwp-extensions-show-extensions"><i class="puzzle piece icon"></i><?php esc_html_e( 'Show Extensions', 'mainwp' ); ?></button>
189 <button class="ui mini basic button" id="mainwp-extensions-show-integrations"><i class="plug icon"></i><?php esc_html_e( 'Show Integrations', 'mainwp' ); ?></button>
190 </div>
191 <div class="eight wide right aligned column">
192 <div id="mainwp-search-extensions" class="ui mini search">
193 <div class="ui icon input">
194 <input class="prompt" type="text" id="mainwp-search-extensions-input" autocomplete="one-time-code" placeholder="<?php esc_attr_e( 'Find add-on...', 'mainwp' ); ?>">
195 <i class="search icon"></i>
196 <i class="remove icon"></i>
197 </div>
198 <div class="results"></div>
199 </div>
200 </div>
201 </div>
202 <div class="ui hidden divider"></div>
203
204 <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-extensions-info-message' ) ) : ?>
205 <div>
206 <div class="ui icon message mainwp-welcome-message" style="margin-bottom:0;">
207 <em data-emoji=":jigsaw:" class="big"></em>
208 <div class="content">
209 <div class="ui massive header"><?php esc_html_e( 'Manage Your Installed Add-ons', 'mainwp' ); ?></div>
210 <p><?php esc_html_e( 'Activate, deactivate, or explore new tools for your MainWP Dashboard.', 'mainwp' ); ?></p>
211 <?php if ( ! MainWP_Hooks::is_pro_member() && ! static::has_pro_extension_installed( $extensions, $extensions_disabled, $all_available_extensions ) ) : ?>
212 <div><?php esc_html_e( 'Missing something?', 'mainwp' ); ?> <a href="#" class="ui mini green button" id="mainwp-extensions-message-bulkinstall"><?php esc_html_e( 'Install Free Add-ons', 'mainwp' ); ?></a> or <a href="https://mainwp.com/signup/" class="ui mini green basic button" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Upgrade to Pro', 'mainwp' ); ?></a></div>
213 <?php endif; ?>
214 </div>
215 <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-extensions-info-message"></i>
216 </div>
217 </div>
218 <?php endif; ?>
219
220 <div id="mainwp-extensions-search-no-results" style="display:none">
221 <div class="ui info message"><?php esc_html_e( 'Your search returned no results. The add-on may need to be installed or does not exist.', 'mainwp' ); ?></div>
222 </div>
223 <div>
224 <div class="mainwp-extensions-api-loading" style="display:none">
225 <div class="ui active page dimmer">
226 <div class="ui double text loader"><?php esc_html_e( 'Loading...', 'mainwp' ); ?></div>
227 </div>
228 </div>
229 <div id="mainwp-extensions-list" class="ui fluid accordion">
230 <div class="active title" style="background:none!important;">
231 <i class="dropdown icon"></i>
232 <h2 class="ui header" style="display:inline-block;margin:0;">
233 <div class="content" style="background:none!important;">
234 <?php esc_html_e( 'Enabled Add-ons', 'mainwp' ); ?>
235 <div class="sub header"><?php esc_html_e( 'The add-ons you\'re currently using to power up your MainWP Dashboard.', 'mainwp' ); ?></div>
236 </div>
237 </h2>
238 </div>
239 <div class="active content" style="background:none!important;">
240 <div class="ui four cards" id="mainwp-active-add-ons-cards">
241 <?php if ( isset( $extensions ) && is_array( $extensions ) ) { ?>
242 <?php foreach ( $extensions as $extension ) { ?>
243 <?php
244 if ( ! \mainwp_current_user_can( 'extension', dirname( $extension['slug'] ) ) ) {
245 continue;
246 }
247
248 $extensions_data = isset( $all_available_extensions[ dirname( $extension['slug'] ) ] ) ? $all_available_extensions[ dirname( $extension['slug'] ) ] : array();
249
250 if ( isset( $extensions_data['img'] ) && ! empty( $extensions_data['img'] ) ) {
251 $img_url = $extensions_data['img'];
252 } elseif ( isset( $extension['icon'] ) && ! empty( $extension['icon'] ) ) {
253 $img_url = $extension['icon'];
254 } elseif ( isset( $extension['iconURI'] ) && '' !== $extension['iconURI'] ) {
255 $img_url = MainWP_Utility::remove_http_prefix( $extension['iconURI'] );
256 } else {
257 $img_url = MAINWP_PLUGIN_URL . 'assets/images/extensions/placeholder.png';
258 }
259
260 static::render_extension_card( $extension, $extension_update, $img_url );
261 ?>
262 <?php } ?>
263 <?php $extensions_count = count( $extensions ); ?>
264 <?php } ?>
265 </div>
266 </div>
267 <div class="ui section divider"></div>
268 <div class="title" style="background:none!important;">
269 <i class="dropdown icon"></i>
270 <h2 class="ui header" style="display:inline-block;margin:0;">
271 <div class="content" style="background:none!important;">
272 <?php esc_html_e( 'Disabled Add-ons', 'mainwp' ); ?>
273 <div class="sub header"><?php esc_html_e( 'These add-ons are installed but turned off. Enable them anytime to unlock more features.', 'mainwp' ); ?></div>
274 </div>
275 </h2>
276 </div>
277 <div class="content" style="background:none!important;">
278 <div class="ui four cards" id="mainwp-inactive-add-ons-cards">
279 <?php if ( is_array( $extensions_disabled ) ) { ?>
280 <?php foreach ( $extensions_disabled as $extension ) { ?>
281 <?php
282 $slug = dirname( $extension['slug'] );
283
284 if ( ! isset( $all_available_extensions[ $slug ] ) ) {
285 continue;
286 }
287
288 $extensions_data = $all_available_extensions[ $slug ];
289
290 if ( isset( $extensions_data['img'] ) && ! empty( $extensions_data['img'] ) ) {
291 $img_url = $extensions_data['img'];
292 } elseif ( isset( $extension['icon'] ) && ! empty( $extension['icon'] ) ) {
293 $img_url = $extension['icon'];
294 } elseif ( isset( $extension['iconURI'] ) && '' !== $extension['iconURI'] ) {
295 $img_url = MainWP_Utility::remove_http_prefix( $extension['iconURI'] );
296 } else {
297 $img_url = MAINWP_PLUGIN_URL . 'assets/images/extensions/placeholder.png';
298 }
299
300 static::render_extension_card( $extension, $extension_update, $img_url, true );
301 ?>
302 <?php } ?>
303 <?php $extensions_disabled_count = count( $extensions_disabled ); ?>
304 <?php } ?>
305
306 <?php $extensions_count = $extensions_count + $extensions_disabled_count; ?>
307 <?php if ( 1 === $extensions_count % 4 ) : ?>
308 <div class="ui card" style="visibility:hidden"></div>
309 <div class="ui card" style="visibility:hidden"></div>
310 <div class="ui card" style="visibility:hidden"></div>
311 <?php elseif ( 2 === $extensions_count % 4 ) : ?>
312 <div class="ui card" style="visibility:hidden"></div>
313 <div class="ui card" style="visibility:hidden"></div>
314 <?php elseif ( 3 === $extensions_count % 4 ) : ?>
315 <div class="ui card" style="visibility:hidden"></div>
316 <?php endif; ?>
317 </div>
318 </div>
319 </div>
320 </div>
321 <?php } ?>
322
323 <?php static::render_purchase_notice(); ?>
324
325 <div id="mainwp-extensions-privacy-info">
326 <?php $priv_extensions = static::get_available_extensions( 'all' ); ?>
327 <?php
328 foreach ( $priv_extensions as $priv_extension ) {
329 $item_slug = MainWP_Utility::get_dir_slug( $priv_extension['slug'] );
330 ?>
331 <?php if ( isset( $priv_extension['privacy'] ) && ( 2 === $priv_extension['privacy'] || 1 === (int) $priv_extension['privacy'] ) ) { ?>
332 <input <?php // NOSONAR - id ok. ?>
333 type="hidden"
334 id="<?php echo esc_attr( $priv_extension['slug'] ); ?>"
335 name="<?php echo esc_attr( $priv_extension['slug'] ); ?>"
336 base-slug="<?php echo esc_attr( $item_slug ); ?>"
337 privacy="<?php echo esc_attr( $priv_extension['privacy'] ); ?>"
338 integration="<?php echo esc_attr( $priv_extension['integration'] ); ?>"
339 integration_url="<?php echo esc_attr( $priv_extension['integration_url'] ); ?>"
340 integration_owner="<?php echo esc_attr( $priv_extension['integration_owner'] ); ?>"
341 integration_owner_pp="<?php echo esc_attr( $priv_extension['integration_owner_pp'] ); ?>"
342 extension_title="<?php echo esc_attr( MainWP_Extensions_Handler::polish_string_name( $priv_extension['title'] ) ); ?>"
343 value="<?php echo esc_attr( $priv_extension['title'] ); ?>"
344 />
345 <?php } elseif ( isset( $priv_extension['privacy'] ) && 0 === (int) $priv_extension['privacy'] ) { ?>
346 <input <?php // NOSONAR - id ok. ?>
347 type="hidden"
348 id="<?php echo esc_attr( $priv_extension['slug'] ); // NOSONAR - id ok. ?>"
349 name="<?php echo esc_attr( $priv_extension['slug'] ); ?>"
350 base-slug="<?php echo esc_attr( $item_slug ); ?>"
351 privacy="<?php echo esc_attr( $priv_extension['privacy'] ); ?>"
352 extension_title="<?php echo esc_attr( MainWP_Extensions_Handler::polish_string_name( $priv_extension['title'] ) ); ?>"
353 value="<?php echo esc_attr( $priv_extension['title'] ); ?>"
354 />
355 <?php } else { ?>
356 <input <?php // NOSONAR - id ok. ?>
357 type="hidden"
358 id="<?php echo esc_attr( $priv_extension['slug'] ); // NOSONAR - id ok. ?>"
359 name="<?php echo esc_attr( $priv_extension['slug'] ); ?>"
360 base-slug="<?php echo esc_attr( $item_slug ); ?>"
361 extension_title="<?php echo esc_attr( MainWP_Extensions_Handler::polish_string_name( $priv_extension['title'] ) ); ?>"
362 value="<?php echo esc_attr( $priv_extension['title'] ); ?>"
363 />
364 <?php } ?>
365 <?php } ?>
366 </div>
367 </div>
368
369 <div class="ui tiny second coupled modal" id="mainwp-privacy-info-modal">
370 <i class="close icon"></i>
371 <div class="header"></div>
372 <div class="content"></div>
373 </div>
374
375 <script type="text/javascript">
376 jQuery( document ).ready( function () {
377 jQuery( '#mainwp-extensions-list' ).accordion();
378 jQuery( '#mainwp-search-extensions-input' ).on( 'keyup', function () {
379 var searchQuery = jQuery( this ).val().toLowerCase();
380 var extensions = jQuery( '#mainwp-extensions-list' ).find( '.ui.extension.card' );
381 for ( var i = 0; i < extensions.length; i++ ) {
382 var currentExtension = jQuery( extensions[i] );
383 var extensionTitle = jQuery( currentExtension ).attr( 'extension-title' ).toLowerCase();
384 if ( extensionTitle.indexOf( searchQuery ) > -1 ) {
385 currentExtension.show();
386 currentExtension.addClass( 'mainwp-found' );
387 } else {
388 currentExtension.removeClass( 'mainwp-found' );
389 currentExtension.hide();
390 }
391 var foundExtensions = jQuery( '#mainwp-extensions-list' ).find( '.ui.extension.card.mainwp-found' );
392 if ( foundExtensions.length < 1 ) {
393 jQuery( '#mainwp-extensions-search-no-results' ).show();
394 } else {
395 jQuery( '#mainwp-extensions-search-no-results' ).hide();
396 }
397 }
398 } );
399 jQuery( '#mainwp-search-extensions .remove.icon' ).on( 'click', function () {
400 jQuery( '#mainwp-search-extensions-input' ).val('');
401 jQuery( '#mainwp-search-extensions-input' ).trigger('keyup');
402 } );
403 } );
404 </script>
405 <?php
406 }
407
408 /**
409 * Render the introductory notice section for extensions page.
410 *
411 * Displays the main intro content including API key validation form,
412 * category browsing cards, and popular add-ons section.
413 *
414 * @param string|false $mainwp_api_key The MainWP API key or false if not set.
415 * @return void
416 */
417 public static function render_intro_notice( $mainwp_api_key ) {
418 $folder_url = MAINWP_PLUGIN_URL . 'assets/images/extensions/';
419 ?>
420 <div class="ui segment">
421 <h2 class="ui massive header">
422 <?php esc_html_e( 'Extend your MainWP Dashboard.', 'mainwp' ); ?><br/>
423 <span class="ui green text"><?php esc_html_e( 'Add what you need.', 'mainwp' ); ?></span>
424 </h2>
425 <p style="max-width:700px"><span class="ui grey text"><?php esc_html_e( 'The MainWP Dashboard core keeps things lean. Add-ons let you expand with exactly the features you need, security, backups, performance monitoring, and more.', 'mainwp' ); ?></span></p>
426 <div class="ui section hidden divider"></div>
427 <div class="ui two column stacking grid">
428 <div class="column">
429 <div class="ui green padded secondary segment">
430 <h2 class="ui header">
431 <i class="key icon"></i>
432 <div class="content">
433 <?php esc_html_e( 'Connect your MainWP Account', 'mainwp' ); ?>
434 <div class="sub header"><?php esc_html_e( 'All add-ons (including free MainWP add-ons) require an API key. Create a free account or enter your existing key to get started.', 'mainwp' ); ?></div>
435 </div>
436 </h2>
437 <div class="ui hidden divider"></div>
438 <div class="ui grid">
439 <div class="nine wide column">
440 <div class="ui form" id="mainwp-extensions-api-fields">
441 <div class="field">
442 <div class="ui fluid input">
443 <input type="password" id="mainwp_com_api_key" autocomplete="new-password" autocorrect="off" autocapitalize="none" spellcheck="false" placeholder="<?php esc_attr_e( 'Enter your MainWP License Key', 'mainwp' ); ?>" value="<?php echo esc_attr( MainWP_Credential_Render::value_for_input( ! empty( $mainwp_api_key ) ) ); ?>"/>
444 </div>
445 </div>
446 <div class="field">
447 <div class="ui checkbox">
448 <input type="checkbox" <?php echo '' !== $mainwp_api_key ? 'checked="checked"' : ''; ?> name="extensions_api_savemylogin_chk" id="extensions_api_savemylogin_chk">
449 <label for="extensions_api_savemylogin_chk"><small><?php esc_html_e( 'Remember MainWP Main API Key', 'mainwp' ); ?></small></label>
450 </div>
451 </div>
452 </div>
453 </div>
454 <div class="seven wide column">
455 <input type="button" class="ui fluid green basic button" id="mainwp-extensions-savelogin" data-context="intro-notice" value="<?php esc_attr_e( 'Validate License & Install Add-ons', 'mainwp' ); ?>">
456 </div>
457 </div>
458 <div class="ui section divider"></div>
459 <div class="mainwp-extensions-api-loading" style="display:none">
460 <div class="ui active page dimmer">
461 <div class="ui double text loader"><?php esc_html_e( 'Validating...', 'mainwp' ); ?></div>
462 </div>
463 </div>
464 <span class="ui grey text"><?php esc_html_e( 'Don\'t have an account?', 'mainwp' ); ?></span> &nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp; <a href="https://mainwp.com/signup/" rel="noopener noreferrer" target="_blank"><?php esc_html_e( 'Create Free Account', 'mainwp' ); ?> →</a>
465 </div>
466 </div>
467 <div class="column">
468 <div class="ui padded segment" id="mainwp-pro-hero-segment">
469 <span class="ui small green label" style="opacity:.8"><?php esc_html_e( 'PRO', 'mainwp' ); ?></span> <?php esc_html_e( 'Unlock the full toolkit', 'mainwp' ); ?>
470 <h2 class="ui header"><?php esc_html_e( 'Want everything? MainWP Pro includes all add-ons.', 'mainwp' ); ?></h2>
471 <p><span class="ui grey text" style="font-weight:300"><?php esc_html_e( 'Free gets you started. Pro gets you everything we make now and in the future, priority support, and automatic updates.', 'mainwp' ); ?></span></p>
472 <div class="ui three column grid">
473 <div class="column">
474 <div class="ui small header">
475 <em data-emoji=":ring_buoy:" class="small"></em>
476 <div class="content">
477 <?php esc_html_e( 'Priority Ticket Support', 'mainwp' ); ?>
478 <div class="sub header"><?php esc_html_e( 'Faster response times', 'mainwp' ); ?></div>
479 </div>
480 </div>
481 </div>
482 <div class="column">
483 <div class="ui small header">
484 <em data-emoji=":arrow_upper_right:" class="small"></em>
485 <div class="content">
486 <?php esc_html_e( 'Auto Updates', 'mainwp' ); ?>
487 <div class="sub header"><?php esc_html_e( 'Critical & security updates', 'mainwp' ); ?></div>
488 </div>
489 </div>
490 </div>
491 <div class="column">
492 <div class="ui small header">
493 <em data-emoji=":package:" class="small"></em>
494 <div class="content">
495 <?php esc_html_e( 'All Add-ons', 'mainwp' ); ?>
496 <div class="sub header"><?php esc_html_e( 'Current & future', 'mainwp' ); ?></div>
497 </div>
498 </div>
499 </div>
500 </div>
501 <div class="ui hidden divider"></div>
502 <a href="https://mainwp.com/free-vs-pro/" rel="noopener noreferrer" target="_blank" class="ui grey basic button"><?php esc_html_e( 'Learn About Pro', 'mainwp' ); ?></a>
503 </div>
504 </div>
505 </div>
506 <div class="ui hidden section divider"></div>
507 <div class="ui two column grid">
508 <div class="column"><?php esc_html_e( 'BROWSE BY CATEGORY', 'mainwp' ); ?></div>
509 <div class="right aligned column"><span class="ui grey small text"><?php esc_html_e( '🔒 Validate license to install', 'mainwp' ); ?></span></div>
510 </div>
511 <div class="ui twelve mini cards" id="mainwp-browse-add-ons-by-category-cards">
512 <div class="ui card">
513 <div class="content">
514 <em data-emoji=":gear:" class="medium mainwp-greyscale"></em>
515 <h3 class="ui header">
516 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/administrative/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Administrative', 'mainwp' ); ?> →</a>
517 <div class="sub header"><?php esc_html_e( '4 Add-ons', 'mainwp' ); ?></div>
518 </h3>
519 </div>
520 </div>
521 <div class="ui card">
522 <div class="content">
523 <em data-emoji=":office:" class="medium mainwp-greyscale"></em>
524 <h3 class="ui header">
525 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/agency/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Agency', 'mainwp' ); ?> →</a>
526 <div class="sub header"><?php esc_html_e( '2 Add-ons', 'mainwp' ); ?></div>
527 </h3>
528 </div>
529 </div>
530 <div class="ui card">
531 <div class="content">
532 <em data-emoji=":minidisc:" class="medium mainwp-greyscale"></em>
533 <h3 class="ui header">
534 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/backups/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Backups', 'mainwp' ); ?> →</a>
535 <div class="sub header"><?php esc_html_e( '5 Add-ons', 'mainwp' ); ?></div>
536 </h3>
537 </div>
538 </div>
539 <div class="ui card">
540 <div class="content">
541 <em data-emoji=":man_office_worker:" class="medium mainwp-greyscale"></em>
542 <h3 class="ui header">
543 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/client/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Client', 'mainwp' ); ?> →</a>
544 <div class="sub header"><?php esc_html_e( '2 Add-ons', 'mainwp' ); ?></div>
545 </h3>
546 </div>
547 </div>
548 <div class="ui card">
549 <div class="content">
550 <em data-emoji=":newspaper:" class="medium mainwp-greyscale"></em>
551 <h3 class="ui header">
552 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/content/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Content Operations', 'mainwp' ); ?> →</a>
553 <div class="sub header"><?php esc_html_e( '7 Add-ons', 'mainwp' ); ?></div>
554 </h3>
555 </div>
556 </div>
557 <div class="ui card">
558 <div class="content">
559 <em data-emoji=":satellite_orbital:" class="medium mainwp-greyscale"></em>
560 <h3 class="ui header">
561 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/monitoring/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Monitoring', 'mainwp' ); ?> →</a>
562 <div class="sub header"><?php esc_html_e( '4 Add-ons', 'mainwp' ); ?></div>
563 </h3>
564 </div>
565 </div>
566 <div class="ui card">
567 <div class="content">
568 <em data-emoji=":zap:" class="medium mainwp-greyscale"></em>
569 <h3 class="ui header">
570 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/performance/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Performance', 'mainwp' ); ?> →</a>
571 <div class="sub header"><?php esc_html_e( '4 Add-ons', 'mainwp' ); ?></div>
572 </h3>
573 </div>
574 </div>
575 <div class="ui card">
576 <div class="content">
577 <em data-emoji=":shield:" class="medium mainwp-greyscale"></em>
578 <h3 class="ui header">
579 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/security/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Security', 'mainwp' ); ?> →</a>
580 <div class="sub header"><?php esc_html_e( '11 Add-ons', 'mainwp' ); ?></div>
581 </h3>
582 </div>
583 </div>
584 <div class="ui card">
585 <div class="content">
586 <em data-emoji=":chart_with_upwards_trend:" class="medium mainwp-greyscale"></em>
587 <h3 class="ui header">
588 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/analytics/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Analytics', 'mainwp' ); ?> →</a>
589 <div class="sub header"><?php esc_html_e( '4 Add-ons', 'mainwp' ); ?></div>
590 </h3>
591 </div>
592 </div>
593 <div class="ui card">
594 <div class="content">
595 <em data-emoji=":arrow_upper_right:" class="medium mainwp-greyscale"></em>
596 <h3 class="ui header">
597 <a href="https://mainwp.com/mainwp-add-ons/add-on-category/updates/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Updates', 'mainwp' ); ?> →</a>
598 <div class="sub header"><?php esc_html_e( '2 Add-ons', 'mainwp' ); ?></div>
599 </h3>
600 </div>
601 </div>
602 <div class="ui card">
603 <div class="content">
604 <em data-emoji=":jigsaw:" class="medium"></em>
605 <h3 class="ui header">
606 <a href="https://mainwp.com/mainwp-add-ons/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'All Add-ons', 'mainwp' ); ?> →</a>
607 <div class="sub header"><?php esc_html_e( '40+ Add-ons', 'mainwp' ); ?></div>
608 </h3>
609 </div>
610 </div>
611 </div>
612 <div class="ui hidden section divider"></div>
613 <div class="ui two column grid">
614 <div class="column"><?php esc_html_e( 'POPULAR ADD-ONS', 'mainwp' ); ?></div>
615 <div class="right aligned column"><a href="https://mainwp.com/mainwp-add-ons/" rel="noopener noreferrer" target="_blank"><span class="ui grey small text"><?php esc_html_e( 'View all', 'mainwp' ); ?> →</span></a></div>
616 </div>
617 <div class="ui five mini cards" id="mainwp-popular-add-ons-cards">
618 <div class="ui card">
619 <div class="content">
620 <div class="ui mini grey right floated label"><?php esc_html_e( 'FREE', 'mainwp' ); ?></div>
621 <div class="ui small image"><img class="ui mini image" src="<?php echo esc_attr( $folder_url . 'advanced-uptime-monitor.png' ); ?>" alt="<?php esc_attr_e( 'Advanced Uptime Monitor', 'mainwp' ); ?>"></div>
622 <h3 class="ui header">
623 <a href="https://mainwp.com/add-on/advanced-uptime-monitor/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Advanced Uptime Monitor', 'mainwp' ); ?> →</a>
624 <div class="sub header"><?php esc_html_e( 'Real-time up time monitoring', 'mainwp' ); ?></div>
625 </h3>
626 </div>
627 </div>
628 <div class="ui card">
629 <div class="content">
630 <div class="ui mini green right floated label"><?php esc_html_e( 'PRO', 'mainwp' ); ?></div>
631 <div class="ui small image"><img class="ui mini image" src="<?php echo esc_attr( $folder_url . 'branding.png' ); ?>" alt="<?php esc_attr_e( 'White Label', 'mainwp' ); ?>"></div>
632 <h3 class="ui header">
633 <a href="https://mainwp.com/add-on/white-label/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'White Label', 'mainwp' ); ?> →</a>
634 <div class="sub header"><?php esc_html_e( 'White label MainWP Child', 'mainwp' ); ?></div>
635 </h3>
636 </div>
637 </div>
638 <div class="ui card">
639 <div class="content">
640 <div class="ui mini green right floated label"><?php esc_html_e( 'PRO', 'mainwp' ); ?></div>
641 <div class="ui small image"><img class="ui mini image" src="<?php echo esc_attr( $folder_url . 'pro-reports.png' ); ?>" alt="<?php esc_attr_e( 'Pro Reports', 'mainwp' ); ?>"></div>
642 <h3 class="ui header">
643 <a href="https://mainwp.com/add-on/pro-reports/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Pro Reports', 'mainwp' ); ?> →</a>
644 <div class="sub header"><?php esc_html_e( 'Client reporting', 'mainwp' ); ?></div>
645 </h3>
646 </div>
647 </div>
648 <div class="ui card">
649 <div class="content">
650 <div class="ui mini grey right floated label"><?php esc_html_e( 'FREE', 'mainwp' ); ?></div>
651 <div class="ui small image"><img class="ui mini image" src="<?php echo esc_attr( $folder_url . 'updraftplus.png' ); ?>" alt="<?php esc_attr_e( 'UpdraftPlus', 'mainwp' ); ?>"></div>
652 <h3 class="ui header">
653 <a href="https://mainwp.com/add-on/updraftplus/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'UpdraftPlus', 'mainwp' ); ?> →</a>
654 <div class="sub header"><?php esc_html_e( 'UpdraftPlus backups', 'mainwp' ); ?></div>
655 </h3>
656 </div>
657 </div>
658 <div class="ui card">
659 <div class="content">
660 <div class="ui mini green right floated label"><?php esc_html_e( 'PRO', 'mainwp' ); ?></div>
661 <div class="ui small circular image"><img class="ui mini image" src="<?php echo esc_attr( $folder_url . 'maintenance.png' ); ?>" alt="<?php esc_attr_e( 'Maintenance', 'mainwp' ); ?>"></div>
662 <h3 class="ui header">
663 <a href="https://mainwp.com/add-on/maintenance/" rel="noopener noreferrer" target="_blank" class="ui grey text"><?php esc_html_e( 'Maintenance', 'mainwp' ); ?> →</a>
664 <div class="sub header"><?php esc_html_e( 'Database optimization', 'mainwp' ); ?></div>
665 </h3>
666 </div>
667 </div>
668 </div>
669 </div>
670 <?php
671 }
672
673 /**
674 * Method render_extension_card()
675 *
676 * Render the MainWP Extension Cards.
677 *
678 * @param mixed $extension Extention to render.
679 * @param mixed $extension_update Extension update.
680 * @param mixed $img_url Extension image.
681 * @param mixed $disabled Disabled extension.
682 * @param bool $simple Simple info.
683 *
684 * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::is_extension_activated()
685 * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::polish_ext_name()
686 */
687 public static function render_extension_card( $extension, $extension_update, $img_url, $disabled = false, $simple = false ) { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
688
689 if ( isset( $extension['href'] ) && ! empty( $extension['href'] ) ) {
690 $extension_page_url = $extension['href'];
691 } elseif ( isset( $extension['direct_page'] ) && ! empty( $extension['direct_page'] ) ) {
692 $extension_page_url = admin_url( 'admin.php?page=' . $extension['direct_page'] );
693 } elseif ( isset( $extension['callback'] ) ) {
694 $extension_page_url = admin_url( 'admin.php?page=' . $extension['page'] );
695 } else {
696 $extension_page_url = admin_url( 'admin.php?page=Extensions' );
697 }
698
699 $active = MainWP_Extensions_Handler::is_extension_activated( $extension['slug'] );
700 if ( empty( $extension['has_api_key'] ) ) {
701 $active = false;
702 }
703
704 if ( isset( $extension['apiManager'] ) && $extension['apiManager'] && ! isset( $extension['product_item_id'] ) ) {
705 $extension['product_item_id'] = 0;
706 }
707
708 $queue_status = '';
709 if ( ! $disabled && isset( $extension['apiManager'] ) && $extension['apiManager'] ) {
710 $queue_status = 'queue';
711 }
712
713 $all_available_extensions = static::get_available_extensions( 'all' );
714 $extensions_data = isset( $all_available_extensions[ dirname( $extension['slug'] ) ] ) ? $all_available_extensions[ dirname( $extension['slug'] ) ] : array();
715
716 $privacy_class = '';
717 $license_class = '';
718
719 if ( isset( $extensions_data['privacy'] ) ) {
720 if ( empty( $extensions_data['privacy'] ) ) {
721 $privacy_class = '<i class="fingerprint green icon"></i>';
722 } elseif ( 1 === (int) $extensions_data['privacy'] || 2 === (int) $extensions_data['privacy'] ) {
723 $privacy_class = '<i class="fingerprint yellow icon"></i>';
724 }
725 }
726
727 if ( $active ) {
728 $license_class = '<i class="green key icon"></i>';
729 } else {
730 $license_class = '<i class="red key icon"></i>';
731 }
732
733 $item_slug = MainWP_Utility::get_dir_slug( $extension['slug'] );
734
735 $new = '';
736
737 if ( isset( $extensions_data['release_date'] ) && ( time() - $extensions_data['release_date'] < MONTH_IN_SECONDS ) ) {
738 $new = '<span class="ui floating green mini label">NEW!</span>';
739 }
740
741 $polish_name = ! empty( $extension['_polish_name'] ) ? $extension['_polish_name'] : MainWP_Extensions_Handler::polish_ext_name( $extension, true );
742
743 ?>
744
745 <!-- Fixed the issue extension missing model type. -->
746 <div class="ui fluid card extension <?php echo $disabled ? 'grey mainwp-disabled-extension' : 'green mainwp-enabled-extension'; ?> extension-card-<?php echo esc_attr( sanitize_title( $extension['name'] ) ?? '' ); ?>" extension-model="<?php echo esc_attr( $extensions_data['model'] ?? '' ); ?>" extension-title="<?php echo esc_attr( MainWP_Extensions_Handler::polish_ext_name( $extension, true ) ); ?>" base-slug="<?php echo esc_attr( $item_slug ); ?>" extension-slug="<?php echo esc_attr( $extension['slug'] ?? '' ); ?>" status="<?php echo esc_attr( $queue_status ); ?>" license-status="<?php echo $active ? 'activated' : 'deactivated'; ?>">
747 <?php
748 /**
749 * Action: mainwp_extension_card_top
750 *
751 * Fires at the Extension card top
752 *
753 * @since 4.1.4.1
754 *
755 * @param array $extension Array containing the Extension information.
756 */
757 do_action( 'mainwp_extension_card_top', $extension );
758 ?>
759 <div class="content">
760 <img class="right floated mini ui image" alt="<?php echo esc_attr( $polish_name ); ?>" src="<?php echo esc_html( $img_url ); ?>">
761 <div class="header">
762 <?php if ( ! $disabled ) { ?>
763 <a href="<?php echo esc_url( $extension_page_url ); ?>"><?php echo esc_html( $polish_name ); ?></a>
764 <?php } else { ?>
765 <?php echo esc_html( $polish_name ); ?>
766 <?php } ?>
767 </div>
768
769 <div class="meta">
770 <span class="ui small grey text"><?php echo '<i class="code branch grey icon"></i> ' . esc_html( $extension['version'] ); ?> <?php echo isset( $extension['DocumentationURI'] ) && ! empty( $extension['DocumentationURI'] ) ? ' - <a href="' . esc_url( str_replace( array( 'http:', 'https:' ), '', $extension['DocumentationURI'] ) ) . '" target="_blank" rel="noopener noreferrer" class="ui grey text"><i class="book grey icon"></i> ' . esc_html__( 'Docs', 'mainwp' ) . '</a>' : ''; ?> - <a class="extension-privacy-info-link ui grey text" base-slug="<?php echo esc_attr( $item_slug ); ?>"><?php echo $privacy_class; ?> <?php esc_html_e( 'Privacy', 'mainwp' ); ?></a></span> <?php // phpcs:ignore WordPress.Security.EscapeOutput ?>
771 </div>
772
773 <div class="description">
774 <?php echo esc_html( preg_replace( '/\<cite\>.*\<\/cite\>/', '', $extension['description'] ) ); ?>
775 </div>
776 </div>
777
778 <?php echo $new; // phpcs:ignore WordPress.Security.EscapeOutput ?>
779
780 <?php if ( ! $simple ) { ?>
781 <div class="extra content">
782 <div class="">
783 <?php if ( \mainwp_current_user_can( 'dashboard', 'manage_extensions' ) ) { ?>
784 <a class="ui mini basic button extension-the-plugin-action" plugin-action="<?php echo $disabled ? 'active' : 'disable'; ?>"><?php echo $disabled ? '<i class="toggle off icon"></i> ' . esc_html__( 'Enable', 'mainwp' ) : '<i class="toggle on green icon"></i> ' . esc_html__( 'Disable', 'mainwp' ); ?></a>
785 <?php } ?>
786 <?php if ( $disabled && \mainwp_current_user_can( 'dashboard', 'manage_extensions' ) ) { ?>
787 <a class="ui mini basic right floated button extension-the-plugin-action" plugin-action="remove"><i class="trash icon"></i> <?php esc_html_e( 'Remove', 'mainwp' ); ?></a>
788 <?php } ?>
789 <?php if ( isset( $extension['apiManager'] ) && $extension['apiManager'] && \mainwp_current_user_can( 'dashboard', 'manage_extensions' ) ) { ?>
790 <a class="ui mini activate-api-status mainwp-manage-extension-license basic right floated button" data-tooltip="<?php echo $active ? esc_html__( 'License activated.', 'mainwp' ) : esc_html__( 'License not activated. Click activate.', 'mainwp' ); ?>" api-actived="<?php echo $active ? '1' : '0'; ?>" data-position="top right" data-inverted=""><?php echo $license_class; ?> <?php echo $active ? esc_html__( 'Licensed', 'mainwp' ) : esc_html__( 'Activate License', 'mainwp' ); ?></a> <?php // phpcs:ignore WordPress.Security.EscapeOutput ?>
791 <?php } ?>
792 </div>
793 </div>
794 <?php } ?>
795
796 <div class="ui active dimmer action-feedback" style="display:none;">
797 <div class="ui text loader"></div>
798 </div>
799
800 <?php if ( isset( $extension['apiManager'] ) && $extension['apiManager'] ) { ?>
801 <?php if ( $active ) { ?>
802 <div class="ui active dimmer" id="mainwp-extensions-api-form" style="display: none;">
803 <input type="hidden" class="extension-api-key" value="<?php echo esc_attr( MainWP_Credential_Render::value_for_input( ! empty( $extension['has_api_key'] ) ) ); ?>"/>
804 <div class="ui center aligned secondary segment">
805 <p><?php esc_html_e( 'Deactivate license for this add-on?', 'mainwp' ); ?></p>
806 <button class="ui red mini button mainwp-extensions-deactivate"><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></button>
807 <button class="ui button mini mainwp-extension-license-cancel"><?php esc_html_e( 'Cancel', 'mainwp' ); ?></button>
808 </div>
809 </div>
810 <?php } ?>
811
812 <?php if ( isset( $extension['apiManager'] ) && $extension['apiManager'] ) { ?>
813 <div class="ui active dimmer api-feedback" style="display:none;">
814 <div class="ui text loader"></div>
815 </div>
816 <?php } ?>
817 <?php } ?>
818 <?php
819 /**
820 * Action: mainwp_extension_card_bottom
821 *
822 * Fires at the Extension card bottom
823 *
824 * @since 4.1.4.1
825 *
826 * @param array $extension Array containing the Extension information.
827 */
828 do_action( 'mainwp_extension_card_bottom', $extension );
829 ?>
830 </div>
831 <?php
832 }
833
834 /**
835 * Method render_inactive_extension_card()
836 *
837 * Render the MainWP Extension Cards.
838 *
839 * @param mixed $extension Extention to render.
840 * @param mixed $img_url Extension image.
841 * @param bool $installed Extension installed.
842 */
843 public static function render_inactive_extension_card( $extension, $img_url, $installed = false ) {
844
845 if ( ! isset( $extension['link'] ) && isset( $extension['DocumentationURI'] ) ) {
846 $extension['link'] = $extension['DocumentationURI'];
847 }
848
849 if ( ! isset( $extension['version'] ) ) {
850 $extension['version'] = '';
851 }
852
853 $polish_name = ! empty( $extension['_polish_name'] ) ? $extension['_polish_name'] : MainWP_Extensions_Handler::polish_ext_name( $extension, true );
854
855 ?>
856 <div class="ui card extension grey mainwp-disabled-extension extension-card-<?php echo esc_attr( $extension['name'] ); ?>" extension-title="<?php echo esc_attr( $polish_name ); ?>" base-slug="<?php echo esc_attr( $extension['slug'] ); ?>">
857 <div class="content">
858 <img class="right floated mini ui image" alt="<?php echo esc_attr( $polish_name ); ?>" src="<?php echo esc_html( $img_url ); ?>">
859 <div class="header">
860 <?php echo esc_html( $polish_name ); ?>
861 </div>
862
863 <?php if ( $installed ) : ?>
864 <a href="admin.php?page=Extensions" class="ui black ribbon label"><?php echo esc_html__( 'Activate Add-on', 'mainwp' ); ?></a>
865 <?php else : ?>
866 <a href="admin.php?page=Extensions&message=install-ext-<?php echo esc_attr( $extension['slug'] ); ?>" class="ui grey ribbon label"><?php echo esc_html__( 'Install Add-on', 'mainwp' ); ?></a>
867 <?php endif; ?>
868 <div class="description">
869 <?php echo esc_html( preg_replace( '/\<cite\>.*\<\/cite\>/', '', $extension['description'] ) ); ?>
870 </div>
871 </div>
872 </div>
873 <?php
874 }
875
876 /**
877 * Method render_purchase_notice()
878 *
879 * Render Purchase Notice.
880 */
881 public static function render_purchase_notice() {
882 $is_pro = MainWP_Hooks::is_pro_member();
883 ?>
884 <div id="mainwp-get-purchased-extensions-modal" class="ui first coupled modal">
885 <i class="close icon"></i>
886 <div class="header"><?php esc_html_e( 'Install Add-ons', 'mainwp' ); ?></div>
887 <div class="scrolling content"></div>
888 <div class="actions">
889 <div class="ui two columns stackable grid">
890 <div class="left aligned column">
891 <input type="button" class="ui green button" id="mainwp-extensions-installnow" value="<?php esc_attr_e( 'Install Selected Add-ons', 'mainwp' ); ?>">
892 </div>
893 <div class="right aligned column">
894 <?php if ( ! $is_pro ) : ?>
895 <a href="<?php echo esc_url( 'https://mainwp.com/signup/?utm_campaign=Dashboard%20-%20Upgrade%20to%20Pro&utm_source=Dashboard&utm_medium=install%20modal&utm_term=get%20mainwp%20pro' ); ?>" class="ui green basic button" target="_blank"><?php esc_html_e( 'Upgrade to Pro', 'mainwp' ); ?></a>
896 <?php endif; ?>
897 </div>
898 </div>
899 </div>
900 </div>
901 <?php
902 }
903
904 /**
905 * Render licensing actions bar.
906 *
907 * Displays the licensing status header and action buttons for managing add-ons,
908 * including license validation, bulk installation, and activation options.
909 *
910 * @param string|false $mainwp_api_key The MainWP API key or false if not set.
911 * @return void
912 */
913 public static function render_licensing_actions_bar( $mainwp_api_key ) { //phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
914 $extensions = MainWP_Extensions_Handler::get_extensions();
915
916 $count_enabled = is_array( $extensions ) ? count( $extensions ) : 0;
917
918 $has_api_key = ! empty( $mainwp_api_key );
919
920 $count_not_activated = 0;
921 if ( $has_api_key && is_array( $extensions ) ) {
922 foreach ( $extensions as $extension ) {
923 if ( isset( $extension['apiManager'] ) && $extension['apiManager'] && empty( $extension['has_api_key'] ) ) {
924 ++$count_not_activated;
925 }
926 }
927 }
928 $count_activated = $count_enabled - $count_not_activated;
929 ?>
930 <div class="mainwp-actions-bar" style="margin:0!important;">
931 <div class="ui stacking two column grid">
932 <div class="left aligned middle aligned column" id="mainwp-extensions-status-header">
933 <?php if ( ! $has_api_key ) : ?>
934 <h2 class="ui small header">
935 <i class="large yellow warning icon"></i>
936 <div class="content">
937 <?php esc_html_e( 'License Inactive', 'mainwp' ); ?>
938 <div class="sub header">
939 <?php
940 printf(
941 /* translators: %s: number of enabled add-ons */
942 esc_html__( '%s add-ons enabled • Missing License key • Updates Disabled', 'mainwp' ),
943 esc_html( $count_enabled )
944 );
945 ?>
946 </div>
947 </div>
948 </h2>
949 <?php elseif ( $count_not_activated > 0 ) : ?>
950 <h2 class="ui small header">
951 <i class="large yellow warning icon"></i>
952 <div class="content">
953 <?php
954 printf(
955 /* translators: %s: number of add-ons not activated */
956 esc_html( _n( '%s add-on not activated', '%s add-ons not activated', $count_not_activated, 'mainwp' ) ),
957 esc_html( $count_not_activated )
958 );
959 ?>
960 <div class="sub header">
961 <?php
962 printf(
963 /* translators: 1: number of enabled add-ons, 2: number of activated add-ons */
964 esc_html__( '%1$s add-ons enabled • %2$s activated • Updates enabled for activated add-ons', 'mainwp' ),
965 esc_html( $count_enabled ),
966 esc_html( $count_activated )
967 );
968 ?>
969 </div>
970 </div>
971 </h2>
972 <?php else : ?>
973 <h2 class="ui small header">
974 <i class="large green check icon"></i>
975 <div class="content">
976 <?php esc_html_e( 'License Active', 'mainwp' ); ?>
977 <div class="sub header">
978 <?php
979 printf(
980 /* translators: %s: number of enabled add-ons */
981 esc_html__( '%s add-ons enabled • All activated • Updates enabled', 'mainwp' ),
982 esc_html( $count_enabled )
983 );
984 ?>
985 </div>
986 </div>
987 </h2>
988 <?php endif; ?>
989 </div>
990 <div class="right aligned middle aligned column">
991 <div id="mainwp-manage-add-ons-buttons">
992 <a href="javascript:void(0);" class="ui grey basic tiny button" id="mainwp-extensions-bulkinstall"><i class="download icon"></i> <?php esc_html_e( 'Install Add-ons', 'mainwp' ); ?></a>
993 <a href="javascript:void(0);" class="ui grey basic tiny button" id="mainwp-extensions-grabkeys"><i class="unlock icon"></i> <?php esc_html_e( 'Activate Add-ons', 'mainwp' ); ?></a>
994 <a href="javascript:void(0);" class="ui green basic tiny button" id="mainwp-extensions-manage-toggle-on"><i class="key icon"></i> <?php echo empty( $mainwp_api_key ) ? esc_html__( 'Add License Key', 'mainwp' ) : esc_html__( 'Manage License', 'mainwp' ); ?></a>
995 </div>
996 <div id="mainwp-manage-license-buttons" class="hidden">
997 <span class="ui left icon tiny input"><i class="key icon"></i><input type="password" id="mainwp_com_api_key" autocomplete="new-password" autocorrect="off" autocapitalize="none" spellcheck="false" placeholder="<?php esc_attr_e( 'Enter your MainWP License Key', 'mainwp' ); ?>" value="<?php echo esc_attr( MainWP_Credential_Render::value_for_input( ! empty( $mainwp_api_key ) ) ); ?>"/></span>&nbsp;&nbsp;
998 <div class="ui checkbox">
999 <input type="checkbox" <?php echo '' !== $mainwp_api_key ? 'checked="checked"' : ''; ?> name="extensions_api_savemylogin_chk" id="extensions_api_savemylogin_chk">
1000 <label for="extensions_api_savemylogin_chk"><small><?php esc_html_e( 'Remember Key', 'mainwp' ); ?></small></label>
1001 </div>&nbsp;&nbsp;
1002 <a href="javascript:void(0);" class="ui green basic tiny button" id="mainwp-extensions-savelogin"><i class="check icon"></i> <?php esc_html_e( 'Validate License', 'mainwp' ); // NOSONAR - id ok. ?></a>
1003 <a href="javascript:void(0);" class="ui grey basic tiny button" id="mainwp-extensions-manage-toggle-off"><?php esc_html_e( 'Close', 'mainwp' ); ?></a>
1004 </div>
1005 </div>
1006 </div>
1007 </div>
1008 <?php
1009 $install_ext_slug = '';
1010 if ( isset( $_GET['message'] ) && 0 === strpos( wp_unslash( $_GET['message'] ), 'install-ext-' ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1011 $install_ext_slug = str_replace( 'install-ext-', '', wp_unslash( $_GET['message'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1012 ?>
1013 <input type="hidden" id="extension_install_ext_slug" value="<?php echo esc_attr( $install_ext_slug ); ?>">
1014 <?php
1015 }
1016 ?>
1017 <script type="text/javascript">
1018 jQuery( document ).ready( function ($) {
1019 <?php
1020 if ( ! empty( $install_ext_slug ) ) {
1021 ?>
1022 $('#mainwp-extensions-bulkinstall').trigger('click');
1023 <?php
1024 }
1025 ?>
1026 });
1027 </script>
1028 <?php
1029 }
1030
1031
1032
1033 /**
1034 * Method sort_extensions().
1035 *
1036 * @param array $exts Array of extensions.
1037 *
1038 * @return void
1039 */
1040 public static function sort_extensions( &$exts ) {
1041
1042 if ( ! is_array( $exts ) ) {
1043 return;
1044 }
1045 foreach ( $exts as $idx => $ext ) {
1046 if ( isset( $ext['name'] ) ) {
1047 $exts[ $idx ]['_polish_name'] = MainWP_Extensions_Handler::polish_ext_name( $ext, true );
1048
1049 }
1050 }
1051 MainWP_Utility::array_sort_existed_keys( $exts, '_polish_name' ); //phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- 4 => 'leftsub_order'.
1052 }
1053
1054 /**
1055 * Metod get_extension_groups()
1056 *
1057 * Grab current MainWP Extension Groups.
1058 *
1059 * @return array $groups
1060 */
1061 public static function get_extension_groups() {
1062 return array(
1063 'admin' => esc_html__( 'Administrative', 'mainwp' ),
1064 'agency' => esc_html__( 'Agency', 'mainwp' ),
1065 'backup' => esc_html__( 'Backups', 'mainwp' ),
1066 'client' => esc_html__( 'Client', 'mainwp' ),
1067 'content' => esc_html__( 'Content Operations', 'mainwp' ),
1068 'monitoring' => esc_html__( 'Monitoring', 'mainwp' ),
1069 'performance' => esc_html__( 'Performance', 'mainwp' ),
1070 'security' => esc_html__( 'Security', 'mainwp' ),
1071 'visitor' => esc_html__( 'Analytics', 'mainwp' ),
1072 'updates' => esc_html__( 'Updates', 'mainwp' ),
1073 );
1074 }
1075
1076 /**
1077 * Method get_available_extensions()
1078 *
1079 * Static Arrays of all Available Extensions.
1080 *
1081 * @param mixed $types Extensions type. Default: array( 'free', 'pro' ).
1082 * @param array $ext_grouped Extensions grouped. Default: array().
1083 *
1084 * @devtodo Move to MainWP Server via an XML file.
1085 */
1086 public static function get_available_extensions( $types = array( 'free', 'pro' ), $ext_grouped = array() ) { //phpcs:ignore -- NOSONAR - complex.
1087
1088 $folder_url = MAINWP_PLUGIN_URL . 'assets/images/extensions/';
1089 $all_exts = array(
1090 'advanced-uptime-monitor-extension' =>
1091 array(
1092 'type' => 'free',
1093 'model' => 'integration',
1094 'slug' => 'advanced-uptime-monitor-extension',
1095 'title' => 'MainWP Advanced Uptime Monitor',
1096 'desc' => 'MainWP Extension for real-time up time monitoring.',
1097 'link' => 'https://mainwp.com/add-on/advanced-uptime-monitor/',
1098 'changelog_url' => 'https://mainwp.com/changelog/mainwp-advanced-uptime-monitor-extension/',
1099 'img' => $folder_url . 'advanced-uptime-monitor.png',
1100 'product_id' => 'Advanced Uptime Monitor Extension',
1101 'product_item_id' => 0,
1102 'catalog_id' => '218',
1103 'group' => array( 'monitoring' ),
1104 'privacy' => 1, // 0 -standalone, 1 - API integration, 2 - 3rd party plugin integration
1105 'integration' => 'Uptime Robot API',
1106 'integration_url' => 'https://uptimerobot.com/',
1107 'integration_owner' => 'Uptime Robot Service Provider Ltd.',
1108 'integration_owner_pp' => 'https://uptimerobot.com/privacy/',
1109 'integration_1' => 'Better Uptime API',
1110 'integration_url_1' => 'https://betteruptime.com/',
1111 'integration_owner_1' => 'Better Stack, Inc.',
1112 'integration_owner_pp_1' => 'https://betterstack.com/privacy',
1113 'integration_2' => 'NodePing API',
1114 'integration_url_2' => 'https://nodeping.com/',
1115 'integration_owner_2' => 'NodePing LLC',
1116 'integration_owner_pp_2' => 'https://nodeping.com/privacy.html',
1117 'integration_3' => 'Site24x7 API',
1118 'integration_url_3' => 'https://www.site24x7.com/',
1119 'integration_owner_3' => 'Zoho Corporation Pvt. Ltd.',
1120 'integration_owner_pp_3' => 'https://www.zoho.com/privacy.html',
1121 ),
1122 'mainwp-article-uploader-extension' =>
1123 array(
1124 'type' => 'pro',
1125 'model' => 'extension',
1126 'slug' => 'mainwp-article-uploader-extension',
1127 'title' => 'MainWP Article Uploader Extension',
1128 'desc' => 'MainWP Article Uploader Extension allows you to bulk upload articles to your dashboard and publish to child sites.',
1129 'link' => 'https://mainwp.com/add-on/article-uploader/',
1130 'changelog_url' => 'https://mainwp.com/changelog/mainwp-article-uploader-extension/',
1131 'img' => $folder_url . 'article-uploader.png',
1132 'product_id' => 'MainWP Article Uploader Extension',
1133 'product_item_id' => 0,
1134 'catalog_id' => '15340',
1135 'group' => array( 'content' ),
1136 'privacy' => 0,
1137 'integration' => '',
1138 'integration_url' => '',
1139 'integration_owner' => '',
1140 'integration_owner_pp' => '',
1141 ),
1142 'mainwp-atarim-extension' =>
1143 array(
1144 'type' => 'pro',
1145 'model' => 'integration',
1146 'slug' => 'mainwp-atarim-extension',
1147 'title' => 'MainWP Atarim Extension',
1148 'desc' => 'MainWP Atarim Extension allows you get your Atarim info about managed sites to your MainWP Dashboard.',
1149 'link' => 'https://mainwp.com/add-on/atarim/',
1150 'changelog_url' => 'https://mainwp.com/changelog/mainwp-atarim-extension/',
1151 'img' => $folder_url . 'atarim.png',
1152 'product_id' => 'MainWP Atarim Extension',
1153 'product_item_id' => 0,
1154 'catalog_id' => '1251161',
1155 'group' => array( 'admin' ),
1156 'privacy' => 1,
1157 'integration' => 'Atarim API',
1158 'integration_url' => 'https://atarim.io/',
1159 'integration_owner' => 'WP FeedBack LTD',
1160 'integration_owner_pp' => 'https://atarim.io/privacy-policy/',
1161 ),
1162 'mainwp-backwpup-extension' =>
1163 array(
1164 'type' => 'free',
1165 'model' => 'integration',
1166 'slug' => 'mainwp-backwpup-extension',
1167 'title' => 'MainWP BackWPup Extension',
1168 'desc' => 'MainWP BackWPup Extension combines the power of your MainWP Dashboard with the popular WordPress BackWPup Plugin. It allows you to schedule backups on your child sites.',
1169 'link' => 'https://mainwp.com/add-on/backwpup/',
1170 'changelog_url' => 'https://mainwp.com/changelog/mainwp-backwpup-extension/',
1171 'img' => $folder_url . 'backwpup.png',
1172 'product_id' => 'MainWP BackWPup Extension',
1173 'product_item_id' => 0,
1174 'catalog_id' => '995008',
1175 'group' => array( 'backup' ),
1176 'privacy' => 2,
1177 'integration' => 'BackWPup WordPress Backup Plugin',
1178 'integration_url' => 'https://backwpup.com/',
1179 'integration_owner' => 'Inpsyde GmbH',
1180 'integration_owner_pp' => 'https://backwpup.com/privacy/',
1181 ),
1182 'boilerplate-extension' =>
1183 array(
1184 'type' => 'pro',
1185 'model' => 'extension',
1186 'slug' => 'boilerplate-extension',
1187 'title' => 'MainWP Boilerplate Extension',
1188 'desc' => 'MainWP Boilerplate extension allows you to create, edit and share repetitive pages across your network of child sites. The available placeholders allow these pages to be customized for each site without needing to be rewritten. The Boilerplate extension is the perfect solution for commonly repeated pages such as your "Privacy Policy", "About Us", "Terms of Use", "Support Policy", or any other page with standard text that needs to be distributed across your network.',
1189 'link' => 'https://mainwp.com/add-on/boilerplate/',
1190 'changelog_url' => 'https://mainwp.com/changelog/mainwp-boilerplate-extension/',
1191 'img' => $folder_url . 'boilerplate.png',
1192 'product_id' => 'Boilerplate Extension',
1193 'product_item_id' => 0,
1194 'catalog_id' => '1188',
1195 'group' => array( 'content' ),
1196 'privacy' => 0,
1197 'integration' => '',
1198 'integration_url' => '',
1199 'integration_owner' => '',
1200 'integration_owner_pp' => '',
1201 ),
1202 'mainwp-buddy-extension' =>
1203 array(
1204 'type' => 'free',
1205 'model' => 'integration',
1206 'slug' => 'mainwp-buddy-extension',
1207 'title' => 'MainWP Buddy Extension',
1208 'desc' => 'With the MainWP Buddy Extension, you can control the BackupBuddy Plugin settings for all your child sites directly from your MainWP Dashboard. This includes giving you the ability to create your child site backups and even set Backup schedules directly from your MainWP Dashboard.',
1209 'link' => 'https://mainwp.com/add-on/mainwpbuddy/',
1210 'changelog_url' => 'https://mainwp.com/changelog/mainwp-buddy-extension/',
1211 'img' => $folder_url . 'mainwp-buddy.png',
1212 'product_id' => 'MainWP Buddy Extension',
1213 'product_item_id' => 0,
1214 'catalog_id' => '1006044',
1215 'group' => array( 'backup' ),
1216 'privacy' => 2,
1217 'integration' => 'BackupBuddy Plugin',
1218 'integration_url' => 'https://ithemes.com/',
1219 'integration_owner' => 'Liquid Web, LLC',
1220 'integration_owner_pp' => 'https://www.liquidweb.com/about-us/policies/privacy-policy/',
1221 ),
1222 'mainwp-bulk-settings-manager' =>
1223 array(
1224 'type' => 'pro',
1225 'model' => 'extension',
1226 'slug' => 'mainwp-bulk-settings-manager',
1227 'title' => 'MainWP Bulk Settings Manager',
1228 'desc' => 'The Bulk Settings Manager Extension unlocks the world of WordPress directly from your MainWP Dashboard. With Bulk Settings Manager you can adjust your Child site settings for the WordPress Core and almost any WordPress Plugin or Theme.',
1229 'link' => 'https://mainwp.com/add-on/bulk-settings-manager/',
1230 'changelog_url' => 'https://mainwp.com/changelog/mainwp-bulk-settings-manager-extension/',
1231 'img' => $folder_url . 'bulk-settings-manager.png',
1232 'product_id' => 'MainWP Bulk Settings Manager',
1233 'product_item_id' => 0,
1234 'catalog_id' => '347704',
1235 'group' => array( 'admin' ),
1236 'privacy' => 0,
1237 'integration' => '',
1238 'integration_url' => '',
1239 'integration_owner' => '',
1240 'integration_owner_pp' => '',
1241 ),
1242 'mainwp-cache-control-extension' =>
1243 array(
1244 'type' => 'pro',
1245 'model' => 'extension',
1246 'slug' => 'mainwp-cache-control-extension',
1247 'title' => 'MainWP Cache Control Extension',
1248 'desc' => 'MainWP Cache Control allows you to automatically purge the Cache on your child sites after performing an update of WP Core, Theme, or a Plugin through the MainWP Dashboard.',
1249 'link' => 'https://mainwp.com/add-on/cache-control/',
1250 'changelog_url' => 'https://mainwp.com/changelog/mainwp-cache-control-extension/',
1251 'img' => $folder_url . 'cache-control.png',
1252 'product_id' => 'MainWP Cache Control Extension',
1253 'product_item_id' => 0,
1254 'catalog_id' => '1263050',
1255 'group' => array( 'performance' ),
1256 'privacy' => 1,
1257 'integration' => 'Cloudflare API',
1258 'integration_url' => 'https://www.cloudflare.com/',
1259 'integration_owner' => 'Cloudflare, Inc.',
1260 'integration_owner_pp' => 'https://www.cloudflare.com/privacypolicy/',
1261 'release_date' => 1676847600,
1262 ),
1263 'mainwp-clone-extension' =>
1264 array(
1265 'type' => 'pro',
1266 'model' => 'extension',
1267 'slug' => 'mainwp-clone-extension',
1268 'title' => 'MainWP Clone Extension',
1269 'desc' => 'MainWP Clone Extension is an extension for the MainWP plugin that enables you to clone your child sites with no technical knowledge required.',
1270 'link' => 'https://mainwp.com/add-on/clone/',
1271 'changelog_url' => 'https://mainwp.com/changelog/mainwp-clone-extension/',
1272 'img' => $folder_url . 'clone.png',
1273 'product_id' => 'MainWP Clone Extension',
1274 'product_item_id' => 0,
1275 'catalog_id' => '1555',
1276 'group' => array( 'admin' ),
1277 'privacy' => 0,
1278 'integration' => '',
1279 'integration_url' => '',
1280 'integration_owner' => '',
1281 'integration_owner_pp' => '',
1282 ),
1283 'mainwp-code-snippets-extension' =>
1284 array(
1285 'type' => 'pro',
1286 'model' => 'extension',
1287 'slug' => 'mainwp-code-snippets-extension',
1288 'title' => 'MainWP Code Snippets Extension',
1289 'desc' => 'The MainWP Code Snippets Extension is a powerful PHP platform that enables you to execute php code and scripts on your child sites and view the output on your Dashboard. Requires the MainWP Dashboard plugin.',
1290 'link' => 'https://mainwp.com/add-on/code-snippets/',
1291 'changelog_url' => 'https://mainwp.com/changelog/mainwp-code-snippets-extension/',
1292 'img' => $folder_url . 'code-snippets.png',
1293 'product_id' => 'MainWP Code Snippets Extension',
1294 'product_item_id' => 0,
1295 'catalog_id' => '11196',
1296 'group' => array( 'admin' ),
1297 'privacy' => 0,
1298 'integration' => '',
1299 'integration_url' => '',
1300 'integration_owner' => '',
1301 'integration_owner_pp' => '',
1302 ),
1303 'mainwp-comments-extension' =>
1304 array(
1305 'type' => 'pro',
1306 'model' => 'extension',
1307 'slug' => 'mainwp-comments-extension',
1308 'title' => 'MainWP Comments Extension',
1309 'desc' => 'MainWP Comments Extension is an extension for the MainWP plugin that enables you to manage comments on your child sites.',
1310 'link' => 'https://mainwp.com/add-on/comments/',
1311 'changelog_url' => 'https://mainwp.com/changelog/mainwp-comments-extension/',
1312 'img' => $folder_url . 'comments.png',
1313 'product_id' => 'MainWP Comments Extension',
1314 'product_item_id' => 0,
1315 'catalog_id' => '1551',
1316 'group' => array( 'admin' ),
1317 'privacy' => 0,
1318 'integration' => '',
1319 'integration_url' => '',
1320 'integration_owner' => '',
1321 'integration_owner_pp' => '',
1322 ),
1323 'mainwp-custom-dashboard-extension' =>
1324 array(
1325 'type' => 'free',
1326 'model' => 'extension',
1327 'slug' => 'mainwp-custom-dashboard-extension',
1328 'title' => 'MainWP Custom Dashboard Extension',
1329 'desc' => 'The purpose of this plugin is to contain your customisation snippets for your MainWP Dashboard.',
1330 'link' => 'https://mainwp.com/add-on/mainwp-custom-dashboard-extension/',
1331 'changelog_url' => 'https://mainwp.com/changelog/mainwp-custom-dashboard-extension/',
1332 'img' => $folder_url . 'custom-dashboard.png',
1333 'product_id' => 'MainWP Custom Dashboard Extension',
1334 'product_item_id' => 0,
1335 'catalog_id' => '1080528',
1336 'group' => array( 'admin' ),
1337 'privacy' => 0,
1338 'integration' => '',
1339 'integration_url' => '',
1340 'integration_owner' => '',
1341 'integration_owner_pp' => '',
1342 ),
1343 'mainwp-custom-post-types' =>
1344 array(
1345 'type' => 'pro',
1346 'model' => 'extension',
1347 'slug' => 'mainwp-custom-post-types',
1348 'title' => 'MainWP Custom Post Type',
1349 'desc' => 'Custom Post Types Extension is an extension for the MainWP Plugin that allows you to manage almost any custom post type on your child sites and that includes Publishing, Editing, and Deleting custom post type content.',
1350 'link' => 'https://mainwp.com/add-on/custom-post-types/',
1351 'changelog_url' => 'https://mainwp.com/changelog/mainwp-custom-post-types-extension/',
1352 'img' => $folder_url . 'custom-post.png',
1353 'product_id' => 'MainWP Custom Post Types',
1354 'product_item_id' => 0,
1355 'catalog_id' => '1002564',
1356 'group' => array( 'admin' ),
1357 'privacy' => 0,
1358 'integration' => '',
1359 'integration_url' => '',
1360 'integration_owner' => '',
1361 'integration_owner_pp' => '',
1362 ),
1363 'mainwp-clean-and-lock-extension' =>
1364 array(
1365 'type' => 'free',
1366 'model' => 'extension',
1367 'slug' => 'mainwp-clean-and-lock-extension',
1368 'title' => 'MainWP Dashboard Lock Extension',
1369 'desc' => 'MainWP Dashboard Lock Extension allows you to limit access to your wp-admin and even redirect non-wp-admin pages to a different site making your MainWP Dashboard virtually invisible.',
1370 'link' => 'https://mainwp.com/add-on/dashboard-lock/',
1371 'changelog_url' => 'https://mainwp.com/changelog/mainwp-dashboard-lock-extension/',
1372 'img' => $folder_url . 'clean-and-lock.png',
1373 'product_id' => 'MainWP Clean and Lock Extension',
1374 'product_item_id' => 0,
1375 'catalog_id' => '12907',
1376 'group' => array( 'security' ),
1377 'privacy' => 0,
1378 'integration' => '',
1379 'integration_url' => '',
1380 'integration_owner' => '',
1381 'integration_owner_pp' => '',
1382 ),
1383 'mainwp-database-updater-extension' =>
1384 array(
1385 'type' => 'pro',
1386 'model' => 'extension',
1387 'slug' => 'mainwp-database-updater-extension',
1388 'title' => 'MainWP Database Updater Extension',
1389 'desc' => 'MainWP Database Updater Extension detects available Database updates for the WooCommerce and Elementor plugins, and allows you to process them.',
1390 'link' => 'https://mainwp.com/add-on/database-updater/',
1391 'changelog_url' => 'https://mainwp.com/changelog/mainwp-database-updater-extension/',
1392 'img' => $folder_url . 'database-updater.png',
1393 'product_id' => 'MainWP Database Updater Extension',
1394 'product_item_id' => 0,
1395 'catalog_id' => '1263539',
1396 'group' => array( 'updates' ),
1397 'privacy' => 0,
1398 'integration' => '',
1399 'integration_url' => '',
1400 'integration_owner' => '',
1401 'integration_owner_pp' => '',
1402 'release_date' => 1677106800,
1403 ),
1404 'mainwp-domain-monitor-extension' =>
1405 array(
1406 'type' => 'pro',
1407 'model' => 'integration',
1408 'slug' => 'mainwp-domain-monitor-extension',
1409 'title' => 'MainWP Domain Monitor Extension',
1410 'desc' => 'MainWP Domain Monitor Extension lets you keep a watchful eye on your domains. It alerts you via email when monitored domains are nearing expiration.',
1411 'link' => 'https://mainwp.com/add-on/domain-monitor/',
1412 'changelog_url' => 'https://mainwp.com/changelog/mainwp-domain-monitor-extension/',
1413 'img' => $folder_url . 'domain-monitor.png',
1414 'product_id' => 'MainWP Domain Monitor Extension',
1415 'product_item_id' => 0,
1416 'catalog_id' => '1240624',
1417 'group' => array( 'monitoring' ),
1418 'privacy' => 0,
1419 'integration' => '',
1420 'integration_url' => '',
1421 'integration_owner' => '',
1422 'integration_owner_pp' => '',
1423 ),
1424 'mainwp-early-access-extension' =>
1425 array(
1426 'type' => 'free',
1427 'model' => 'extension',
1428 'slug' => 'mainwp-early-access-extension',
1429 'title' => 'MainWP Early Access Extension',
1430 'desc' => 'The MainWP Early Access Extension lets you safely opt into pre-release versions of MainWP plugins and add-ons, so you can test new features early, provide feedback, and stay ahead.',
1431 'link' => 'https://mainwp.com/add-on/early-access/',
1432 'changelog_url' => 'https://mainwp.com/changelog/mainwp-early-access-extension/',
1433 'img' => $folder_url . 'early-access.png',
1434 'product_id' => 'MainWP Early Access Extension',
1435 'product_item_id' => 0,
1436 'catalog_id' => '1318737',
1437 'group' => array( 'admin' ),
1438 'privacy' => 0,
1439 'integration' => '',
1440 'integration_url' => '',
1441 'integration_owner' => '',
1442 'integration_owner_pp' => '',
1443 ),
1444 'mainwp-favorites-extension' =>
1445 array(
1446 'type' => 'pro',
1447 'model' => 'extension',
1448 'slug' => 'mainwp-favorites-extension',
1449 'title' => 'MainWP Favorites Extension',
1450 'desc' => 'MainWP Favorites is an extension for the MainWP plugin that allows you to store your favorite plugins and themes, and install them directly to child sites from the dashboard repository.',
1451 'link' => 'https://mainwp.com/add-on/favorites/',
1452 'changelog_url' => 'https://mainwp.com/changelog/mainwp-favorites-extension/',
1453 'img' => $folder_url . 'favorites.png',
1454 'product_id' => 'MainWP Favorites Extension',
1455 'product_item_id' => 0,
1456 'catalog_id' => '1379',
1457 'group' => array( 'admin' ),
1458 'privacy' => 0,
1459 'integration' => '',
1460 'integration_url' => '',
1461 'integration_owner' => '',
1462 'integration_owner_pp' => '',
1463 ),
1464 'mainwp-fathom-extension' =>
1465 array(
1466 'type' => 'pro',
1467 'model' => 'integration',
1468 'slug' => 'mainwp-fathom-extension',
1469 'title' => 'MainWP Fathom Extension',
1470 'desc' => 'MainWP Fathom Extension is an extension for the MainWP plugin that enables you to monitor detailed statistics about your child sites traffic. It integrates seamlessly with your Fathom account.',
1471 'link' => 'https://mainwp.com/add-on/fathom/',
1472 'changelog_url' => 'https://mainwp.com/changelog/mainwp-fathom-extension/',
1473 'img' => $folder_url . 'fathom.png',
1474 'product_id' => 'MainWP Fathom Extension',
1475 'product_item_id' => 0,
1476 'catalog_id' => '1274704',
1477 'group' => array( 'visitor' ),
1478 'privacy' => 1,
1479 'integration' => 'Fathom Analytics API',
1480 'integration_url' => 'https://usefathom.com/',
1481 'integration_owner' => 'Conva Ventures Inc.',
1482 'integration_owner_pp' => 'https://usefathom.com/privacy',
1483 ),
1484 'mainwp-file-uploader-extension' =>
1485 array(
1486 'type' => 'pro',
1487 'model' => 'extension',
1488 'slug' => 'mainwp-file-uploader-extension',
1489 'title' => 'MainWP File Uploader Extension',
1490 'desc' => 'MainWP File Uploader Extension gives you an simple way to upload files to your child sites! Requires the MainWP Dashboard plugin.',
1491 'link' => 'https://mainwp.com/add-on/file-uploader/',
1492 'changelog_url' => 'https://mainwp.com/changelog/mainwp-file-uploader-extension/',
1493 'img' => $folder_url . 'file-uploader.png',
1494 'product_id' => 'MainWP File Uploader Extension',
1495 'product_item_id' => 0,
1496 'catalog_id' => '11637',
1497 'group' => array( 'admin' ),
1498 'privacy' => 0,
1499 'integration' => '',
1500 'integration_url' => '',
1501 'integration_owner' => '',
1502 'integration_owner_pp' => '',
1503 ),
1504 'mainwp-google-analytics-extension' =>
1505 array(
1506 'type' => 'pro',
1507 'model' => 'integration',
1508 'slug' => 'mainwp-google-analytics-extension',
1509 'title' => 'MainWP Google Analytics Extension',
1510 'desc' => 'MainWP Google Analytics Extension is an extension for the MainWP plugin that enables you to monitor detailed statistics about your child sites traffic. It integrates seamlessly with your Google Analytics account.',
1511 'link' => 'https://mainwp.com/add-on/google-analytics/',
1512 'changelog_url' => 'https://mainwp.com/changelog/mainwp-google-analytics-extension/',
1513 'img' => $folder_url . 'google-analytics.png',
1514 'product_id' => 'MainWP Google Analytics Extension',
1515 'product_item_id' => 0,
1516 'catalog_id' => '1554',
1517 'group' => array( 'visitor' ),
1518 'privacy' => 1,
1519 'integration' => 'Google Analytics API',
1520 'integration_url' => 'https://analytics.google.com',
1521 'integration_owner' => 'Google LLC',
1522 'integration_owner_pp' => 'https://policies.google.com/privacy',
1523 ),
1524 'mainwp-google-search-console-extension' =>
1525 array(
1526 'type' => 'pro',
1527 'model' => 'integration',
1528 'slug' => 'mainwp-google-search-console-extension',
1529 'title' => 'MainWP Google Search Console Extension',
1530 'desc' => 'Monitor search performance, indexing status, and search queries for all your WordPress sites from Google Search Console within your central MainWP Dashboard.',
1531 'link' => 'https://mainwp.com/add-on/google-search-console/',
1532 'changelog_url' => 'https://mainwp.com/changelog/mainwp-google-search-console-extension/',
1533 'img' => $folder_url . 'google-search-console.png',
1534 'product_id' => 'MainWP Google Search Console Extension',
1535 'product_item_id' => 0,
1536 'catalog_id' => '1312071',
1537 'group' => array( 'visitor' ),
1538 'privacy' => 1,
1539 'integration' => 'Google Search Console API',
1540 'integration_url' => 'https://search.google.com',
1541 'integration_owner' => 'Google LLC',
1542 'integration_owner_pp' => 'https://policies.google.com/privacy',
1543 ),
1544 'mainwp-jetpack-protect-extension' =>
1545 array(
1546 'type' => 'free',
1547 'model' => 'integration',
1548 'slug' => 'mainwp-jetpack-protect-extension',
1549 'title' => 'MainWP Jetpack Protect Extension',
1550 'desc' => 'MainWP Jetpack Protect Extension uses the Jetpack Protect plugin to bring you information about vulnerable plugins and themes on your Child Sites so you can act accordingly.',
1551 'link' => 'https://mainwp.com/add-on/jetpack-protect/',
1552 'changelog_url' => 'https://mainwp.com/changelog/mainwp-jetpack-protect-extension/',
1553 'img' => $folder_url . 'jetpack-protect.png',
1554 'product_id' => 'MainWP Jetpack Protect Extension',
1555 'product_item_id' => 0,
1556 'catalog_id' => '1263547',
1557 'group' => array( 'security' ),
1558 'privacy' => 2,
1559 'integration' => 'Jetpack Protect',
1560 'integration_url' => 'https://jetpack.com/',
1561 'integration_owner' => 'Automattic Inc.',
1562 'integration_owner_pp' => 'https://automattic.com/privacy/',
1563 'release_date' => 1677020400,
1564 ),
1565 'mainwp-jetpack-scan-extension' =>
1566 array(
1567 'type' => 'pro',
1568 'model' => 'integration',
1569 'slug' => 'mainwp-jetpack-scan-extension',
1570 'title' => 'MainWP Jetpack Scan Extension',
1571 'desc' => 'MainWP Jetpack Scan Extension uses the Jetpack Scan API to bring you information about vulnerable plugins and themes on your Child Sites so you can act accordingly.',
1572 'link' => 'https://mainwp.com/add-on/jetpack-scan/',
1573 'changelog_url' => 'https://mainwp.com/changelog/mainwp-jetpack-scan-extension/',
1574 'img' => $folder_url . 'jetpack-scan.png',
1575 'product_id' => 'MainWP Jetpack Scan Extension',
1576 'product_item_id' => 0,
1577 'catalog_id' => '1263551',
1578 'group' => array( 'security' ),
1579 'privacy' => 1,
1580 'integration' => 'Jetpack Scan API',
1581 'integration_url' => 'https://jetpack.com/',
1582 'integration_owner' => 'Automattic Inc.',
1583 'integration_owner_pp' => 'https://automattic.com/privacy/',
1584 'release_date' => 1677020400,
1585 ),
1586 'mainwp-lighthouse-extension' =>
1587 array(
1588 'type' => 'pro',
1589 'model' => 'integration',
1590 'slug' => 'mainwp-lighthouse-extension',
1591 'title' => 'MainWP Lighthouse Extension',
1592 'desc' => 'MainWP Lighthouse Extension is used for measuring the quality of your websites. It uses the Google PageSpeed Insights API to audit performance, accessibility and search engine optimization of your WordPress sites.',
1593 'link' => 'https://mainwp.com/add-on/lighthouse/',
1594 'changelog_url' => 'https://mainwp.com/changelog/mainwp-lighthouse-extension/',
1595 'img' => $folder_url . 'lighthouse.png',
1596 'product_id' => 'MainWP Lighthouse Extension',
1597 'product_item_id' => 0,
1598 'catalog_id' => '1233934',
1599 'group' => array( 'monitoring' ),
1600 'privacy' => 1,
1601 'integration' => 'Google PageSpeed Insights API',
1602 'integration_url' => 'https://pagespeed.web.dev/',
1603 'integration_owner' => 'Google LLC',
1604 'integration_owner_pp' => 'https://policies.google.com/privacy',
1605 ),
1606 'mainwp-maintenance-extension' =>
1607 array(
1608 'type' => 'pro',
1609 'model' => 'extension',
1610 'slug' => 'mainwp-maintenance-extension',
1611 'title' => 'MainWP Maintenance Extension',
1612 'desc' => 'MainWP Maintenance Extension is MainWP Dashboard extension that clears unwanted entries from child sites in your network. You can delete post revisions, delete auto draft pots, delete trash posts, delete spam, pending and trash comments, delete unused tags and categories and optimize database tables on selected child sites.',
1613 'link' => 'https://mainwp.com/add-on/maintenance/',
1614 'changelog_url' => 'https://mainwp.com/changelog/mainwp-maintenance-extension/',
1615 'img' => $folder_url . 'maintenance.png',
1616 'product_id' => 'MainWP Maintenance Extension',
1617 'product_item_id' => 0,
1618 'catalog_id' => '1141',
1619 'group' => array( 'performance' ),
1620 'privacy' => 0,
1621 'integration' => '',
1622 'integration_url' => '',
1623 'integration_owner' => '',
1624 'integration_owner_pp' => '',
1625 ),
1626 'mainwp-patchstack-extension' =>
1627 array(
1628 'type' => 'free',
1629 'model' => 'integration',
1630 'slug' => 'mainwp-patchstack-extension',
1631 'title' => 'Patchstack Integration',
1632 'desc' => 'MainWP Patchstack Add-on integrates with Patchstack\'s security services to monitor your Child Sites for vulnerabilities and provide virtual patching protection, helping you maintain secure WordPress installations across your network.',
1633 'link' => 'https://mainwp.com/add-on/patchstack-integration/',
1634 'changelog_url' => 'https://mainwp.com/changelog/mainwp-patchstack-extension/',
1635 'img' => $folder_url . 'patchstack.png',
1636 'product_id' => 'MainWP Patchstack Integration',
1637 'product_item_id' => 0,
1638 'catalog_id' => '1313231',
1639 'group' => array( 'security' ),
1640 'privacy' => 1,
1641 'integration' => 'Patchstack API',
1642 'integration_url' => 'https://patchstack.com/',
1643 'integration_owner' => 'Patchstack OÜ',
1644 'integration_owner_pp' => 'https://patchstack.com/privacy-policy/',
1645 ),
1646 'mainwp-piwik-extension' =>
1647 array(
1648 'type' => 'pro',
1649 'model' => 'integration',
1650 'slug' => 'mainwp-piwik-extension',
1651 'title' => 'MainWP Piwik Extension',
1652 'desc' => 'MainWP Matomo Extension is an extension for the MainWP plugin that enables you to monitor detailed statistics about your child sites traffic. It integrates seamlessly with your Piwik account.',
1653 'link' => 'https://mainwp.com/add-on/matomo/',
1654 'changelog_url' => 'https://mainwp.com/changelog/mainwp-matomo-extension/',
1655 'img' => $folder_url . 'piwik.png',
1656 'product_id' => 'MainWP Piwik Extension',
1657 'product_item_id' => 0,
1658 'catalog_id' => '10523',
1659 'group' => array( 'visitor' ),
1660 'privacy' => 1,
1661 'integration' => 'Matomo API',
1662 'integration_url' => 'https://matomo.org/',
1663 'integration_owner' => 'InnoCraft',
1664 'integration_owner_pp' => 'https://matomo.org/privacy-policy/',
1665 ),
1666 'mainwp-post-dripper-extension' =>
1667 array(
1668 'type' => 'pro',
1669 'model' => 'extension',
1670 'slug' => 'mainwp-post-dripper-extension',
1671 'title' => 'MainWP Post Dripper Extension',
1672 'desc' => 'MainWP Post Dripper Extension allows you to deliver posts or pages to your network of sites over a pre-scheduled period of time. Requires MainWP Dashboard plugin.',
1673 'link' => 'https://mainwp.com/add-on/post-dripper/',
1674 'changelog_url' => 'https://mainwp.com/changelog/mainwp-post-dripper-extension/',
1675 'img' => $folder_url . 'post-dripper.png',
1676 'product_id' => 'MainWP Post Dripper Extension',
1677 'product_item_id' => 0,
1678 'catalog_id' => '11756',
1679 'group' => array( 'content' ),
1680 'privacy' => 0,
1681 'integration' => '',
1682 'integration_url' => '',
1683 'integration_owner' => '',
1684 'integration_owner_pp' => '',
1685 ),
1686 'mainwp-post-plus-extension' =>
1687 array(
1688 'type' => 'pro',
1689 'model' => 'extension',
1690 'slug' => 'mainwp-post-plus-extension',
1691 'title' => 'MainWP Post Plus Extension',
1692 'desc' => 'Enhance your MainWP publishing experience. The MainWP Post Plus Extension allows you to save work in progress as Post and Page drafts. That is not all, it allows you to use random authors, dates and categories for your posts and pages. Requires the MainWP Dashboard plugin.',
1693 'link' => 'https://mainwp.com/add-on/post-plus/',
1694 'changelog_url' => 'https://mainwp.com/changelog/mainwp-post-plus-extension/',
1695 'img' => $folder_url . 'post-plus.png',
1696 'product_id' => 'MainWP Post Plus Extension',
1697 'product_item_id' => 0,
1698 'catalog_id' => '12458',
1699 'group' => array( 'content' ),
1700 'privacy' => 0,
1701 'integration' => '',
1702 'integration_url' => '',
1703 'integration_owner' => '',
1704 'integration_owner_pp' => '',
1705 ),
1706 'mainwp-pressable-extension' =>
1707 array(
1708 'type' => 'pro',
1709 'model' => 'integration',
1710 'slug' => 'mainwp-pressable-extension',
1711 'title' => 'MainWP Pressable Extension',
1712 'desc' => 'MainWP Pressable Extension simplifies your Pressable hosting management experience, such as creating, disabling, and deleting websites, enabling/disabling CDN, managing backups, and more without the need to log in to your Pressable account.',
1713 'link' => 'https://mainwp.com/add-on/pressable/',
1714 'changelog_url' => 'https://mainwp.com/changelog/mainwp-pressable-extension/',
1715 'img' => $folder_url . 'pressable.png',
1716 'product_id' => 'MainWP Pressable Extension',
1717 'product_item_id' => 0,
1718 'catalog_id' => '1271427',
1719 'group' => array( 'admin' ),
1720 'privacy' => 1,
1721 'integration' => 'Pressable API',
1722 'integration_url' => 'https://pressable.com/',
1723 'integration_owner' => 'Pressable, Inc.',
1724 'integration_owner_pp' => 'https://automattic.com/privacy/',
1725 ),
1726 'mainwp-pro-reports-extension' =>
1727 array(
1728 'type' => 'pro',
1729 'model' => 'extension',
1730 'slug' => 'mainwp-pro-reports-extension',
1731 'title' => 'MainWP Pro Reports Extension',
1732 'desc' => 'The MainWP Pro Reports extension is a fully customizable reporting engine that allows you to create the type of report you are proud to send to your clients.',
1733 'link' => 'https://mainwp.com/add-on/pro-reports/',
1734 'changelog_url' => 'https://mainwp.com/changelog/mainwp-pro-reports-extension/',
1735 'img' => $folder_url . 'pro-reports.png',
1736 'product_id' => 'MainWP Pro Reports Extension',
1737 'product_item_id' => 0,
1738 'catalog_id' => '1133708',
1739 'group' => array( 'client' ),
1740 'privacy' => 0,
1741 'integration' => '',
1742 'integration_url' => '',
1743 'integration_owner' => '',
1744 'integration_owner_pp' => '',
1745 ),
1746 'mainwp-regression-testing-extension' =>
1747 array(
1748 'type' => 'pro',
1749 'model' => 'extension',
1750 'slug' => 'mainwp-regression-testing-extension',
1751 'title' => 'MainWP Regression Testing Extension',
1752 'desc' => 'Easily spot changes in your child site\'s source code to ensure updates don\'t introduce unexpected changes.',
1753 'link' => 'https://mainwp.com/add-on/regression-testing/',
1754 'changelog_url' => 'https://mainwp.com/changelog/mainwp-regression-testing-extension/',
1755 'img' => $folder_url . 'regression-testing.png',
1756 'product_id' => 'MainWP Regression Testing Extension',
1757 'product_item_id' => 0,
1758 'catalog_id' => '1305199',
1759 'group' => array( 'updates' ),
1760 'privacy' => 0,
1761 'integration' => '',
1762 'integration_url' => '',
1763 'integration_owner' => '',
1764 'integration_owner_pp' => '',
1765 ),
1766 'mainwp-rocket-extension' =>
1767 array(
1768 'type' => 'pro',
1769 'model' => 'integration',
1770 'slug' => 'mainwp-rocket-extension',
1771 'title' => 'MainWP Rocket Extension',
1772 'desc' => 'MainWP Rocket Extension combines the power of your MainWP Dashboard with the popular WP Rocket Plugin. It allows you to mange WP Rocket settings and quickly Clear and Preload cache on your child sites.',
1773 'link' => 'https://mainwp.com/add-on/rocket/',
1774 'changelog_url' => 'https://mainwp.com/changelog/mainwp-rocket-extension/',
1775 'img' => $folder_url . 'rocket.png',
1776 'product_id' => 'MainWP Rocket Extension',
1777 'product_item_id' => 0,
1778 'catalog_id' => '335257',
1779 'group' => array( 'performance' ),
1780 'privacy' => 2,
1781 'integration' => 'WP Rocket Plugin',
1782 'integration_url' => 'https://wp-rocket.me/',
1783 'integration_owner' => 'WP Media, Inc.',
1784 'integration_owner_pp' => 'https://wp-rocket.me/privacy-policy/',
1785 ),
1786 'mainwp-sucuri-extension' =>
1787 array(
1788 'type' => 'free',
1789 'model' => 'integration',
1790 'slug' => 'mainwp-sucuri-extension',
1791 'title' => 'MainWP Sucuri Extension',
1792 'desc' => 'MainWP Sucuri Extension enables you to scan your child sites for various types of malware, spam injections, website errors, and much more. Requires the MainWP Dashboard.',
1793 'link' => 'https://mainwp.com/add-on/sucuri/',
1794 'changelog_url' => 'https://mainwp.com/changelog/mainwp-sucuri-extension/',
1795 'img' => $folder_url . 'sucuri.png',
1796 'product_id' => 'MainWP Sucuri Extension',
1797 'product_item_id' => 0,
1798 'catalog_id' => '10777',
1799 'group' => array( 'security' ),
1800 'privacy' => 1,
1801 'integration' => 'Sucuri API',
1802 'integration_url' => 'https://sucuri.net/',
1803 'integration_owner' => 'GoDaddy Mediatemple, Inc., d/b/a Sucuri.',
1804 'integration_owner_pp' => 'https://sucuri.net/privacy/',
1805 ),
1806 'mainwp-ithemes-security-extension' =>
1807 array(
1808 'type' => 'pro',
1809 'model' => 'integration',
1810 'slug' => 'mainwp-ithemes-security-extension',
1811 'title' => 'MainWP Solid Security Integration Extension',
1812 'desc' => 'The Solid Security Integration Extension combines the power of your MainWP Dashboard with the popular Solid Security Integration Plugin. It allows you to manage Solid Security Integration plugin settings directly from your dashboard. Requires MainWP Dashboard plugin.',
1813 'link' => 'https://mainwp.com/add-on/ithemes-security/',
1814 'changelog_url' => 'https://mainwp.com/changelog/mainwp-ithemes-security-extension/',
1815 'img' => $folder_url . 'ithemes.png',
1816 'product_id' => 'MainWP Security Extension',
1817 'product_item_id' => 0,
1818 'catalog_id' => '113355',
1819 'group' => array( 'security' ),
1820 'privacy' => 2,
1821 'integration' => 'Solid Security Integration Plugin',
1822 'integration_url' => 'https://ithemes.com/',
1823 'integration_owner' => 'Liquid Web, LLC',
1824 'integration_owner_pp' => 'https://www.liquidweb.com/about-us/policies/privacy-policy/',
1825 ),
1826 'mainwp-ssl-monitor-extension' =>
1827 array(
1828 'type' => 'pro',
1829 'model' => 'extension',
1830 'slug' => 'mainwp-ssl-monitor-extension',
1831 'title' => 'MainWP SSL Monitor Extension',
1832 'desc' => 'MainWP SSL Monitor Extension lets you keep a watchful eye on your SSL Certificates. It alerts you via email when monitored certificates are nearing expiration.',
1833 'link' => 'https://mainwp.com/add-on/ssl-monitor/',
1834 'changelog_url' => 'https://mainwp.com/changelog/mainwp-ssl-monitor-extension/',
1835 'img' => $folder_url . 'ssl-monitor.png',
1836 'product_id' => 'MainWP SSL Monitor Extension',
1837 'product_item_id' => 0,
1838 'catalog_id' => '1263543',
1839 'group' => array( 'monitoring' ),
1840 'privacy' => 0,
1841 'integration' => '',
1842 'integration_url' => '',
1843 'integration_owner' => '',
1844 'integration_owner_pp' => '',
1845 'release_date' => 1676934000,
1846 ),
1847 'mainwp-staging-extension' =>
1848 array(
1849 'type' => 'pro',
1850 'model' => 'integration',
1851 'slug' => 'mainwp-staging-extension',
1852 'title' => 'MainWP Staging Extension',
1853 'desc' => 'MainWP Staging Extension along with the WP Staging plugin, allows you to create and manage staging sites for your child sites.',
1854 'link' => 'https://mainwp.com/add-on/staging/',
1855 'changelog_url' => 'https://mainwp.com/changelog/mainwp-staging-extension/',
1856 'img' => $folder_url . 'staging.png',
1857 'product_id' => 'MainWP Staging Extension',
1858 'product_item_id' => 0,
1859 'catalog_id' => '1034878',
1860 'group' => array( 'admin' ),
1861 'privacy' => 2,
1862 'integration' => 'WP STAGING Backup Duplicator & Migration Plugin',
1863 'integration_url' => 'https://wp-staging.com/',
1864 'integration_owner' => 'WP STAGING',
1865 'integration_owner_pp' => 'https://wp-staging.com/privacy-policy/',
1866 ),
1867 'mainwp-team-control' =>
1868 array(
1869 'type' => 'pro',
1870 'model' => 'extension',
1871 'slug' => 'mainwp-team-control',
1872 'title' => 'MainWP Team Control',
1873 'desc' => 'MainWP Team Control extension allows you to create a custom roles for your dashboard site users and limiting their access to MainWP features. Requires MainWP Dashboard plugin.',
1874 'link' => 'https://mainwp.com/add-on/team-control/',
1875 'changelog_url' => 'https://mainwp.com/changelog/mainwp-team-control-extension/',
1876 'img' => $folder_url . 'team-control.png',
1877 'product_id' => 'MainWP Team Control',
1878 'product_item_id' => 0,
1879 'catalog_id' => '23936',
1880 'group' => array( 'agency' ),
1881 'privacy' => 0,
1882 'integration' => '',
1883 'integration_url' => '',
1884 'integration_owner' => '',
1885 'integration_owner_pp' => '',
1886 ),
1887 'termageddon-for-mainwp' =>
1888 array(
1889 'type' => 'free',
1890 'model' => 'integration',
1891 'slug' => 'termageddon-for-mainwp',
1892 'title' => 'Termageddon for MainWP',
1893 'desc' => 'This extension is used for creating Privacy Policy, ToS, Disclaimer and Cookie Policy & Consent Tool pages automatically on your websites.',
1894 'link' => 'https://mainwp.com/add-on/termageddon-for-mainwp/',
1895 'changelog_url' => 'https://mainwp.com/changelog/termageddon-for-mainwp/',
1896 'img' => $folder_url . 'termageddon.png',
1897 'product_id' => 'Termageddon for MainWP',
1898 'product_item_id' => 0,
1899 'catalog_id' => '1200201',
1900 'group' => array( 'content' ),
1901 'privacy' => 1,
1902 'integration' => 'Termageddon API',
1903 'integration_url' => 'https://termageddon.com/',
1904 'integration_owner' => 'Termageddon, LLC',
1905 'integration_owner_pp' => 'https://termageddon.com/privacy-policy/',
1906 'release_date' => 1678921200,
1907 ),
1908 'mainwp-timecapsule-extension' =>
1909 array(
1910 'type' => 'free',
1911 'model' => 'integration',
1912 'slug' => 'mainwp-timecapsule-extension',
1913 'title' => 'MainWP Time Capsule Extension',
1914 'desc' => 'With the MainWP Time Capsule Extension, you can control the WP Time Capsule Plugin on all your child sites directly from your MainWP Dashboard. This includes the ability to create your child site backups and even restore your child sites to a point back in time directly from your dashboard.',
1915 'link' => 'https://mainwp.com/add-on/time-capsule/',
1916 'changelog_url' => 'https://mainwp.com/changelog/mainwp-time-capsule-extension/',
1917 'img' => $folder_url . 'time-capsule.png',
1918 'product_id' => 'MainWP Time Capsule Extension',
1919 'product_item_id' => 0,
1920 'catalog_id' => '1049003',
1921 'group' => array( 'backup' ),
1922 'privacy' => 2,
1923 'integration' => 'Backup and Staging by WP Time Capsule',
1924 'integration_url' => 'https://wptimecapsule.com/',
1925 'integration_owner' => 'Revmakx, LLC.',
1926 'integration_owner_pp' => 'https://wptimecapsule.com/privacy-policy/',
1927 ),
1928 'mainwp-time-tracker-extension' =>
1929 array(
1930 'type' => 'pro',
1931 'model' => 'extension',
1932 'slug' => 'mainwp-time-tracker-extension',
1933 'title' => 'MainWP Time Tracker Extension',
1934 'desc' => 'Simplify client billing with precise project hour logging and detailed reporting. This tool integrates directly into your Dashboard for streamlined billing, ensuring accuracy and transparency in client charges.',
1935 'link' => 'https://mainwp.com/add-on/time-tracker/',
1936 'changelog_url' => 'https://mainwp.com/changelog/mainwp-time-tracker-extension/',
1937 'img' => $folder_url . 'time-tracker.png',
1938 'product_id' => 'MainWP Time Tracker Extension',
1939 'product_item_id' => 0,
1940 'catalog_id' => '1284683',
1941 'group' => array( 'client' ),
1942 'privacy' => 0,
1943 'integration' => '',
1944 'integration_url' => '',
1945 'integration_owner' => '',
1946 'integration_owner_pp' => '',
1947 ),
1948 'mainwp-cost-tracker-assistant-extension' =>
1949 array(
1950 'type' => 'pro',
1951 'model' => 'extension',
1952 'slug' => 'mainwp-cost-tracker-assistant-extension',
1953 'title' => 'MainWP Cost Tracker Assistant Extension',
1954 'desc' => 'Enhance your MainWP Dashboard by adding timely notifications for upcoming subscription renewals and automates cost tracking for newly installed plugins and themes through zip uploads, streamlining cost management tasks.',
1955 'link' => 'https://mainwp.com/add-on/cost-tracker-assistant/',
1956 'changelog_url' => 'https://mainwp.com/changelog/mainwp-cost-tracker-assistant-extension/',
1957 'img' => $folder_url . 'cost-tracker-assistant.png',
1958 'product_id' => 'MainWP Cost Tracker Assistant Extension',
1959 'product_item_id' => 0,
1960 'catalog_id' => '1284687',
1961 'group' => array( 'admin' ),
1962 'privacy' => 0,
1963 'integration' => '',
1964 'integration_url' => '',
1965 'integration_owner' => '',
1966 'integration_owner_pp' => '',
1967 ),
1968 'mainwp-updraftplus-extension' =>
1969 array(
1970 'type' => 'free',
1971 'model' => 'integration',
1972 'slug' => 'mainwp-updraftplus-extension',
1973 'title' => 'MainWP UpdraftPlus Extension',
1974 'desc' => 'MainWP UpdraftPlus Extension combines the power of your MainWP Dashboard with the popular WordPress UpdraftPlus Plugin. It allows you to quickly back up your child sites.',
1975 'link' => 'https://mainwp.com/add-on/updraftplus/',
1976 'changelog_url' => 'https://mainwp.com/changelog/mainwp-updraftplus-extension/',
1977 'img' => $folder_url . 'updraftplus.png',
1978 'product_id' => 'MainWP UpdraftPlus Extension',
1979 'product_item_id' => 0,
1980 'catalog_id' => '165843',
1981 'group' => array( 'backup' ),
1982 'privacy' => 2,
1983 'integration' => 'UpdraftPlus WordPress Backup Plugin',
1984 'integration_url' => 'https://updraftplus.com/',
1985 'integration_owner' => 'Updraft WP Software Ltd.',
1986 'integration_owner_pp' => 'https://updraftplus.com/data-protection-and-privacy-centre/',
1987 ),
1988 'mainwp-url-extractor-extension' =>
1989 array(
1990 'type' => 'pro',
1991 'model' => 'extension',
1992 'slug' => 'mainwp-url-extractor-extension',
1993 'title' => 'MainWP URL Extractor Extension',
1994 'desc' => 'MainWP URL Extractor allows you to search your child sites post and pages and export URLs in customized format. Requires MainWP Dashboard plugin.',
1995 'link' => 'https://mainwp.com/add-on/url-extractor/',
1996 'changelog_url' => 'https://mainwp.com/changelog/mainwp-url-extractor-extension/',
1997 'img' => $folder_url . 'url-extractor.png',
1998 'product_id' => 'MainWP Url Extractor Extension',
1999 'product_item_id' => 0,
2000 'catalog_id' => '11965',
2001 'group' => array( 'admin' ),
2002 'privacy' => 0,
2003 'integration' => '',
2004 'integration_url' => '',
2005 'integration_owner' => '',
2006 'integration_owner_pp' => '',
2007 ),
2008 'mainwp-virusdie-extension' =>
2009 array(
2010 'type' => 'pro',
2011 'model' => 'integration',
2012 'slug' => 'mainwp-virusdie-extension',
2013 'title' => 'MainWP Virusdie Extension',
2014 'desc' => 'MainWP Virusdie Extension enables you to scan your child sites for various types of malware, spam injections, website errors, and much more. Requires the MainWP Dashboard.',
2015 'link' => 'https://mainwp.com/add-on/virusdie/',
2016 'changelog_url' => 'https://mainwp.com/changelog/mainwp-virusdie-extension/',
2017 'img' => $folder_url . 'virusdie.png',
2018 'product_id' => 'MainWP Virusdie Extension',
2019 'product_item_id' => 0,
2020 'catalog_id' => '1213235',
2021 'group' => array( 'security' ),
2022 'privacy' => 1,
2023 'integration' => 'Virusdie API',
2024 'integration_url' => 'https://virusdie.com/',
2025 'integration_owner' => 'Virusdie OU',
2026 'integration_owner_pp' => 'https://virusdie.com/rules/privacypolicy/',
2027 ),
2028 'mainwp-vulnerability-checker-extension' =>
2029 array(
2030 'type' => 'free',
2031 'model' => 'integration',
2032 'slug' => 'mainwp-vulnerability-checker-extension',
2033 'title' => 'MainWP Vulnerability Checker Extension',
2034 'desc' => 'MainWP Vulnerability Checker extension uses WPScan Vulnerability Database API to bring you information about vulnerable plugins on your Child Sites so you can act accordingly.',
2035 'link' => 'https://mainwp.com/add-on/vulnerability-checker/',
2036 'changelog_url' => 'https://mainwp.com/changelog/mainwp-vulnerability-checker-extension/',
2037 'img' => $folder_url . 'vulnerability-checker.png',
2038 'product_id' => 'MainWP Vulnerability Checker Extension',
2039 'product_item_id' => 0,
2040 'catalog_id' => '12458',
2041 'group' => array( 'security' ),
2042 'privacy' => 1,
2043 'integration' => 'WPScan API',
2044 'integration_url' => 'https://wpscan.com/',
2045 'integration_owner' => 'Automattic Inc.',
2046 'integration_owner_pp' => 'https://automattic.com/privacy/',
2047 'integration_1' => 'NVD NIST API',
2048 'integration_url_1' => 'https://nvd.nist.gov/',
2049 'integration_owner_1' => 'National Institute of Standards and Technology',
2050 'integration_owner_pp_1' => 'https://www.nist.gov/privacy-policy',
2051 ),
2052 'mainwp-branding-extension' =>
2053 array(
2054 'type' => 'pro',
2055 'model' => 'extension',
2056 'slug' => 'mainwp-branding-extension',
2057 'title' => 'MainWP White Label Extension',
2058 'desc' => 'The MainWP White Label extension allows you to alter the details of the MianWP Child Plugin to reflect your companies brand or completely hide the plugin from the installed plugins list.',
2059 'link' => 'https://mainwp.com/add-on/white-label/',
2060 'changelog_url' => 'https://mainwp.com/changelog/mainwp-white-label-extension/',
2061 'img' => $folder_url . 'branding.png',
2062 'product_id' => 'MainWP Branding Extension',
2063 'product_item_id' => 0,
2064 'catalog_id' => '10679',
2065 'group' => array( 'agency' ),
2066 'privacy' => 0,
2067 'integration' => '',
2068 'integration_url' => '',
2069 'integration_owner' => '',
2070 'integration_owner_pp' => '',
2071 ),
2072 'mainwp-woocommerce-shortcuts-extension' =>
2073 array(
2074 'type' => 'free',
2075 'model' => 'integration',
2076 'slug' => 'mainwp-woocommerce-shortcuts-extension',
2077 'title' => 'MainWP WooCommerce Shortcuts Extension',
2078 'desc' => 'MainWP WooCommerce Shortcuts provides you a quick access WooCommerce pages in your network. Requires MainWP Dashboard plugin.',
2079 'link' => 'https://mainwp.com/add-on/woocommerce-shortcuts/',
2080 'changelog_url' => 'https://mainwp.com/changelog/mainwp-woocommerce-shortcuts-extension/',
2081 'img' => $folder_url . 'woo-shortcuts.png',
2082 'product_id' => 'MainWP WooCommerce Shortcuts Extension',
2083 'product_item_id' => 0,
2084 'catalog_id' => '12706',
2085 'group' => array( 'admin' ),
2086 'privacy' => 2,
2087 'integration' => 'WooCommerce Plugin',
2088 'integration_url' => 'https://woocommerce.com',
2089 'integration_owner' => 'Automattic Inc.',
2090 'integration_owner_pp' => 'https://automattic.com/privacy/',
2091 ),
2092 'mainwp-woocommerce-status-extension' =>
2093 array(
2094 'type' => 'pro',
2095 'model' => 'integration',
2096 'slug' => 'mainwp-woocommerce-status-extension',
2097 'title' => 'MainWP WooCommerce Status Extension',
2098 'desc' => 'MainWP WooCommerce Status provides you a quick overview of your WooCommerce stores in your network. Requires MainWP Dashboard plugin.',
2099 'link' => 'https://mainwp.com/add-on/woocommerce-status/',
2100 'changelog_url' => 'https://mainwp.com/changelog/mainwp-woocommerce-status-extension/',
2101 'img' => $folder_url . 'woo-status.png',
2102 'product_id' => 'MainWP WooCommerce Status Extension',
2103 'product_item_id' => 0,
2104 'catalog_id' => '12671',
2105 'group' => array( 'admin' ),
2106 'privacy' => 2,
2107 'integration' => 'WooCommerce Plugin',
2108 'integration_url' => 'https://woocommerce.com',
2109 'integration_owner' => 'Automattic Inc.',
2110 'integration_owner_pp' => 'https://automattic.com/privacy/',
2111 ),
2112 'mainwp-wordfence-extension' =>
2113 array(
2114 'type' => 'pro',
2115 'model' => 'integration',
2116 'slug' => 'mainwp-wordfence-extension',
2117 'title' => 'MainWP WordFence Extension',
2118 'desc' => 'The WordFence Extension combines the power of your MainWP Dashboard with the popular WordPress Wordfence Plugin. It allows you to manage WordFence settings, Monitor Live Traffic and Scan your child sites directly from your dashboard. Requires MainWP Dashboard plugin.',
2119 'link' => 'https://mainwp.com/add-on/wordfence/',
2120 'changelog_url' => 'https://mainwp.com/changelog/mainwp-wordfence-extension/',
2121 'img' => $folder_url . 'wordfence.png',
2122 'product_id' => 'MainWP Wordfence Extension',
2123 'product_item_id' => 0,
2124 'catalog_id' => '19678',
2125 'group' => array( 'security' ),
2126 'privacy' => 2,
2127 'integration' => 'Wordfence Security � Firewall & Malware Scan Plugin',
2128 'integration_url' => 'https://www.wordfence.com/',
2129 'integration_owner' => 'Defiant, Inc.',
2130 'integration_owner_pp' => 'https://www.wordfence.com/privacy-policy/',
2131 ),
2132 'wordpress-seo-extension' =>
2133 array(
2134 'type' => 'pro',
2135 'model' => 'integration',
2136 'slug' => 'wordpress-seo-extension',
2137 'title' => 'MainWP Yoast SEO Extension',
2138 'desc' => 'MainWP Yoast SEO extension by MainWP enables you to manage all your WordPress SEO by Yoast plugins across your network. Create and quickly set settings templates from one central dashboard. Requires MainWP Dashboard plugin.',
2139 'link' => 'https://mainwp.com/add-on/wordpress-seo/',
2140 'changelog_url' => 'https://mainwp.com/changelog/mainwp-wordpress-seo-extension/',
2141 'img' => $folder_url . 'wordpress-seo.png',
2142 'product_id' => 'MainWP WordPress SEO Extension',
2143 'product_item_id' => 0,
2144 'catalog_id' => '12080',
2145 'group' => array( 'content' ),
2146 'privacy' => 2,
2147 'integration' => 'Yoast SEO Plugin',
2148 'integration_url' => 'https://yoast.com/',
2149 'integration_owner' => 'Newfold Capital Inc.',
2150 'integration_owner_pp' => 'https://yoast.com/privacy-policy/',
2151 ),
2152 'wp-security-audit-log' => array(
2153 'type' => 'org',
2154 'model' => 'integration',
2155 'product_id' => 'wp-security-audit-log',
2156 'slug' => 'wp-security-audit-log/wp-security-audit-log.php',
2157 'title' => 'Activity Log For MainWP',
2158 'link' => 'https://wordpress.org/plugins/wp-security-audit-log/',
2159 'changelog_url' => 'https://wordpress.org/plugins/wp-security-audit-log/#developers',
2160 'url' => 'https://wordpress.org/plugins/wp-security-audit-log/',
2161 'group' => array( 'security' ),
2162 'privacy' => 2,
2163 'integration' => 'WP Activity Log',
2164 'integration_url' => 'https://wpactivitylog.com/',
2165 'integration_owner' => 'WP White Security',
2166 'integration_owner_pp' => 'https://www.wpwhitesecurity.com/privacy-policy/',
2167 'desc' => 'Add the Activity Logs for MainWP extension to also keep a log of all the user activity and other changes that happen both on the MainWP dashboard, collate child site activity logs',
2168 ),
2169 'aam-extension-mainwp' => array(
2170 'type' => 'org',
2171 'model' => 'integration',
2172 'product_id' => 'aam-extension-mainwp',
2173 'slug' => 'aam-extension-mainwp/aam-extension-mainwp.php',
2174 'title' => 'AAM Extension for MainWP',
2175 'link' => 'https://wordpress.org/plugins/aam-extension-mainwp/',
2176 'changelog_url' => 'https://wordpress.org/plugins/aam-extension-mainwp/#developers',
2177 'url' => 'https://wordpress.org/plugins/aam-extension-mainwp/',
2178 'group' => array( 'security' ),
2179 'privacy' => 2,
2180 'integration' => 'Advanced Access Manager',
2181 'integration_url' => 'https://aamportal.com/',
2182 'integration_owner' => 'AAM Plugin',
2183 'integration_owner_pp' => 'https://wordpress.org/plugins/advanced-access-manager/',
2184 'desc' => 'This extension integrates Advanced Access Manager (AAM) with MainWP, enabling seamless synchronization of AAM security scan results with your MainWP dashboard.',
2185 ),
2186 'security-ninja-for-mainwp' => array(
2187 'type' => 'org',
2188 'model' => 'integration',
2189 'product_id' => 'security-ninja-for-mainwp',
2190 'slug' => 'security-ninja-for-mainwp/security-ninja-mainwp.php',
2191 'title' => 'Security Ninja For MainWP',
2192 'link' => 'https://wordpress.org/plugins/security-ninja-for-mainwp/',
2193 'changelog_url' => 'https://wordpress.org/plugins/security-ninja-for-mainwp/#developers',
2194 'url' => 'https://wordpress.org/plugins/security-ninja-for-mainwp/',
2195 'group' => array( 'security' ),
2196 'privacy' => 2,
2197 'integration' => 'Security Ninja',
2198 'integration_url' => 'https://wpsecurityninja.com/',
2199 'integration_owner' => 'Larsik Corp',
2200 'integration_owner_pp' => 'https://larsik.com/privacy/',
2201 'desc' => 'Security Ninja is a strong plugin that helps you find vulnerabilites and improve the security on your website.',
2202 ),
2203 'wp-compress-mainwp' => array(
2204 'type' => 'org',
2205 'model' => 'integration',
2206 'product_id' => 'wp-compress-mainwp',
2207 'slug' => 'wp-compress-mainwp/wp-compress-main-wp.php',
2208 'title' => 'WP Compress for MainWP',
2209 'link' => 'https://wordpress.org/plugins/wp-compress-mainwp/',
2210 'changelog_url' => 'https://wordpress.org/plugins/wp-compress-mainwp/#developers',
2211 'url' => 'https://wordpress.org/plugins/wp-compress-mainwp/',
2212 'group' => array( 'performance' ),
2213 'privacy' => 2,
2214 'integration' => 'WP Compress',
2215 'integration_url' => 'https://wpcompress.com/',
2216 'integration_owner' => 'WP Compress',
2217 'integration_owner_pp' => 'https://wpcompress.com/privacy-policy/',
2218 ),
2219 'seopress-for-mainwp' => array(
2220 'type' => 'org',
2221 'model' => 'integration',
2222 'product_id' => 'seopress-for-mainwp',
2223 'slug' => 'seopress-for-mainwp/seopress-for-mainwp.php',
2224 'title' => 'SEOPress for MainWP',
2225 'link' => 'https://wordpress.org/plugins/seopress-for-mainwp/',
2226 'changelog_url' => 'https://wordpress.org/plugins/seopress-for-mainwp/#developers',
2227 'url' => 'https://wordpress.org/plugins/seopress-for-mainwp/',
2228 'group' => array( 'content' ),
2229 'privacy' => 2,
2230 'integration' => 'SEOPress',
2231 'integration_url' => 'https://www.seopress.org/',
2232 'integration_owner' => 'SEOPRESS',
2233 'integration_owner_pp' => 'https://www.seopress.org/privacy-policy/',
2234 ),
2235 'wpvivid-backup-mainwp' => array(
2236 'type' => 'org',
2237 'model' => 'integration',
2238 'product_id' => 'wpvivid-backup-mainwp',
2239 'slug' => 'wpvivid-backup-mainwp/wpvivid-backup-mainwp.php',
2240 'title' => 'WPvivid Backup for MainWP',
2241 'link' => 'https://wordpress.org/plugins/wpvivid-backup-mainwp/',
2242 'changelog_url' => 'https://wordpress.org/plugins/wpvivid-backup-mainwp/#developers',
2243 'url' => 'https://wordpress.org/plugins/wpvivid-backup-mainwp/',
2244 'group' => array( 'backup' ),
2245 'privacy' => 2,
2246 'integration' => 'WPvivid Backup',
2247 'integration_url' => 'https://wpvivid.com/',
2248 'integration_owner' => 'VPSrobots Inc.',
2249 'integration_owner_pp' => 'https://wpvivid.com/privacy-policy',
2250 'desc' => 'WPvivid Backup for MainWP enables you to create and download backups of a specific child site, set backup schedules, set WPvivid Backup Plugin settings for all of your child sites directly from your MainWP Dashboard.',
2251 ),
2252 'independent-analytics-for-mainwp' => array(
2253 'type' => 'org',
2254 'model' => 'integration',
2255 'product_id' => 'independent-analytics-for-mainwp',
2256 'slug' => 'independent-analytics-for-mainwp/independent-analytics-for-mainwp.php',
2257 'title' => 'Independent Analytics for MainWP',
2258 'link' => 'https://wordpress.org/plugins/independent-analytics-for-mainwp/',
2259 'changelog_url' => 'https://wordpress.org/plugins/independent-analytics-for-mainwp/#developers',
2260 'url' => 'https://wordpress.org/plugins/independent-analytics-for-mainwp/',
2261 'group' => array( 'visitor' ),
2262 'privacy' => 2,
2263 'integration' => 'Independent Analytics',
2264 'integration_url' => 'https://independentwp.com/',
2265 'integration_owner' => 'Independent Insights',
2266 'integration_owner_pp' => 'https://independentwp.com/privacy-policy/',
2267 'desc' => 'This is a free extension for MainWP that lets you view stats from all of your sites using Independent Analytics in the main Overview menu.',
2268 ),
2269 'update-brief-mainwp' => array(
2270 'type' => 'org',
2271 'model' => 'integration',
2272 'product_id' => 'update-brief-mainwp',
2273 'slug' => 'update-brief-mainwp/update-brief-mainwp.php',
2274 'title' => 'Update Brief for MainWP',
2275 'link' => 'https://wordpress.org/plugins/update-brief-mainwp/',
2276 'changelog_url' => 'https://wordpress.org/plugins/update-brief-mainwp/#developers',
2277 'url' => 'https://wordpress.org/plugins/update-brief-mainwp/',
2278 'group' => array( 'client' ),
2279 'privacy' => 1,
2280 'integration' => 'Update Brief',
2281 'integration_url' => 'https://updatebrief.com/',
2282 'integration_owner' => 'Ascend Online Media Limited',
2283 'integration_owner_pp' => 'https://updatebrief.com/policy/',
2284 'desc' => 'Turn WP and plugin updates into compelling client reports that clearly show your maintenance value through concise, professional update summaries.',
2285 ),
2286 'burst-mainwp' => array(
2287 'type' => 'org',
2288 'model' => 'integration',
2289 'product_id' => 'burst-mainwp',
2290 'slug' => 'burst-mainwp/burst-mainwp.php',
2291 'title' => 'Burst Statistics for MainWP',
2292 'link' => 'https://wordpress.org/plugins/burst-mainwp/',
2293 'changelog_url' => 'https://wordpress.org/plugins/burst-mainwp/#developers',
2294 'url' => 'https://wordpress.org/plugins/burst-mainwp/',
2295 'group' => array( 'visitor' ),
2296 'privacy' => 2,
2297 'integration' => 'Burst Statistics',
2298 'integration_url' => 'https://burst-statistics.com/',
2299 'integration_owner' => 'Burst Statistics BV',
2300 'integration_owner_pp' => 'https://burst-statistics.com/legal/privacy-statement-eu/',
2301 'desc' => 'The Burst Statistics MainWP Extension brings your privacy-friendly analytics into the MainWP dashboard. Monitor visitors, pageviews, and top content across all your child sites without leaving MainWP.',
2302 ),
2303 'adsanity-for-mainwp' => array(
2304 'type' => 'org',
2305 'model' => 'integration',
2306 'product_id' => 'adsanity-for-mainwp',
2307 'slug' => 'adsanity-for-mainwp/adsanity-for-mainwp.php',
2308 'title' => 'AdSanity for MainWP',
2309 'link' => 'https://wordpress.org/plugins/adsanity-for-mainwp/',
2310 'changelog_url' => 'https://wordpress.org/plugins/adsanity-for-mainwp/#developers',
2311 'url' => 'https://wordpress.org/plugins/adsanity-for-mainwp/',
2312 'group' => array( 'visitor' ),
2313 'privacy' => 2,
2314 'integration' => 'AdSanity',
2315 'integration_url' => 'https://adsanityplugin.com/',
2316 'integration_owner' => 'Pixel Jar Corporation',
2317 'integration_owner_pp' => 'https://adsanityplugin.com/privacy-policy/',
2318 'desc' => 'See AdSanity ad performance across your whole MainWP fleet from one dashboard, and catch expiring ads before your advertisers do.',
2319 ),
2320 'site-lockdown-security-for-mainwp' => array(
2321 'type' => 'org',
2322 'model' => 'integration',
2323 'product_id' => 'site-lockdown-security-for-mainwp',
2324 'slug' => 'site-lockdown-security-for-mainwp/mainwp-site-lockdown-security.php',
2325 'title' => 'Site Lockdown Security for MainWP',
2326 'link' => 'https://wordpress.org/plugins/site-lockdown-security-for-mainwp/',
2327 'changelog_url' => 'https://wordpress.org/plugins/site-lockdown-security-for-mainwp/#developers',
2328 'url' => 'https://wordpress.org/plugins/site-lockdown-security-for-mainwp/',
2329 'group' => array( 'security' ),
2330 'privacy' => 2,
2331 'integration' => 'Site Lockdown Security',
2332 'integration_url' => 'https://wordpress.org/plugins/folder-auditor/',
2333 'integration_owner' => 'WP Fix It LLC',
2334 'integration_owner_pp' => 'https://www.wpfixit.com/privacy-policy/',
2335 'desc' => 'Manage Site Lockdown Security across your MainWP child sites with fast lock-status visibility, bulk sync tools, and one-click lock actions.',
2336 ),
2337 );
2338
2339 $list = array();
2340
2341 if ( is_string( $types ) ) {
2342 if ( 'all' === $types ) {
2343 return $all_exts;
2344 } elseif ( in_array( $types, array( 'free', 'pro', 'org' ) ) ) {
2345 $list = array();
2346 foreach ( $all_exts as $slug => $ext ) {
2347 if ( $ext['type'] === $types ) {
2348
2349 $list[ $slug ] = $ext;
2350
2351 }
2352 }
2353 return $list;
2354
2355 }
2356 }
2357
2358 if ( is_array( $types ) ) {
2359 $list = array();
2360 foreach ( $all_exts as $slug => $ext ) {
2361 if ( in_array( $ext['type'], $types ) ) {
2362 $list[ $slug ] = $ext;
2363 }
2364 }
2365 }
2366
2367 if ( is_array( $ext_grouped ) && ! empty( $ext_grouped ) ) {
2368 $list = array();
2369 foreach ( $all_exts as $slug => $ext ) {
2370 foreach ( $ext_grouped as $group ) {
2371 if ( in_array( $group, $ext['group'] ) ) {
2372 $list[ $slug ] = $ext;
2373 }
2374 }
2375 }
2376 }
2377
2378 return $list;
2379 }
2380 }
2381