PluginProbe
Media Cloud Sync / 1.4.1
Media Cloud Sync v1.4.1
1.4.1 1.4.0 1.3.12 1.3.11 1.3.10 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.2.0 1.2.10 1.2.11 1.2.12 1.2.13 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 All 35 releases
← All changes | includes/admin.php +178 -29 1.0.01.4.1 View file →
@@ -2,8 +2,9 @@
2 2 namespace Dudlewebs\WPMCS;
3 3
4 4 defined('ABSPATH') || exit;
5 5
6 +use WP_Site;
6 7 class Admin {
7 8 private static $instance = null;
8 9 private $assets_url;
9 10 private $version;
@@ -34,13 +35,23 @@
34 35 // Admin Init
35 36 add_action('admin_init', [$this, 'adminInit']);
36 37
37 38 add_action('admin_menu', [$this, 'add_menu'], 10);
39 + add_action('admin_notices', [$this, 'storage_credentials_admin_notice']);
38 40
39 41 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts'], 10, 1);
40 42 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_styles'], 10, 1);
41 43 // Load media scripts
42 44 add_action( 'load-upload.php', [ $this, 'load_media_assets' ], 11 );
45 +
46 + // Plugin Deactivation Survey
47 + add_action('admin_footer', array($this, 'wpmcs_deactivation_form'));
48 +
49 + if (is_multisite()) {
50 + // Register multisite site creation hooks
51 + add_action('wp_initialize_site', [$this, 'create_multisite_table'], 10, 1);
52 + add_action('wpmu_new_blog', [$this, 'create_multisite_table'], 10, 1);
53 + }
43 54 }
44 55
45 56 /**
46 57 * Method that is used on plugin initialization time
@@ -46,18 +57,35 @@
46 57 * Method that is used on plugin initialization time
47 58 * @since 1.0.0
48 59 */
49 60 public function adminInit() {
50 - if(get_option( $this->token.'_db_version' ) !== WPMCS_DB_VERSION) {
51 - $database = Db::instance();
52 - $database->do_database_upgrade();
61 + $current_db_version = get_option( $this->token . '_db_version', false );
62 + /**
63 + * Run DB upgrades only if:
64 + * - DB version exists
65 + * - DB version is lower than plugin DB version
66 + */
67 + if (
68 + $current_db_version === false ||
69 + version_compare( $current_db_version, WPMCS_DB_VERSION, '<' )
70 + ) {
71 + Db::instance()->do_database_upgrade();
53 72 }
54 73
55 - if (get_option($this->token.'_do_activation_redirect', false) && !Utils::get_service()) {
56 - delete_option($this->token.'_do_activation_redirect');
57 - wp_redirect(admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure'));
58 - } else {
59 - delete_option($this->token.'_do_activation_redirect');
74 + /**
75 + * One-time activation redirect
76 + */
77 + $do_redirect = get_option( $this->token . '_do_activation_redirect', false );
78 +
79 + if ( $do_redirect ) {
80 + delete_option( $this->token . '_do_activation_redirect' );
81 +
82 + if ( ! Utils::get_service() ) {
83 + wp_redirect(
84 + admin_url( 'admin.php?page=' . $this->token . '-admin-ui#/configure' )
85 + );
86 + exit;
87 + }
60 88 }
61 89 }
62 90
63 91 /**
@@ -66,18 +94,16 @@
66 94 * @access public
67 95 * @return void
68 96 * @since 1.0.0
69 97 */
70 - public function install(){
71 - $database = Db::instance();
98 + public static function install($network_wide = false) {
99 + Db::handle_tables($network_wide);
72 100
73 - $database->create_table();
74 -
75 101 // Redirection on activation
76 - add_option($this->token.'_do_activation_redirect', true);
102 + add_option(WPMCS_TOKEN . '_do_activation_redirect', true);
77 103
78 104 //Protect directories
79 - $this->_protect_upload_dir();
105 + self::_protect_upload_dir();
80 106 }
81 107
82 108 /**
83 109 * Create plugin specific upload directory
@@ -84,9 +110,9 @@
84 110 * @since 1.0.0
85 111 */
86 112 public function create_plugin_dir() {
87 113 //Protect directories
88 - $this->_protect_upload_dir();
114 + self::_protect_upload_dir();
89 115 }
90 116
91 117 /**
92 118 * Protect Directory from external access.
@@ -92,27 +118,26 @@
92 118 * Protect Directory from external access.
93 119 *
94 120 * @access private
95 121 * @return void
96 - * @since 1.0.0
122 + * @since 1.3.0
123 + * @see \Dudlewebs\WPMCS\Admin::_protect_upload_dir
97 124 */
98 - private function _protect_upload_dir(){
125 + private static function _protect_upload_dir(){
99 126 $upload_dir = wp_upload_dir();
100 127
128 + $upload_base = $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS');
129 +
101 130 $files = array(
102 131 array(
103 - 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'),
132 + 'base' => $upload_base,
104 133 'file' => '.htaccess',
105 - 'content' => 'Options -Indexes' . "\n"
106 - . '<Files *.php>' . "\n"
107 - . 'deny from all' . "\n"
108 - . '</Files>'
134 + 'content' => "Options -Indexes\nDeny from all"
109 135 ),
110 136 array(
111 - 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'),
137 + 'base' => $upload_base,
112 138 'file' => 'index.php',
113 - 'content' => '<?php ' . "\n"
114 - . '// Silence is golden.'
139 + 'content' => "<?php\n// Silence is golden."
115 140 )
116 141 );
117 142
118 143 foreach ($files as $file) {
@@ -128,12 +153,30 @@
128 153
129 154 /**
130 155 * Deactivation hook
131 156 */
132 - public function deactivation(){
157 + public static function deactivation(){
133 158 }
134 159
160 +
135 161 /**
162 + * Handle multisite site creation.
163 + */
164 + public function create_multisite_table($site) {
165 + if (is_numeric($site)) {
166 + $site_id = (int) $site;
167 + } elseif ($site instanceof \WP_Site) {
168 + $site_id = $site->blog_id;
169 + } else {
170 + return; // Invalid input
171 + }
172 +
173 + switch_to_blog($site_id);
174 + Db::instance()->create_table();
175 + restore_current_blog();
176 + }
177 +
178 + /**
136 179 * Load admin Javascript.
137 180 * @access public
138 181 * @return void
139 182 * @since 1.0.0
@@ -144,8 +187,14 @@
144 187 }
145 188
146 189 $screen = get_current_screen();
147 190
191 + // deactivate form js
192 + if ($screen->id == 'plugins') {
193 + wp_enqueue_script($this->token . '-deactivate-form', esc_url($this->assets_url) . 'js/deactivate.js', array('jquery'), $this->version, true);
194 + }
195 +
196 +
148 197 if (in_array($screen->id, $this->hook_suffix, true)) {
149 198 // Enqueue WordPress media scripts.
150 199 if (!did_action('wp_enqueue_media')) {
151 200 wp_enqueue_media();
@@ -160,9 +209,15 @@
160 209 $this->token . '_object',
161 210 array(
162 211 'api_nonce' => wp_create_nonce('wp_rest'),
163 212 'root' => rest_url($this->token . '/v1/'),
213 + 'pro_root' => rest_url($this->token . '/pro/v1/'),
164 214 'assets_url' => $this->assets_url,
215 + 'admin_url' => admin_url(),
216 + 'is_db_upgrade_required' => Upgrade::instance()->is_upgrade_needed(),
217 + 'is_cron_disabled' => defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON,
218 + 'is_pro_active' => defined('WPMCS_PRO_VERSION'),
219 + 'license_status' => defined('WPMCS_PRO_VERSION') ? Utils::get_safe_license_data() : [],
165 220 )
166 221 );
167 222 }
168 223 }
@@ -184,8 +239,12 @@
184 239 wp_register_style($this->token.'-backend',
185 240 esc_url($this->assets_url).'css/backend.css?nocache='.rand(0, 10000), array(), $this->version);
186 241 wp_enqueue_style($this->token.'-backend');
187 242 }
243 +
244 + if ($screen->id == 'plugins') {
245 + wp_enqueue_style($this->token . '-deactivate-form', esc_url($this->assets_url) . 'css/deactivate.css', array(), $this->version);
246 + }
188 247 }
189 248
190 249 /**
191 250 * Show action links on the plugin screen.
@@ -199,8 +258,12 @@
199 258 'getstarted' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure') . '">' . esc_html__('Get Started', 'media-cloud-sync') . '</a>',
200 259 'settings' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui/') . '">' . esc_html__('Settings', 'media-cloud-sync') . '</a>',
201 260 );
202 261
262 + if (!Utils::is_pro_licensed()) {
263 + $action_links['upgrade'] = '<a href="https://dudlewebs.com/product/media-cloud-sync/" target="_blank" style="color:#d54e21;font-weight:600;">' . esc_html__('Upgrade', 'media-cloud-sync') . '</a>';
264 + }
265 +
203 266 return array_merge($action_links, $links);
204 267 }
205 268
206 269
@@ -215,10 +278,10 @@
215 278 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
216 279 'manage_options',
217 280 $this->token.'-admin-ui',
218 281 array($this, 'adminUi'),
219 - 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA5MCA2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcwLjMwODYgMjMuMDM1N0w3MC42MDQxIDI0LjUzOUw3Mi4xMzI0IDI0LjY0NTJDODAuODA4NiAyNS4yNDgzIDg3LjYzODYgMzIuNDE0MyA4Ny42Mzg2IDQxLjI1Qzg3LjYzODYgNTAuNTAzIDgwLjE2MDEgNTggNzAuOTYzOSA1OEgyMi40MDk2QzExLjE1OTEgNTggMiA0OC44MTU1IDIgMzcuNVYzNy40OTk4QzEuOTk5NDIgMzIuNDQ3IDMuODU4NjYgMjcuNTczNSA3LjIxODQ4IDIzLjgxNTVDMTAuNTc4MSAyMC4wNTc3IDE1LjIwMDggMTcuNjgwNSAyMC4xOTc3IDE3LjEzODNMMjEuMjYzNiAxNy4wMjI3TDIxLjc1NzMgMTYuMDcwOUMyNi4wOTc2IDcuNzAzOTEgMzQuODA1MyAyIDQ0LjgxOTMgMkg0NC44MTk3QzUwLjgzNDggMS45OTg2MyA1Ni42NjQ3IDQuMDk0MDEgNjEuMzEzOCA3LjkyOTg2QzY1Ljk2MyAxMS43NjU4IDY5LjE0MyAxNy4xMDQ4IDcwLjMwODYgMjMuMDM1N1oiIHN0cm9rZT0iIzAyMDQ0QSIgc3Ryb2tlLXdpZHRoPSI0Ii8+CjxjaXJjbGUgY3g9IjQ1IiBjeT0iMzMiIHI9IjEyIiBzdHJva2U9IiMwMjA0NEEiIHN0cm9rZS13aWR0aD0iNCIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzE4MV80OTgpIj4KPHBhdGggZD0iTTQ4LjA4NyAzMC41VjQwLjYyNzFMNDYuMTk1NyA0MlYyNEw1Mi41IDMwLjVINDguMDg3WiIgZmlsbD0iIzAyMDQ0QSIvPgo8cGF0aCBkPSJNNDIuNDEzIDM1LjVWMjUuMzcyOUw0NC4zMDQ0IDI0VjQyTDM4IDM1LjVINDIuNDEzWiIgZmlsbD0iIzAyMDQ0QSIvPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfMTgxXzQ5OCIgeD0iMzAiIHk9IjE2IiB3aWR0aD0iMzAuNSIgaGVpZ2h0PSIzNCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIgcmVzdWx0PSJoYXJkQWxwaGEiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMC4wMDc4NDMxNCAwIDAgMCAwIDAuMDE1Njg2MyAwIDAgMCAwIDAuMjkwMTk2IDAgMCAwIDAuMTYgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd18xODFfNDk4Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93XzE4MV80OTgiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg==',
220 - 25
282 + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTczIiBoZWlnaHQ9IjEyMiIgdmlld0JveD0iMCAwIDE3MyAxMjIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xMzkuNTggNzYuMDA4MkMxNDYuNDQxIDc1LjgyMyAxNTEuOTAyIDc4LjgxNTggMTU2LjE3OSA4My44NzkzQzE2MS42OTUgOTAuNDA5OCAxNjEuMzQ5IDk4LjY5MjEgMTU1LjkyMyAxMDUuMzI0QzE1Mi40ODUgMTA5LjUyNiAxNDYuOTI5IDExMC42OTMgMTQyLjIwNyAxMDguMTZDMTM5LjU4OSAxMDYuNzU1IDEzNy45NDIgMTA0LjUxIDEzNy4wMzEgMTAxLjcwMUMxMzYuNzc0IDEwMC45MDYgMTM3LjA3MiAxMDAuNjE1IDEzNy44NSAxMDAuNjMxQzEzOC41OTggMTAwLjY0NyAxMzkuMzQ3IDEwMC42MzUgMTQwLjQ0NCAxMDAuNjM1QzE0MS43MDkgMTAwLjUyMSAxNDMuMTc4IDEwMC44MTggMTQ0LjY3MiAxMDEuNThDMTQ3Ljc2NyAxMDMuMTU5IDE1Mi4xNTcgMTAxLjY1OCAxNTMuOTY1IDk4LjYwNTlDMTU2LjA3OSA5NS4wMzcgMTU1LjQxMSA5MS4wMDY3IDE1Mi4zMjkgODguNzM2N0MxNDguNTkgODUuOTgyOSAxNDQuNDg0IDg2LjQzNzggMTQxLjM0NyA4OS44OTg4QzEzOS41NzUgOTEuODUzNyAxMzcuMzYzIDkzLjAwNDMgMTM0LjcwMiA5My4yMDk0QzEzMC4zNjUgOTMuNTQzNiAxMjcuMzE1IDg5Ljk3OTIgMTI4LjEzMyA4NS41Mzg1QzEyOS4xMjUgODAuMTU4NSAxMzMuOTE2IDc2LjE2MTEgMTM5LjU4IDc2LjAwODJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQyLjIxNyA5NC4xMzMyQzE0Mi42MjQgOTQuMTMzMiAxNDIuOTU1IDk0LjQ2MzMgMTQyLjk1NSA5NC44NzA1Vjk5LjY3OTFDMTQyLjk1NSAxMDAuMDg2IDE0Mi42MjQgMTAwLjQxNSAxNDIuMjE3IDEwMC40MTVIMTM3LjU1OEMxMzcuMTUxIDEwMC40MTUgMTM2LjgyMSAxMDAuMDg2IDEzNi44MiA5OS42NzkxVjk0Ljg3MDVDMTM2LjgyIDk0LjQ2MzMgMTM3LjE1IDk0LjEzMzIgMTM3LjU1OCA5NC4xMzMySDE0Mi4yMTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ5LjE5NyA5NC4xMzQyQzE0OS42MDUgOTQuMTM0MiAxNDkuOTM2IDk0LjQ2NDMgMTQ5LjkzNiA5NC44NzE1Vjk2LjU3NTZDMTQ5LjkzNiA5Ni45ODI4IDE0OS42MDUgOTcuMzEyOSAxNDkuMTk3IDk3LjMxMjlIMTQ3LjU2OUMxNDcuMTYxIDk3LjMxMjkgMTQ2LjgzMSA5Ni45ODI4IDE0Ni44MzEgOTYuNTc1NlY5NC44NzE1QzE0Ni44MzEgOTQuNDY0MyAxNDcuMTYxIDk0LjEzNDIgMTQ3LjU2OSA5NC4xMzQySDE0OS4xOTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ1LjMzMiA5NC4xMzMyQzE0NS43MzkgOTQuMTMzNSAxNDYuMDcgOTQuNDYzNSAxNDYuMDcgOTQuODcwNVY5NS44MDUxQzE0Ni4wNyA5Ni4yMTIxIDE0NS43MzkgOTYuNTQyMSAxNDUuMzMyIDk2LjU0MjRIMTQ0LjQ1NEMxNDQuMDQ3IDk2LjU0MjQgMTQzLjcxNyA5Ni4yMTIzIDE0My43MTcgOTUuODA1MVY5NC44NzA1QzE0My43MTcgOTQuNDYzMyAxNDQuMDQ3IDk0LjEzMzIgMTQ0LjQ1NCA5NC4xMzMySDE0NS4zMzJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3MyA5Mi41MDAxQzE3MyAxMDguMjQgMTYwLjI0IDEyMSAxNDQuNSAxMjFDMTI4Ljc2IDEyMSAxMTYgMTA4LjI0IDExNiA5Mi41MDAxQzExNiA3Ni43NiAxMjguNzYgNjQuMDAwMSAxNDQuNSA2NC4wMDAxQzE2MC4yNCA2NC4wMDAxIDE3MyA3Ni43NiAxNzMgOTIuNTAwMVpNMTQ0LjUgMTE0QzE1Ni4zNzQgMTE0IDE2NiAxMDQuMzc0IDE2NiA5Mi41MDAxQzE2NiA4Ni43MDIyIDE2My43MDUgODEuNDQwMyAxNTkuOTc0IDc3LjU3MzNDMTU2LjA2NCA3My41MjA3IDE1MC41NzYgNzEuMDAwMSAxNDQuNSA3MS4wMDAxQzEzMi42MjYgNzEuMDAwMSAxMjMgODAuNjI2IDEyMyA5Mi41MDAxQzEyMyAxMDAuNTQzIDEyNy40MTYgMTA3LjU1NCAxMzMuOTU2IDExMS4yNDFDMTM3LjA3MSAxMTIuOTk4IDE0MC42NjkgMTE0IDE0NC41IDExNFoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzUuMjY1OSA0My40MTY4QzM3LjI3OTMgMzEuMjg3IDQzLjUzMjQgMjAuMjY1NSA1Mi45MTE3IDEyLjMxNDdDNjIuMjkxIDQuMzYzOTEgNzQuMTg3NyAwIDg2LjQ4MzUgMEM5OC43NzkzIDAgMTEwLjY3NiA0LjM2MzkxIDEyMC4wNTUgMTIuMzE0N0MxMjkuNDM1IDIwLjI2NTUgMTM1LjY4OCAzMS4yODcgMTM3LjcwMSA0My40MTY4QzE0Ny42NjIgNDQuMzU5IDE1Ni44NzcgNDkuMDk5NiAxNjMuNDM1IDU2LjY1NTFDMTY5Ljk5NCA2NC4yMTA2IDE3My4zOTIgNzQuMDAwOSAxNzIuOTI0IDgzLjk5NDlDMTcyLjQ1NyA5My45ODg5IDE2OC4xNiAxMDMuNDE5IDE2MC45MjUgMTEwLjMzQzE1My42OSAxMTcuMjQgMTQ0LjA3MiAxMjEuMSAxMzQuMDY3IDEyMS4xMDhIMzguODk5NkMyOC44OTQ3IDEyMS4xIDE5LjI3NyAxMTcuMjQgMTIuMDQyIDExMC4zM0M0LjgwNjk1IDEwMy40MTkgMC41MDk5NzUgOTMuOTg4OSAwLjA0MjU0OTUgODMuOTk0OUMtMC40MjQ4NzYgNzQuMDAwOSAyLjk3MzEzIDY0LjIxMDYgOS41MzE1OSA1Ni42NTUxQzE2LjA5IDQ5LjA5OTYgMjUuMzA1NSA0NC4zNTkgMzUuMjY1OSA0My40MTY4Wk00Mi45NzE1IDQ1LjkyNTJDNDQuNjgyNyAzNS42MDkgNDkuOTk3IDI2LjIzNTQgNTcuOTY4MiAxOS40NzM1QzY1LjkzOTQgMTIuNzExNSA3Ni4wNTAxIDkuMDAwMSA4Ni40OTk5IDkuMDAwMUM5Ni45NDk4IDkuMDAwMSAxMDcuMDYgMTIuNzExNSAxMTUuMDMyIDE5LjQ3MzVDMTIzLjAwMyAyNi4yMzU0IDEyOC4zMTcgMzUuNjA5IDEzMC4wMjggNDUuOTI1MkMxMzguNDkzIDQ2LjcyNjUgMTQ2LjMyNSA1MC43NTgzIDE1MS44OTkgNTcuMTg0QzE1Ni44NDUgNjIuODg2MSAxNTkuNjc2IDcwLjA4NDkgMTU5Ljk3NCA3Ny41NzMzQzE2My43MDUgODEuNDQwMyAxNjYgODYuNzAyMiAxNjYgOTIuNTAwMUMxNjYgMTA0LjM3NCAxNTYuMzc0IDExNCAxNDQuNSAxMTRDMTQwLjY2OSAxMTQgMTM3LjA3MSAxMTIuOTk4IDEzMy45NTYgMTExLjI0MUMxMzEuNjY4IDExMS43NCAxMjkuMzE3IDExMS45OTggMTI2Ljk0IDExMkg0Ni4wNTk3QzM3LjU1NjggMTExLjk5MyAyOS4zODI5IDEwOC43MSAyMy4yMzQxIDEwMi44MzNDMTcuMDg1MiA5Ni45NTYxIDEzLjQzMzMgODguOTM1NyAxMy4wMzYxIDgwLjQzNkMxMi42Mzg4IDcxLjkzNjMgMTUuNTI2NyA2My42MDk4IDIxLjEwMDYgNTcuMTg0QzI2LjY3NDQgNTAuNzU4MyAzNC41MDY0IDQ2LjcyNjUgNDIuOTcxNSA0NS45MjUyWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTkzLjUyMTEgNDEuMTc0OEw3Ny4xNDE3IDE4LjY1MDJDNzYuOTk1MyAxOC40NDk1IDc2LjgwMjUgMTguMjg1OCA3Ni41NzkyIDE4LjE3MjhDNzYuMzU1OSAxOC4wNTk4IDc2LjEwODUgMTguMDAwNiA3NS44NTc0IDE4LjAwMDJINzUuODUzNkM3NS42MDE1IDE4LjAwMDcgNzUuMzUzMiAxOC4wNjA0IDc1LjEyOTMgMTguMTc0M0M3NC45MDU0IDE4LjI4ODIgNzQuNzEyMyAxOC40NTMxIDc0LjU2NjEgMTguNjU1Mkw1OC4yOTI0IDQxLjE3OTdDNTguMTI0IDQxLjQxMjUgNTguMDI0MSA0MS42ODY1IDU4LjAwMzggNDEuOTcxNUM1Ny45ODM1IDQyLjI1NjYgNTguMDQzNSA0Mi41NDE2IDU4LjE3NzMgNDIuNzk1MkM1OC4zMTAzIDQzLjA0OTIgNTguNTExOCA0My4yNjIxIDU4Ljc1OTggNDMuNDEwN0M1OS4wMDc4IDQzLjU1OTIgNTkuMjkyNyA0My42Mzc1IDU5LjU4MyA0My42MzdINjcuMjQxOEw2Ny4yNDEyIDc2LjE0MUM2Ny4yNDExIDc2LjM0NTQgNjcuMjgxOSA3Ni41NDc3IDY3LjM2MTQgNzYuNzM2NUM2Ny40NDA5IDc2LjkyNTMgNjcuNTU3NCA3Ny4wOTY5IDY3LjcwNDMgNzcuMjQxM0M2Ny44NTEyIDc3LjM4NTggNjguMDI1NiA3Ny41MDA0IDY4LjIxNzUgNzcuNTc4NUM2OC40MDk0IDc3LjY1NjYgNjguNjE1MSA3Ny42OTY3IDY4LjgyMjggNzcuNjk2Nkw4Mi45OTMxIDc3LjY5NTlDODMuMjAwOSA3Ny42OTYgODMuNDA2NyA3Ny42NTU4IDgzLjU5ODcgNzcuNTc3NkM4My43OTA2IDc3LjQ5OTQgODMuOTY1MSA3Ny4zODQ3IDg0LjExMiA3Ny4yNDAxQzg0LjI1ODkgNzcuMDk1NSA4NC4zNzUzIDc2LjkyMzkgODQuNDU0OCA3Ni43MzVDODQuNTM0MiA3Ni41NDYxIDg0LjU3NSA3Ni4zNDM2IDg0LjU3NDggNzYuMTM5MlY0My42Mzc2SDkyLjIzNjFDOTIuODI3IDQzLjYzNzYgOTMuMzY5NiA0My4zMDk4IDkzLjY0MjQgNDIuNzkyMUM5My43NzU3IDQyLjUzNzcgOTMuODM0OSA0Mi4yNTIgOTMuODEzNSA0MS45NjY2QzkzLjc5MjEgNDEuNjgxMiA5My42OTA5IDQxLjQwNzEgOTMuNTIxMSA0MS4xNzQ4WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTgyLjE0NDkgODUuNDcxNUw5Ni44MzM4IDEwMi4xMzZDOTYuOTY1IDEwMi4yODUgOTcuMTM3OSAxMDIuNDA2IDk3LjMzODIgMTAyLjQ5Qzk3LjUzODQgMTAyLjU3MyA5Ny43NjAzIDEwMi42MTcgOTcuOTg1NSAxMDIuNjE3Qzk4LjIxMTYgMTAyLjYxNyA5OC40Mzc3IDEwMi41NzMgOTguNjM4NSAxMDIuNDg4Qzk4LjgzOTMgMTAyLjQwNCA5OS4wMTI0IDEwMi4yODIgOTkuMTQzNSAxMDIuMTMzTDExMy43MzggODUuNDY3OUMxMTMuODg5IDg1LjI5NTYgMTEzLjk3OCA4NS4wOTI5IDExMy45OTYgODQuODgyQzExNC4wMTUgODQuNjcxMSAxMTMuOTYxIDg0LjQ2MDMgMTEzLjg0MSA4NC4yNzI2QzExMy43MjIgODQuMDg0NyAxMTMuNTQxIDgzLjkyNzIgMTEzLjMxOCA4My44MTczQzExMy4wOTYgODMuNzA3NCAxMTIuODQxIDgzLjY0OTUgMTEyLjU4IDgzLjY0OThIMTA1LjcxMkwxMDUuNzEyIDU5LjYwMTZDMTA1LjcxMyA1OS40NTA1IDEwNS42NzYgNTkuMzAwNyAxMDUuNjA1IDU5LjE2MTFDMTA1LjUzMyA1OS4wMjE0IDEwNS40MjkgNTguODk0NSAxMDUuMjk3IDU4Ljc4NzZDMTA1LjE2NSA1OC42ODA3IDEwNS4wMDkgNTguNTk1OSAxMDQuODM3IDU4LjUzODFDMTA0LjY2NSA1OC40ODAzIDEwNC40OCA1OC40NTA3IDEwNC4yOTQgNTguNDUwOEw5MS41ODYyIDU4LjQ1MTJDOTEuMzk5OSA1OC40NTEyIDkxLjIxNTQgNTguNDgwOSA5MS4wNDMyIDU4LjUzODhDOTAuODcxMSA1OC41OTY3IDkwLjcxNDYgNTguNjgxNSA5MC41ODI5IDU4Ljc4ODVDOTAuNDUxMiA1OC44OTU1IDkwLjM0NjcgNTkuMDIyNCA5MC4yNzU1IDU5LjE2MjJDOTAuMjA0MiA1OS4zMDIgOTAuMTY3NyA1OS40NTE4IDkwLjE2NzggNTkuNjAzVjgzLjY0OTRIODMuMjk3MkM4Mi43NjczIDgzLjY0OTQgODIuMjgwOCA4My44OTE5IDgyLjAzNjEgODQuMjc0OUM4MS45MTY2IDg0LjQ2MzEgODEuODYzNSA4NC42NzQ1IDgxLjg4MjcgODQuODg1N0M4MS45MDE5IDg1LjA5NjggODEuOTkyNiA4NS4yOTk2IDgyLjE0NDkgODUuNDcxNVoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=',
283 + 999
221 284 );
222 285
223 286 $this->hook_suffix[] = add_submenu_page(
224 287 $this->token . '-admin-ui',
@@ -228,9 +291,9 @@
228 291 $this->token . '-admin-ui' ,
229 292 array($this, 'adminUi')
230 293 );
231 294
232 - if(Utils::is_service_enabled()) {
295 + if(Utils::get_service()) {
233 296 $this->hook_suffix[] = add_submenu_page(
234 297 $this->token . '-admin-ui',
235 298 esc_html__('Settings', 'media-cloud-sync'),
236 299 esc_html__('Settings', 'media-cloud-sync'),
@@ -250,8 +313,32 @@
250 313 }
251 314 }
252 315
253 316 /**
317 + * Admin notice when storage credentials are incomplete.
318 + * @since 1.3.11
319 + */
320 + public function storage_credentials_admin_notice() {
321 + if(!current_user_can('manage_options') || !Utils::get_service() || Utils::is_service_enabled()) {
322 + return;
323 + }
324 +
325 + $error = Utils::get_service_configuration_error();
326 + if(empty($error)) {
327 + return;
328 + }
329 +
330 + $settings_url = admin_url('admin.php?page=' . $this->token . '-admin-ui#/settings');
331 + $message = esc_html($error) . ' ' . sprintf(
332 + '<a href="%1$s">%2$s</a>',
333 + esc_url($settings_url),
334 + esc_html__('Open Media Cloud Sync settings', 'media-cloud-sync')
335 + );
336 +
337 + echo wp_kses_post(sprintf('<div class="notice notice-error is-dismissible"><p>%s</p></div>', $message));
338 + }
339 +
340 + /**
254 341 * Calling view function for admin page components
255 342 */
256 343 public function adminUi() {
257 344 echo wp_kses_post(sprintf(
@@ -273,8 +360,12 @@
273 360 /**
274 361 * Load the media assets
275 362 */
276 363 public function load_media_assets() {
364 + if(!Utils::is_service_enabled()) {
365 + return;
366 + }
367 +
277 368 /** CSS */
278 369 wp_enqueue_style($this->token . '-media', esc_url($this->assets_url) . 'css/media.css', array(), $this->version);
279 370
280 371 /** JS */
@@ -307,8 +398,66 @@
307 398 )
308 399 )
309 400 );
310 401 }
402 +
403 +
404 + /**
405 + * Deactivation form
406 + * @since 1.0.2
407 + */
408 + public function wpmcs_deactivation_form() {
409 + $currentScreen = get_current_screen();
410 + $screenID = $currentScreen->id;
411 + if ($screenID == 'plugins') {
412 + ?>
413 + <div id="dw-wpmcs-survey-form-wrap">
414 + <div id="dw-wpmcs-survey-form">
415 + <h2>We Value Your Feedback</h2>
416 + <p>We're sorry to see you go! Please let us know why you are deactivating this plugin. Your feedback is anonymous and will help us improve.</p>
417 + <form method="POST">
418 + <input name="plugin_name" type="hidden" value="<?= esc_attr($this->token); ?>" required>
419 + <input name="website" type="hidden" value="<?= esc_url(get_site_url()); ?>" required>
420 + <input name="title" type="hidden" value="<?= esc_attr(get_bloginfo('name')); ?>" required>
421 + <input name="version" type="hidden" value="<?= esc_attr($this->version); ?>" required>
422 +
423 + <div class="dw-wpmcs-reason">
424 + <label><input type="radio" name="reason" value="I\'m only deactivating temporarily"> I'm only deactivating temporarily</label>
425 + <label><input type="radio" name="reason" value="I no longer need the plugin"> I no longer need the plugin</label>
426 + <label><input type="radio" name="reason" value="I only needed the plugin for a short period"> I only needed the plugin for a short period</label>
427 + <label><input type="radio" name="reason" value="I found a better plugin"> I found a better plugin</label>
428 + <label><input type="radio" name="reason" value="Upgrading to PRO version"> Upgrading to PRO version</label>
429 + <label><input type="radio" name="reason" value="Plugin doesn\'t meet my requirements"> Plugin doesn't meet my requirements</label>
430 + <label><input type="radio" name="reason" value="Plugin broke my site"> Plugin broke my site</label>
431 + <label><input type="radio" name="reason" value="Plugin suddenly stopped working"> Plugin suddenly stopped working</label>
432 + <label><input type="radio" name="reason" value="I found a bug"> I found a bug</label>
433 + <label><input type="radio" name="reason" value="Other"> Other</label>
434 + </div>
435 +
436 + <div class="dw-wpmcs-comments" style="display:none;">
437 + <textarea name="comments" placeholder="Please specify" rows="3"></textarea>
438 + <p>Need help? <a href="https://dudlewebs.com/" target="_blank">Use live chat support</a></p>
439 + </div>
440 +
441 + <p id="dw-wpmcs-error" class="dw-wpmcs-error">
442 + <svg viewBox="0 0 16 16" fill="none" aria-hidden="true">
443 + <path d="M8 2.2L14.6 13.3H1.4L8 2.2Z" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/>
444 + <path d="M8 6.7V9.7" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
445 + <circle cx="8" cy="11.4" r="0.85" fill="currentColor"/>
446 + </svg>
447 + <span id="dw-wpmcs-error-text"></span>
448 + </p>
449 + <div class="dw-wpmcs-actions">
450 + <button type="button" class="dw-button dw-skip" id="dw-wpmcs-skip">Skip & Deactivate</button>
451 + <button type="button" class="dw-button dw-secondary" id="dw-wpmcs-cancel">Cancel</button>
452 + <button type="submit" class="dw-button dw-primary" id="dw-wpmcs-deactivate">Submit & Deactivate</button>
453 + </div>
454 + </form>
455 + </div>
456 + </div>
457 + <?php }
458 + }
459 +
311 460
312 461
313 462 /**
314 463 * Add custom classes to the HTML body tag