Version Description
Download this release
Release Info
Developer | wpdevteam |
Plugin | EmbedPress – Embed Google Docs, YouTube, Maps, Vimeo, Wistia Videos & Upload PDF, PPT in Gutenberg & Elementor |
Version | 2.7.7 |
Comparing to | |
See all releases |
Code changes from version 2.7.6 to 2.7.7
- EmbedPress/Includes/Classes/EmbedPress_Notice.php +47 -41
- EmbedPress/Includes/Traits/Shared.php +3 -10
- embedpress.php +1 -1
- includes.php +1 -1
- readme.txt +5 -2
EmbedPress/Includes/Classes/EmbedPress_Notice.php
CHANGED
@@ -145,13 +145,13 @@ class EmbedPress_Notice {
|
|
145 |
}
|
146 |
$return_notice = $this->next_notice();
|
147 |
$current_notice = current( $return_notice );
|
148 |
-
$next_notice = next( $return_notice );
|
149 |
|
150 |
$deserve_notice = $this->deserve_notice( $current_notice );
|
151 |
$options_data = $this->get_options_data();
|
152 |
$user_notices = $this->get_user_notices();
|
153 |
|
154 |
-
$notice_time = isset( $options_data[ $this->plugin_name ]['notice_will_show'][ $current_notice ] )
|
155 |
? $options_data[ $this->plugin_name ]['notice_will_show'][ $current_notice ] : $this->timestamp;
|
156 |
$next_notice_time = $next_notice ? $options_data[ $this->plugin_name ]['notice_will_show'][ $next_notice ] : $this->timestamp;
|
157 |
$current_notice_end = $this->makeTime( $notice_time, $this->cne_time );
|
@@ -177,7 +177,7 @@ class EmbedPress_Notice {
|
|
177 |
$notice_time = false;
|
178 |
}
|
179 |
}
|
180 |
-
|
181 |
if( $notice_time != false ) {
|
182 |
if( $notice_time <= $this->timestamp ) {
|
183 |
if( $current_notice === 'upsale' ) {
|
@@ -195,7 +195,7 @@ class EmbedPress_Notice {
|
|
195 |
return;
|
196 |
}
|
197 |
break;
|
198 |
-
case 'function' :
|
199 |
if( isset( $upsale_args['condition']['function'] ) && function_exists( $upsale_args['condition']['function'] ) ) {
|
200 |
unset( $options_data[ $this->plugin_name ]['notice_will_show'][ $current_notice ] );
|
201 |
$this->update_options_data( $options_data[ $this->plugin_name ] );
|
@@ -204,14 +204,16 @@ class EmbedPress_Notice {
|
|
204 |
break;
|
205 |
}
|
206 |
}
|
207 |
-
if
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
|
|
|
|
215 |
}
|
216 |
add_action( 'admin_notices', array( $this, 'upsale_notice' ) );
|
217 |
}
|
@@ -249,7 +251,7 @@ class EmbedPress_Notice {
|
|
249 |
* When links are clicked, this function will invoked.
|
250 |
* @return void
|
251 |
*/
|
252 |
-
public function clicked(){
|
253 |
if( isset( $_GET['plugin'] ) ) {
|
254 |
$plugin = sanitize_text_field( $_GET['plugin'] );
|
255 |
if( $plugin === $this->plugin_name ) {
|
@@ -264,38 +266,38 @@ class EmbedPress_Notice {
|
|
264 |
if( isset( $_GET['later'] ) ) {
|
265 |
$later = sanitize_text_field( $_GET['later'] );
|
266 |
}
|
267 |
-
|
268 |
$later_time = '';
|
269 |
-
|
270 |
switch( $clicked_from ) {
|
271 |
-
|
272 |
case 'opt_in' :
|
273 |
$dismiss = ( isset( $plugin_action ) ) ? $plugin_action : false ;
|
274 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
275 |
break;
|
276 |
-
|
277 |
-
case 'first_install' :
|
278 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
279 |
break;
|
280 |
-
|
281 |
-
case 'update' :
|
282 |
$dismiss = ( isset( $plugin_action ) ) ? $plugin_action : false ;
|
283 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
284 |
break;
|
285 |
-
|
286 |
-
case 'review' :
|
287 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
288 |
break;
|
289 |
-
|
290 |
-
case 'upsale' :
|
291 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
292 |
break;
|
293 |
}
|
294 |
-
|
295 |
-
if( isset( $later ) && $later == true ) {
|
296 |
$options_data[ $this->plugin_name ]['notice_will_show'][ $clicked_from ] = $later_time;
|
297 |
}
|
298 |
-
if( isset( $dismiss ) && $dismiss == true ) {
|
299 |
update_user_meta( get_current_user_id(), $this->plugin_name . '_' . $clicked_from, true );
|
300 |
$this->update( $clicked_from );
|
301 |
}
|
@@ -362,20 +364,20 @@ class EmbedPress_Notice {
|
|
362 |
case 'opt_in' :
|
363 |
do_action('wpdeveloper_optin_notice_for_' . $this->plugin_name );
|
364 |
break;
|
365 |
-
case 'first_install' :
|
366 |
if( $options_data[ $this->plugin_name ]['first_install'] !== 'deactivated' ) {
|
367 |
do_action( 'wpdeveloper_first_install_notice_for_' . $this->plugin_name );
|
368 |
$this->get_thumbnail( 'first_install' );
|
369 |
$this->get_message( 'first_install' );
|
370 |
}
|
371 |
break;
|
372 |
-
case 'update' :
|
373 |
do_action( 'wpdeveloper_update_notice_for_' . $this->plugin_name );
|
374 |
$this->get_thumbnail( 'update' );
|
375 |
$this->get_message( 'update' );
|
376 |
$this->dismiss_button_scripts();
|
377 |
break;
|
378 |
-
case 'review' :
|
379 |
do_action( 'wpdeveloper_review_notice_for_' . $this->plugin_name );
|
380 |
$this->get_thumbnail( 'review' );
|
381 |
$this->get_message( 'review' );
|
@@ -416,6 +418,10 @@ class EmbedPress_Notice {
|
|
416 |
*/
|
417 |
private function upsale_button(){
|
418 |
$upsale_args = $this->get_upsale_args();
|
|
|
|
|
|
|
|
|
419 |
$plugin_slug = ( isset( $upsale_args['slug'] )) ? $upsale_args['slug'] : '' ;
|
420 |
if( empty( $plugin_slug ) ) {
|
421 |
return;
|
@@ -494,7 +500,7 @@ class EmbedPress_Notice {
|
|
494 |
* @param string $notice
|
495 |
* @return boolean
|
496 |
*/
|
497 |
-
private function deserve_notice( $notice ) {
|
498 |
$notices = $this->get_user_notices();
|
499 |
if( $notice === false ) {
|
500 |
return false;
|
@@ -596,7 +602,7 @@ class EmbedPress_Notice {
|
|
596 |
}
|
597 |
$options_data = $this->get_options_data();
|
598 |
$args = wp_parse_args( $args, $this->get_args() );
|
599 |
-
if( ! isset( $options_data[ $this->plugin_name ] )
|
600 |
|| ( isset( $options_data[ $this->plugin_name ]['version'] ) && version_compare( $options_data[ $this->plugin_name ]['version'], $this->version, '!=' ) ) ) {
|
601 |
$this->update_options_data( $args );
|
602 |
}
|
@@ -748,14 +754,14 @@ class EmbedPress_Notice {
|
|
748 |
if( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ), 'wpdeveloper_notice_dissmiss' ) ) {
|
749 |
return;
|
750 |
}
|
751 |
-
|
752 |
if( ! isset( $_POST['action'] ) || ( $_POST['action'] !== 'wpdeveloper_notice_dissmiss_for_' . $this->plugin_name ) ) {
|
753 |
return;
|
754 |
}
|
755 |
-
|
756 |
$dismiss = isset( $_POST['dismiss'] ) ? $_POST['dismiss'] : false;
|
757 |
$notice = isset( $_POST['notice'] ) ? $_POST['notice'] : false;
|
758 |
-
if( $dismiss ) {
|
759 |
$this->update( $notice );
|
760 |
echo 'success';
|
761 |
} else {
|
@@ -765,21 +771,21 @@ class EmbedPress_Notice {
|
|
765 |
}
|
766 |
|
767 |
/**
|
768 |
-
* This function is responsible for do action when
|
769 |
* the dismiss button clicked in upsale notice.
|
770 |
*/
|
771 |
public function upsale_notice_dissmiss(){
|
772 |
-
|
773 |
if( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ), 'wpdeveloper_upsale_notice_dissmiss' ) ) {
|
774 |
return;
|
775 |
}
|
776 |
-
|
777 |
if( ! isset( $_POST['action'] ) || ( $_POST['action'] !== 'wpdeveloper_upsale_notice_dissmiss_for_' . $this->plugin_name ) ) {
|
778 |
return;
|
779 |
}
|
780 |
-
|
781 |
$dismiss = isset( $_POST['dismiss'] ) ? $_POST['dismiss'] : false;
|
782 |
-
if( $dismiss ) {
|
783 |
$this->update( 'upsale' );
|
784 |
echo 'success';
|
785 |
} else {
|
@@ -898,7 +904,7 @@ class EmbedPress_Notice {
|
|
898 |
});
|
899 |
} );
|
900 |
</script>
|
901 |
-
|
902 |
<?php
|
903 |
}
|
904 |
}
|
145 |
}
|
146 |
$return_notice = $this->next_notice();
|
147 |
$current_notice = current( $return_notice );
|
148 |
+
$next_notice = next( $return_notice );
|
149 |
|
150 |
$deserve_notice = $this->deserve_notice( $current_notice );
|
151 |
$options_data = $this->get_options_data();
|
152 |
$user_notices = $this->get_user_notices();
|
153 |
|
154 |
+
$notice_time = isset( $options_data[ $this->plugin_name ]['notice_will_show'][ $current_notice ] )
|
155 |
? $options_data[ $this->plugin_name ]['notice_will_show'][ $current_notice ] : $this->timestamp;
|
156 |
$next_notice_time = $next_notice ? $options_data[ $this->plugin_name ]['notice_will_show'][ $next_notice ] : $this->timestamp;
|
157 |
$current_notice_end = $this->makeTime( $notice_time, $this->cne_time );
|
177 |
$notice_time = false;
|
178 |
}
|
179 |
}
|
180 |
+
|
181 |
if( $notice_time != false ) {
|
182 |
if( $notice_time <= $this->timestamp ) {
|
183 |
if( $current_notice === 'upsale' ) {
|
195 |
return;
|
196 |
}
|
197 |
break;
|
198 |
+
case 'function' :
|
199 |
if( isset( $upsale_args['condition']['function'] ) && function_exists( $upsale_args['condition']['function'] ) ) {
|
200 |
unset( $options_data[ $this->plugin_name ]['notice_will_show'][ $current_notice ] );
|
201 |
$this->update_options_data( $options_data[ $this->plugin_name ] );
|
204 |
break;
|
205 |
}
|
206 |
}
|
207 |
+
if( isset( $upsale_args['slug'], $upsale_args['file'] ) ) {
|
208 |
+
if ( ! function_exists( 'get_plugins' ) ) {
|
209 |
+
include ABSPATH . '/wp-admin/includes/plugin.php';
|
210 |
+
}
|
211 |
+
$plugins = get_plugins();
|
212 |
+
$pkey = $upsale_args['slug'] . '/' . $upsale_args['file'];
|
213 |
+
if( isset( $plugins[ $pkey ] ) ) {
|
214 |
+
$this->update( $current_notice );
|
215 |
+
return;
|
216 |
+
}
|
217 |
}
|
218 |
add_action( 'admin_notices', array( $this, 'upsale_notice' ) );
|
219 |
}
|
251 |
* When links are clicked, this function will invoked.
|
252 |
* @return void
|
253 |
*/
|
254 |
+
public function clicked(){
|
255 |
if( isset( $_GET['plugin'] ) ) {
|
256 |
$plugin = sanitize_text_field( $_GET['plugin'] );
|
257 |
if( $plugin === $this->plugin_name ) {
|
266 |
if( isset( $_GET['later'] ) ) {
|
267 |
$later = sanitize_text_field( $_GET['later'] );
|
268 |
}
|
269 |
+
|
270 |
$later_time = '';
|
271 |
+
|
272 |
switch( $clicked_from ) {
|
273 |
+
|
274 |
case 'opt_in' :
|
275 |
$dismiss = ( isset( $plugin_action ) ) ? $plugin_action : false ;
|
276 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
277 |
break;
|
278 |
+
|
279 |
+
case 'first_install' :
|
280 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
281 |
break;
|
282 |
+
|
283 |
+
case 'update' :
|
284 |
$dismiss = ( isset( $plugin_action ) ) ? $plugin_action : false ;
|
285 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
286 |
break;
|
287 |
+
|
288 |
+
case 'review' :
|
289 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
290 |
break;
|
291 |
+
|
292 |
+
case 'upsale' :
|
293 |
$later_time = $this->makeTime( $this->timestamp, $this->maybe_later_time );
|
294 |
break;
|
295 |
}
|
296 |
+
|
297 |
+
if( isset( $later ) && $later == true ) {
|
298 |
$options_data[ $this->plugin_name ]['notice_will_show'][ $clicked_from ] = $later_time;
|
299 |
}
|
300 |
+
if( isset( $dismiss ) && $dismiss == true ) {
|
301 |
update_user_meta( get_current_user_id(), $this->plugin_name . '_' . $clicked_from, true );
|
302 |
$this->update( $clicked_from );
|
303 |
}
|
364 |
case 'opt_in' :
|
365 |
do_action('wpdeveloper_optin_notice_for_' . $this->plugin_name );
|
366 |
break;
|
367 |
+
case 'first_install' :
|
368 |
if( $options_data[ $this->plugin_name ]['first_install'] !== 'deactivated' ) {
|
369 |
do_action( 'wpdeveloper_first_install_notice_for_' . $this->plugin_name );
|
370 |
$this->get_thumbnail( 'first_install' );
|
371 |
$this->get_message( 'first_install' );
|
372 |
}
|
373 |
break;
|
374 |
+
case 'update' :
|
375 |
do_action( 'wpdeveloper_update_notice_for_' . $this->plugin_name );
|
376 |
$this->get_thumbnail( 'update' );
|
377 |
$this->get_message( 'update' );
|
378 |
$this->dismiss_button_scripts();
|
379 |
break;
|
380 |
+
case 'review' :
|
381 |
do_action( 'wpdeveloper_review_notice_for_' . $this->plugin_name );
|
382 |
$this->get_thumbnail( 'review' );
|
383 |
$this->get_message( 'review' );
|
418 |
*/
|
419 |
private function upsale_button(){
|
420 |
$upsale_args = $this->get_upsale_args();
|
421 |
+
if( isset( $upsale_args['href'] ) ) {
|
422 |
+
echo '<a href="'. $upsale_args['href'] .'" target="_blank" class="button button-primary">'. $upsale_args['btn_text'] .'</a>';
|
423 |
+
return;
|
424 |
+
}
|
425 |
$plugin_slug = ( isset( $upsale_args['slug'] )) ? $upsale_args['slug'] : '' ;
|
426 |
if( empty( $plugin_slug ) ) {
|
427 |
return;
|
500 |
* @param string $notice
|
501 |
* @return boolean
|
502 |
*/
|
503 |
+
private function deserve_notice( $notice ) {
|
504 |
$notices = $this->get_user_notices();
|
505 |
if( $notice === false ) {
|
506 |
return false;
|
602 |
}
|
603 |
$options_data = $this->get_options_data();
|
604 |
$args = wp_parse_args( $args, $this->get_args() );
|
605 |
+
if( ! isset( $options_data[ $this->plugin_name ] )
|
606 |
|| ( isset( $options_data[ $this->plugin_name ]['version'] ) && version_compare( $options_data[ $this->plugin_name ]['version'], $this->version, '!=' ) ) ) {
|
607 |
$this->update_options_data( $args );
|
608 |
}
|
754 |
if( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ), 'wpdeveloper_notice_dissmiss' ) ) {
|
755 |
return;
|
756 |
}
|
757 |
+
|
758 |
if( ! isset( $_POST['action'] ) || ( $_POST['action'] !== 'wpdeveloper_notice_dissmiss_for_' . $this->plugin_name ) ) {
|
759 |
return;
|
760 |
}
|
761 |
+
|
762 |
$dismiss = isset( $_POST['dismiss'] ) ? $_POST['dismiss'] : false;
|
763 |
$notice = isset( $_POST['notice'] ) ? $_POST['notice'] : false;
|
764 |
+
if( $dismiss ) {
|
765 |
$this->update( $notice );
|
766 |
echo 'success';
|
767 |
} else {
|
771 |
}
|
772 |
|
773 |
/**
|
774 |
+
* This function is responsible for do action when
|
775 |
* the dismiss button clicked in upsale notice.
|
776 |
*/
|
777 |
public function upsale_notice_dissmiss(){
|
778 |
+
|
779 |
if( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ), 'wpdeveloper_upsale_notice_dissmiss' ) ) {
|
780 |
return;
|
781 |
}
|
782 |
+
|
783 |
if( ! isset( $_POST['action'] ) || ( $_POST['action'] !== 'wpdeveloper_upsale_notice_dissmiss_for_' . $this->plugin_name ) ) {
|
784 |
return;
|
785 |
}
|
786 |
+
|
787 |
$dismiss = isset( $_POST['dismiss'] ) ? $_POST['dismiss'] : false;
|
788 |
+
if( $dismiss ) {
|
789 |
$this->update( 'upsale' );
|
790 |
echo 'success';
|
791 |
} else {
|
904 |
});
|
905 |
} );
|
906 |
</script>
|
907 |
+
|
908 |
<?php
|
909 |
}
|
910 |
}
|
EmbedPress/Includes/Traits/Shared.php
CHANGED
@@ -102,8 +102,7 @@ trait Shared {
|
|
102 |
* Message message for showing.
|
103 |
*/
|
104 |
$notice->classes( 'upsale', 'notice is-dismissible ' );
|
105 |
-
$notice->message( 'upsale', '<p>' . __( '
|
106 |
-
$notice->thumbnail( 'upsale', plugins_url( 'assets/images/essential-blocks.png', EMBEDPRESS_PLUGIN_BASENAME ) );
|
107 |
|
108 |
// Update Notice For PRO Version
|
109 |
if ( $this->is_pro_active() && \version_compare( EMBEDPRESS_PRO_VERSION, '2.0.0', '<' ) ) {
|
@@ -113,14 +112,8 @@ trait Shared {
|
|
113 |
}
|
114 |
|
115 |
$notice->upsale_args = array(
|
116 |
-
'
|
117 |
-
'
|
118 |
-
'file' => 'essential-blocks.php',
|
119 |
-
'btn_text' => __( 'Install Free', 'embedpress' ),
|
120 |
-
'condition' => [
|
121 |
-
'by' => 'class',
|
122 |
-
'class' => 'EssentialAdmin'
|
123 |
-
],
|
124 |
);
|
125 |
|
126 |
$notice->options_args = array(
|
102 |
* Message message for showing.
|
103 |
*/
|
104 |
$notice->classes( 'upsale', 'notice is-dismissible ' );
|
105 |
+
$notice->message( 'upsale', '<p>' . __( 'Thank you for relying on EmbedPress with 30,000 other websites. Checkout our Pro features.', $notice->text_domain ) . '</p>' );
|
|
|
106 |
|
107 |
// Update Notice For PRO Version
|
108 |
if ( $this->is_pro_active() && \version_compare( EMBEDPRESS_PRO_VERSION, '2.0.0', '<' ) ) {
|
112 |
}
|
113 |
|
114 |
$notice->upsale_args = array(
|
115 |
+
'href' => 'https://embedpress.com/?utm_source=plugin&utm_medium=free&utm_campaign=pro_upgrade#pricing',
|
116 |
+
'btn_text' => __( 'Learn More', 'embedpress' ),
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
);
|
118 |
|
119 |
$notice->options_args = array(
|
embedpress.php
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
* Description: EmbedPress lets you embed videos, images, posts, audio, maps and uplaoad PDF, DOC, PPT & all other types of content into your WordPress site with one-click and showcase it beautifully for the visitors. 100+ sources supported.
|
6 |
* Author: WPDeveloper
|
7 |
* Author URI: https://wpdeveloper.net
|
8 |
-
* Version: 2.7.
|
9 |
* Text Domain: embedpress
|
10 |
* Domain Path: /languages
|
11 |
*
|
5 |
* Description: EmbedPress lets you embed videos, images, posts, audio, maps and uplaoad PDF, DOC, PPT & all other types of content into your WordPress site with one-click and showcase it beautifully for the visitors. 100+ sources supported.
|
6 |
* Author: WPDeveloper
|
7 |
* Author URI: https://wpdeveloper.net
|
8 |
+
* Version: 2.7.7
|
9 |
* Text Domain: embedpress
|
10 |
* Domain Path: /languages
|
11 |
*
|
includes.php
CHANGED
@@ -22,7 +22,7 @@ if ( ! defined('EMBEDPRESS_PLG_NAME')) {
|
|
22 |
}
|
23 |
|
24 |
if ( ! defined('EMBEDPRESS_VERSION')) {
|
25 |
-
define('EMBEDPRESS_VERSION', "2.7.
|
26 |
/**
|
27 |
* @deprecated 2.2.0
|
28 |
*/
|
22 |
}
|
23 |
|
24 |
if ( ! defined('EMBEDPRESS_VERSION')) {
|
25 |
+
define('EMBEDPRESS_VERSION', "2.7.7");
|
26 |
/**
|
27 |
* @deprecated 2.2.0
|
28 |
*/
|
readme.txt
CHANGED
@@ -6,7 +6,7 @@ Tags: embed, embed youtube, gutenberg embed, pdf, doc, docs, ppt, elementor embe
|
|
6 |
Requires at least: 4.6
|
7 |
Tested up to: 5.7
|
8 |
Requires PHP: 5.6
|
9 |
-
Stable tag: 2.7.
|
10 |
License: GPLv3 or later
|
11 |
License URI: https://opensource.org/licenses/GPL-3.0
|
12 |
|
@@ -301,6 +301,9 @@ Not at all. You can set up everything your team needs without any coding knowled
|
|
301 |
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
302 |
and this project adheres to [Semantic Versioning](http://semver.org/).
|
303 |
|
|
|
|
|
|
|
304 |
= [2.7.6] - 2021-04-06 =
|
305 |
* Hotfix
|
306 |
|
@@ -698,4 +701,4 @@ Added Wistia and Twitch blocks for Gutenberg
|
|
698 |
|
699 |
== Upgrade Notice ==
|
700 |
|
701 |
-
* [
|
6 |
Requires at least: 4.6
|
7 |
Tested up to: 5.7
|
8 |
Requires PHP: 5.6
|
9 |
+
Stable tag: 2.7.7
|
10 |
License: GPLv3 or later
|
11 |
License URI: https://opensource.org/licenses/GPL-3.0
|
12 |
|
301 |
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
302 |
and this project adheres to [Semantic Versioning](http://semver.org/).
|
303 |
|
304 |
+
= [2.7.7] - 2021-04-23 =
|
305 |
+
* Hotfix - notice correction.
|
306 |
+
|
307 |
= [2.7.6] - 2021-04-06 =
|
308 |
* Hotfix
|
309 |
|
701 |
|
702 |
== Upgrade Notice ==
|
703 |
|
704 |
+
* [Minor Update] Hotfix
|