PluginProbe
Media Cloud Sync / 1.3.10
Media Cloud Sync v1.3.10
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 1.3.0 All 34 releases
media-cloud-sync / includes / admin.php

admin.php in Media Cloud Sync 1.3.10, at includes/admin.php

464 lines 23.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Dudlewebs\WPMCS;
3
4 defined('ABSPATH') || exit;
5
6 use WP_Site;
7 class Admin {
8 private static $instance = null;
9 private $assets_url;
10 private $version;
11 private $token;
12 private $script_suffix;
13
14 protected $hook_suffix = [];
15 /**
16 * Admin constructor.
17 * @since 1.0.0
18 */
19 public function __construct() {
20 $this->assets_url = WPMCS_ASSETS_URL;
21 $this->version = WPMCS_VERSION;
22 $this->token = WPMCS_TOKEN;
23 $this->script_suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
24
25 $plugin = plugin_basename(WPMCS_FILE);
26
27 // Create file directory on action do
28 add_action( $this->token.'_create_plugin_dir', [ $this, 'create_plugin_dir' ] );
29
30 // add action links to link to link list display on the plugins page.
31 add_filter("plugin_action_links_$plugin", [$this, 'plugin_action_links']);
32
33 // add our custom CSS classes to <body>
34 add_filter( 'admin_body_class', [ $this, 'admin_body_class' ] );
35 // Admin Init
36 add_action('admin_init', [$this, 'adminInit']);
37
38 add_action('admin_menu', [$this, 'add_menu'], 10);
39
40 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts'], 10, 1);
41 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_styles'], 10, 1);
42 // Load media scripts
43 add_action( 'load-upload.php', [ $this, 'load_media_assets' ], 11 );
44
45 // Plugin Deactivation Survey
46 add_action('admin_footer', array($this, 'wpmcs_deactivation_form'));
47
48 if (is_multisite()) {
49 // Register multisite site creation hooks
50 add_action('wp_initialize_site', [$this, 'create_multisite_table'], 10, 1);
51 add_action('wpmu_new_blog', [$this, 'create_multisite_table'], 10, 1);
52 }
53 }
54
55 /**
56 * Method that is used on plugin initialization time
57 * @since 1.0.0
58 */
59 public function adminInit() {
60 $current_db_version = get_option( $this->token . '_db_version', false );
61 /**
62 * Run DB upgrades only if:
63 * - DB version exists
64 * - DB version is lower than plugin DB version
65 */
66 if (
67 $current_db_version === false ||
68 version_compare( $current_db_version, WPMCS_DB_VERSION, '<' )
69 ) {
70 Db::instance()->do_database_upgrade();
71 }
72
73 /**
74 * One-time activation redirect
75 */
76 $do_redirect = get_option( $this->token . '_do_activation_redirect', false );
77
78 if ( $do_redirect ) {
79 delete_option( $this->token . '_do_activation_redirect' );
80
81 if ( ! Utils::get_service() ) {
82 wp_redirect(
83 admin_url( 'admin.php?page=' . $this->token . '-admin-ui#/configure' )
84 );
85 exit;
86 }
87 }
88 }
89
90 /**
91 * Installation. Runs on activation.
92 *
93 * @access public
94 * @return void
95 * @since 1.0.0
96 */
97 public static function install($network_wide = false) {
98 Db::handle_tables($network_wide);
99
100 // Redirection on activation
101 add_option(WPMCS_TOKEN . '_do_activation_redirect', true);
102
103 //Protect directories
104 self::_protect_upload_dir();
105 }
106
107 /**
108 * Create plugin specific upload directory
109 * @since 1.0.0
110 */
111 public function create_plugin_dir() {
112 //Protect directories
113 self::_protect_upload_dir();
114 }
115
116 /**
117 * Protect Directory from external access.
118 *
119 * @access private
120 * @return void
121 * @since 1.3.0
122 * @see \Dudlewebs\WPMCS\Admin::_protect_upload_dir
123 */
124 private static function _protect_upload_dir(){
125 $upload_dir = wp_upload_dir();
126
127 $upload_base = $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS');
128
129 $files = array(
130 array(
131 'base' => $upload_base,
132 'file' => '.htaccess',
133 'content' => "Options -Indexes\nDeny from all"
134 ),
135 array(
136 'base' => $upload_base,
137 'file' => 'index.php',
138 'content' => "<?php\n// Silence is golden."
139 )
140 );
141
142 foreach ($files as $file) {
143 if ((wp_mkdir_p($file['base'])) && (!file_exists(trailingslashit($file['base']) . $file['file'])) // If file not exist
144 ) {
145 if ($file_handle = @fopen(trailingslashit($file['base']) . $file['file'], 'w')) {
146 fwrite($file_handle, $file['content']);
147 fclose($file_handle);
148 }
149 }
150 }
151 }
152
153 /**
154 * Deactivation hook
155 */
156 public static function deactivation(){
157 }
158
159
160 /**
161 * Handle multisite site creation.
162 */
163 public function create_multisite_table($site) {
164 if (is_numeric($site)) {
165 $site_id = (int) $site;
166 } elseif ($site instanceof \WP_Site) {
167 $site_id = $site->blog_id;
168 } else {
169 return; // Invalid input
170 }
171
172 switch_to_blog($site_id);
173 Db::instance()->create_table();
174 restore_current_blog();
175 }
176
177 /**
178 * Load admin Javascript.
179 * @access public
180 * @return void
181 * @since 1.0.0
182 */
183 public function admin_enqueue_scripts($hook = '') {
184 if (!isset($this->hook_suffix) || empty($this->hook_suffix)) {
185 return;
186 }
187
188 $screen = get_current_screen();
189
190 // deactivate form js
191 if ($screen->id == 'plugins') {
192 wp_enqueue_script($this->token . '-deactivate-form', esc_url($this->assets_url) . 'js/deactivate.js', array('jquery'), $this->version, true);
193 }
194
195
196 if (in_array($screen->id, $this->hook_suffix, true)) {
197 // Enqueue WordPress media scripts.
198 if (!did_action('wp_enqueue_media')) {
199 wp_enqueue_media();
200 }
201
202 // Enqueue custom backend script.
203 wp_enqueue_script($this->token . '-backend', esc_url($this->assets_url) . 'js/backend.js', array('wp-i18n'), $this->version, true);
204
205 // Localize a script.
206 wp_localize_script(
207 $this->token . '-backend',
208 $this->token . '_object',
209 array(
210 'api_nonce' => wp_create_nonce('wp_rest'),
211 'root' => rest_url($this->token . '/v1/'),
212 'pro_root' => rest_url($this->token . '/pro/v1/'),
213 'assets_url' => $this->assets_url,
214 'admin_url' => admin_url(),
215 'is_db_upgrade_required' => Upgrade::instance()->is_upgrade_needed(),
216 'is_cron_disabled' => defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON,
217 'is_pro_active' => defined('WPMCS_PRO_VERSION'),
218 'license_status' => defined('WPMCS_PRO_VERSION') ? Utils::get_safe_license_data() : [],
219 )
220 );
221 }
222 }
223
224
225
226 /**
227 * Load admin CSS.
228 * @access public
229 * @return void
230 * @since 1.0.0
231 */
232 public function admin_enqueue_styles($hook = '') {
233 if ( ! isset($this->hook_suffix) || empty($this->hook_suffix)) {
234 return;
235 }
236 $screen = get_current_screen();
237 if (in_array($screen->id, $this->hook_suffix)) {
238 wp_register_style($this->token.'-backend',
239 esc_url($this->assets_url).'css/backend.css?nocache='.rand(0, 10000), array(), $this->version);
240 wp_enqueue_style($this->token.'-backend');
241 }
242
243 if ($screen->id == 'plugins') {
244 wp_enqueue_style($this->token . '-deactivate-form', esc_url($this->assets_url) . 'css/deactivate.css', array(), $this->version);
245 }
246 }
247
248 /**
249 * Show action links on the plugin screen.
250 *
251 * @param mixed $links Plugin Action links.
252 *
253 * @return array
254 */
255 public function plugin_action_links($links){
256 $action_links = array(
257 'getstarted' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure') . '">' . esc_html__('Get Started', 'media-cloud-sync') . '</a>',
258 'settings' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui/') . '">' . esc_html__('Settings', 'media-cloud-sync') . '</a>',
259 );
260
261 return array_merge($action_links, $links);
262 }
263
264
265
266
267 /**
268 * Add Admin Menu
269 */
270 public function add_menu() {
271 $this->hook_suffix[] = add_menu_page(
272 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
273 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
274 'manage_options',
275 $this->token.'-admin-ui',
276 array($this, 'adminUi'),
277 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTczIiBoZWlnaHQ9IjEyMiIgdmlld0JveD0iMCAwIDE3MyAxMjIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xMzkuNTggNzYuMDA4MkMxNDYuNDQxIDc1LjgyMyAxNTEuOTAyIDc4LjgxNTggMTU2LjE3OSA4My44NzkzQzE2MS42OTUgOTAuNDA5OCAxNjEuMzQ5IDk4LjY5MjEgMTU1LjkyMyAxMDUuMzI0QzE1Mi40ODUgMTA5LjUyNiAxNDYuOTI5IDExMC42OTMgMTQyLjIwNyAxMDguMTZDMTM5LjU4OSAxMDYuNzU1IDEzNy45NDIgMTA0LjUxIDEzNy4wMzEgMTAxLjcwMUMxMzYuNzc0IDEwMC45MDYgMTM3LjA3MiAxMDAuNjE1IDEzNy44NSAxMDAuNjMxQzEzOC41OTggMTAwLjY0NyAxMzkuMzQ3IDEwMC42MzUgMTQwLjQ0NCAxMDAuNjM1QzE0MS43MDkgMTAwLjUyMSAxNDMuMTc4IDEwMC44MTggMTQ0LjY3MiAxMDEuNThDMTQ3Ljc2NyAxMDMuMTU5IDE1Mi4xNTcgMTAxLjY1OCAxNTMuOTY1IDk4LjYwNTlDMTU2LjA3OSA5NS4wMzcgMTU1LjQxMSA5MS4wMDY3IDE1Mi4zMjkgODguNzM2N0MxNDguNTkgODUuOTgyOSAxNDQuNDg0IDg2LjQzNzggMTQxLjM0NyA4OS44OTg4QzEzOS41NzUgOTEuODUzNyAxMzcuMzYzIDkzLjAwNDMgMTM0LjcwMiA5My4yMDk0QzEzMC4zNjUgOTMuNTQzNiAxMjcuMzE1IDg5Ljk3OTIgMTI4LjEzMyA4NS41Mzg1QzEyOS4xMjUgODAuMTU4NSAxMzMuOTE2IDc2LjE2MTEgMTM5LjU4IDc2LjAwODJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQyLjIxNyA5NC4xMzMyQzE0Mi42MjQgOTQuMTMzMiAxNDIuOTU1IDk0LjQ2MzMgMTQyLjk1NSA5NC44NzA1Vjk5LjY3OTFDMTQyLjk1NSAxMDAuMDg2IDE0Mi42MjQgMTAwLjQxNSAxNDIuMjE3IDEwMC40MTVIMTM3LjU1OEMxMzcuMTUxIDEwMC40MTUgMTM2LjgyMSAxMDAuMDg2IDEzNi44MiA5OS42NzkxVjk0Ljg3MDVDMTM2LjgyIDk0LjQ2MzMgMTM3LjE1IDk0LjEzMzIgMTM3LjU1OCA5NC4xMzMySDE0Mi4yMTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ5LjE5NyA5NC4xMzQyQzE0OS42MDUgOTQuMTM0MiAxNDkuOTM2IDk0LjQ2NDMgMTQ5LjkzNiA5NC44NzE1Vjk2LjU3NTZDMTQ5LjkzNiA5Ni45ODI4IDE0OS42MDUgOTcuMzEyOSAxNDkuMTk3IDk3LjMxMjlIMTQ3LjU2OUMxNDcuMTYxIDk3LjMxMjkgMTQ2LjgzMSA5Ni45ODI4IDE0Ni44MzEgOTYuNTc1NlY5NC44NzE1QzE0Ni44MzEgOTQuNDY0MyAxNDcuMTYxIDk0LjEzNDIgMTQ3LjU2OSA5NC4xMzQySDE0OS4xOTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ1LjMzMiA5NC4xMzMyQzE0NS43MzkgOTQuMTMzNSAxNDYuMDcgOTQuNDYzNSAxNDYuMDcgOTQuODcwNVY5NS44MDUxQzE0Ni4wNyA5Ni4yMTIxIDE0NS43MzkgOTYuNTQyMSAxNDUuMzMyIDk2LjU0MjRIMTQ0LjQ1NEMxNDQuMDQ3IDk2LjU0MjQgMTQzLjcxNyA5Ni4yMTIzIDE0My43MTcgOTUuODA1MVY5NC44NzA1QzE0My43MTcgOTQuNDYzMyAxNDQuMDQ3IDk0LjEzMzIgMTQ0LjQ1NCA5NC4xMzMySDE0NS4zMzJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3MyA5Mi41MDAxQzE3MyAxMDguMjQgMTYwLjI0IDEyMSAxNDQuNSAxMjFDMTI4Ljc2IDEyMSAxMTYgMTA4LjI0IDExNiA5Mi41MDAxQzExNiA3Ni43NiAxMjguNzYgNjQuMDAwMSAxNDQuNSA2NC4wMDAxQzE2MC4yNCA2NC4wMDAxIDE3MyA3Ni43NiAxNzMgOTIuNTAwMVpNMTQ0LjUgMTE0QzE1Ni4zNzQgMTE0IDE2NiAxMDQuMzc0IDE2NiA5Mi41MDAxQzE2NiA4Ni43MDIyIDE2My43MDUgODEuNDQwMyAxNTkuOTc0IDc3LjU3MzNDMTU2LjA2NCA3My41MjA3IDE1MC41NzYgNzEuMDAwMSAxNDQuNSA3MS4wMDAxQzEzMi42MjYgNzEuMDAwMSAxMjMgODAuNjI2IDEyMyA5Mi41MDAxQzEyMyAxMDAuNTQzIDEyNy40MTYgMTA3LjU1NCAxMzMuOTU2IDExMS4yNDFDMTM3LjA3MSAxMTIuOTk4IDE0MC42NjkgMTE0IDE0NC41IDExNFoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzUuMjY1OSA0My40MTY4QzM3LjI3OTMgMzEuMjg3IDQzLjUzMjQgMjAuMjY1NSA1Mi45MTE3IDEyLjMxNDdDNjIuMjkxIDQuMzYzOTEgNzQuMTg3NyAwIDg2LjQ4MzUgMEM5OC43NzkzIDAgMTEwLjY3NiA0LjM2MzkxIDEyMC4wNTUgMTIuMzE0N0MxMjkuNDM1IDIwLjI2NTUgMTM1LjY4OCAzMS4yODcgMTM3LjcwMSA0My40MTY4QzE0Ny42NjIgNDQuMzU5IDE1Ni44NzcgNDkuMDk5NiAxNjMuNDM1IDU2LjY1NTFDMTY5Ljk5NCA2NC4yMTA2IDE3My4zOTIgNzQuMDAwOSAxNzIuOTI0IDgzLjk5NDlDMTcyLjQ1NyA5My45ODg5IDE2OC4xNiAxMDMuNDE5IDE2MC45MjUgMTEwLjMzQzE1My42OSAxMTcuMjQgMTQ0LjA3MiAxMjEuMSAxMzQuMDY3IDEyMS4xMDhIMzguODk5NkMyOC44OTQ3IDEyMS4xIDE5LjI3NyAxMTcuMjQgMTIuMDQyIDExMC4zM0M0LjgwNjk1IDEwMy40MTkgMC41MDk5NzUgOTMuOTg4OSAwLjA0MjU0OTUgODMuOTk0OUMtMC40MjQ4NzYgNzQuMDAwOSAyLjk3MzEzIDY0LjIxMDYgOS41MzE1OSA1Ni42NTUxQzE2LjA5IDQ5LjA5OTYgMjUuMzA1NSA0NC4zNTkgMzUuMjY1OSA0My40MTY4Wk00Mi45NzE1IDQ1LjkyNTJDNDQuNjgyNyAzNS42MDkgNDkuOTk3IDI2LjIzNTQgNTcuOTY4MiAxOS40NzM1QzY1LjkzOTQgMTIuNzExNSA3Ni4wNTAxIDkuMDAwMSA4Ni40OTk5IDkuMDAwMUM5Ni45NDk4IDkuMDAwMSAxMDcuMDYgMTIuNzExNSAxMTUuMDMyIDE5LjQ3MzVDMTIzLjAwMyAyNi4yMzU0IDEyOC4zMTcgMzUuNjA5IDEzMC4wMjggNDUuOTI1MkMxMzguNDkzIDQ2LjcyNjUgMTQ2LjMyNSA1MC43NTgzIDE1MS44OTkgNTcuMTg0QzE1Ni44NDUgNjIuODg2MSAxNTkuNjc2IDcwLjA4NDkgMTU5Ljk3NCA3Ny41NzMzQzE2My43MDUgODEuNDQwMyAxNjYgODYuNzAyMiAxNjYgOTIuNTAwMUMxNjYgMTA0LjM3NCAxNTYuMzc0IDExNCAxNDQuNSAxMTRDMTQwLjY2OSAxMTQgMTM3LjA3MSAxMTIuOTk4IDEzMy45NTYgMTExLjI0MUMxMzEuNjY4IDExMS43NCAxMjkuMzE3IDExMS45OTggMTI2Ljk0IDExMkg0Ni4wNTk3QzM3LjU1NjggMTExLjk5MyAyOS4zODI5IDEwOC43MSAyMy4yMzQxIDEwMi44MzNDMTcuMDg1MiA5Ni45NTYxIDEzLjQzMzMgODguOTM1NyAxMy4wMzYxIDgwLjQzNkMxMi42Mzg4IDcxLjkzNjMgMTUuNTI2NyA2My42MDk4IDIxLjEwMDYgNTcuMTg0QzI2LjY3NDQgNTAuNzU4MyAzNC41MDY0IDQ2LjcyNjUgNDIuOTcxNSA0NS45MjUyWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTkzLjUyMTEgNDEuMTc0OEw3Ny4xNDE3IDE4LjY1MDJDNzYuOTk1MyAxOC40NDk1IDc2LjgwMjUgMTguMjg1OCA3Ni41NzkyIDE4LjE3MjhDNzYuMzU1OSAxOC4wNTk4IDc2LjEwODUgMTguMDAwNiA3NS44NTc0IDE4LjAwMDJINzUuODUzNkM3NS42MDE1IDE4LjAwMDcgNzUuMzUzMiAxOC4wNjA0IDc1LjEyOTMgMTguMTc0M0M3NC45MDU0IDE4LjI4ODIgNzQuNzEyMyAxOC40NTMxIDc0LjU2NjEgMTguNjU1Mkw1OC4yOTI0IDQxLjE3OTdDNTguMTI0IDQxLjQxMjUgNTguMDI0MSA0MS42ODY1IDU4LjAwMzggNDEuOTcxNUM1Ny45ODM1IDQyLjI1NjYgNTguMDQzNSA0Mi41NDE2IDU4LjE3NzMgNDIuNzk1MkM1OC4zMTAzIDQzLjA0OTIgNTguNTExOCA0My4yNjIxIDU4Ljc1OTggNDMuNDEwN0M1OS4wMDc4IDQzLjU1OTIgNTkuMjkyNyA0My42Mzc1IDU5LjU4MyA0My42MzdINjcuMjQxOEw2Ny4yNDEyIDc2LjE0MUM2Ny4yNDExIDc2LjM0NTQgNjcuMjgxOSA3Ni41NDc3IDY3LjM2MTQgNzYuNzM2NUM2Ny40NDA5IDc2LjkyNTMgNjcuNTU3NCA3Ny4wOTY5IDY3LjcwNDMgNzcuMjQxM0M2Ny44NTEyIDc3LjM4NTggNjguMDI1NiA3Ny41MDA0IDY4LjIxNzUgNzcuNTc4NUM2OC40MDk0IDc3LjY1NjYgNjguNjE1MSA3Ny42OTY3IDY4LjgyMjggNzcuNjk2Nkw4Mi45OTMxIDc3LjY5NTlDODMuMjAwOSA3Ny42OTYgODMuNDA2NyA3Ny42NTU4IDgzLjU5ODcgNzcuNTc3NkM4My43OTA2IDc3LjQ5OTQgODMuOTY1MSA3Ny4zODQ3IDg0LjExMiA3Ny4yNDAxQzg0LjI1ODkgNzcuMDk1NSA4NC4zNzUzIDc2LjkyMzkgODQuNDU0OCA3Ni43MzVDODQuNTM0MiA3Ni41NDYxIDg0LjU3NSA3Ni4zNDM2IDg0LjU3NDggNzYuMTM5MlY0My42Mzc2SDkyLjIzNjFDOTIuODI3IDQzLjYzNzYgOTMuMzY5NiA0My4zMDk4IDkzLjY0MjQgNDIuNzkyMUM5My43NzU3IDQyLjUzNzcgOTMuODM0OSA0Mi4yNTIgOTMuODEzNSA0MS45NjY2QzkzLjc5MjEgNDEuNjgxMiA5My42OTA5IDQxLjQwNzEgOTMuNTIxMSA0MS4xNzQ4WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTgyLjE0NDkgODUuNDcxNUw5Ni44MzM4IDEwMi4xMzZDOTYuOTY1IDEwMi4yODUgOTcuMTM3OSAxMDIuNDA2IDk3LjMzODIgMTAyLjQ5Qzk3LjUzODQgMTAyLjU3MyA5Ny43NjAzIDEwMi42MTcgOTcuOTg1NSAxMDIuNjE3Qzk4LjIxMTYgMTAyLjYxNyA5OC40Mzc3IDEwMi41NzMgOTguNjM4NSAxMDIuNDg4Qzk4LjgzOTMgMTAyLjQwNCA5OS4wMTI0IDEwMi4yODIgOTkuMTQzNSAxMDIuMTMzTDExMy43MzggODUuNDY3OUMxMTMuODg5IDg1LjI5NTYgMTEzLjk3OCA4NS4wOTI5IDExMy45OTYgODQuODgyQzExNC4wMTUgODQuNjcxMSAxMTMuOTYxIDg0LjQ2MDMgMTEzLjg0MSA4NC4yNzI2QzExMy43MjIgODQuMDg0NyAxMTMuNTQxIDgzLjkyNzIgMTEzLjMxOCA4My44MTczQzExMy4wOTYgODMuNzA3NCAxMTIuODQxIDgzLjY0OTUgMTEyLjU4IDgzLjY0OThIMTA1LjcxMkwxMDUuNzEyIDU5LjYwMTZDMTA1LjcxMyA1OS40NTA1IDEwNS42NzYgNTkuMzAwNyAxMDUuNjA1IDU5LjE2MTFDMTA1LjUzMyA1OS4wMjE0IDEwNS40MjkgNTguODk0NSAxMDUuMjk3IDU4Ljc4NzZDMTA1LjE2NSA1OC42ODA3IDEwNS4wMDkgNTguNTk1OSAxMDQuODM3IDU4LjUzODFDMTA0LjY2NSA1OC40ODAzIDEwNC40OCA1OC40NTA3IDEwNC4yOTQgNTguNDUwOEw5MS41ODYyIDU4LjQ1MTJDOTEuMzk5OSA1OC40NTEyIDkxLjIxNTQgNTguNDgwOSA5MS4wNDMyIDU4LjUzODhDOTAuODcxMSA1OC41OTY3IDkwLjcxNDYgNTguNjgxNSA5MC41ODI5IDU4Ljc4ODVDOTAuNDUxMiA1OC44OTU1IDkwLjM0NjcgNTkuMDIyNCA5MC4yNzU1IDU5LjE2MjJDOTAuMjA0MiA1OS4zMDIgOTAuMTY3NyA1OS40NTE4IDkwLjE2NzggNTkuNjAzVjgzLjY0OTRIODMuMjk3MkM4Mi43NjczIDgzLjY0OTQgODIuMjgwOCA4My44OTE5IDgyLjAzNjEgODQuMjc0OUM4MS45MTY2IDg0LjQ2MzEgODEuODYzNSA4NC42NzQ1IDgxLjg4MjcgODQuODg1N0M4MS45MDE5IDg1LjA5NjggODEuOTkyNiA4NS4yOTk2IDgyLjE0NDkgODUuNDcxNVoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=',
278 999
279 );
280
281 $this->hook_suffix[] = add_submenu_page(
282 $this->token . '-admin-ui',
283 esc_html__('Dashboard', 'media-cloud-sync'),
284 esc_html__('Dashboard', 'media-cloud-sync'),
285 'manage_options',
286 $this->token . '-admin-ui' ,
287 array($this, 'adminUi')
288 );
289
290 if(Utils::is_service_enabled()) {
291 $this->hook_suffix[] = add_submenu_page(
292 $this->token . '-admin-ui',
293 esc_html__('Settings', 'media-cloud-sync'),
294 esc_html__('Settings', 'media-cloud-sync'),
295 'manage_options',
296 $this->token . '-admin-ui#/settings' ,
297 array($this, 'adminUi')
298 );
299 } else {
300 $this->hook_suffix[] = add_submenu_page(
301 $this->token . '-admin-ui',
302 esc_html__('Configure', 'media-cloud-sync'),
303 esc_html__('Configure', 'media-cloud-sync'),
304 'manage_options',
305 $this->token . '-admin-ui#/configure' ,
306 array($this, 'adminUi')
307 );
308 }
309 }
310
311 /**
312 * Calling view function for admin page components
313 */
314 public function adminUi() {
315 echo wp_kses_post(sprintf(
316 '<div id="%s_ui_root">
317 <div class="%s_loader">
318 <h1>%s</h1>
319 <p>%s</p>
320 </div>
321 </div>',
322 $this->token,
323 $this->token,
324 esc_html__('Media Cloud Sync By Dudlewebs','media-cloud-sync'),
325 esc_html__('Plugin is loading Please wait for a while..', 'media-cloud-sync')
326 ));
327
328 }
329
330
331 /**
332 * Load the media assets
333 */
334 public function load_media_assets() {
335 /** CSS */
336 wp_enqueue_style($this->token . '-media', esc_url($this->assets_url) . 'css/media.css', array(), $this->version);
337
338 /** JS */
339 wp_enqueue_script(
340 $this->token . '-media',
341 esc_url($this->assets_url) . 'js/media.js',
342 array(
343 'jquery',
344 'media-views',
345 'media-grid',
346 'wp-util'
347 ),
348 $this->version,
349 true
350 );
351
352 // Localize a script.
353 wp_localize_script(
354 $this->token . '-media',
355 $this->token . '_media_object',
356 array(
357 'file_details_nonce' => wp_create_nonce('get_media_provider_details'),
358 'admin_ajax_url' => admin_url('admin-ajax.php'),
359 'strings' => array(
360 'provider' => esc_html__("Provider: ", "media-cloud-sync"),
361 'region' => esc_html__("Region: ", "media-cloud-sync"),
362 'access' => esc_html__("Access: ", "media-cloud-sync"),
363 'access_private' => esc_html__("Private", "media-cloud-sync"),
364 'access_public' => esc_html__("Public", "media-cloud-sync"),
365 )
366 )
367 );
368 }
369
370
371 /**
372 * Deactivation form
373 * @since 1.0.2
374 */
375 public function wpmcs_deactivation_form() {
376 $currentScreen = get_current_screen();
377 $screenID = $currentScreen->id;
378 if ($screenID == 'plugins') {
379 ?>
380 <div id="dw-wpmcs-survey-form-wrap">
381 <div id="dw-wpmcs-survey-form">
382 <h2>We Value Your Feedback</h2>
383 <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>
384 <form method="POST">
385 <input name="plugin_name" type="hidden" value="<?= esc_attr($this->token); ?>" required>
386 <input name="website" type="hidden" value="<?= esc_url(get_site_url()); ?>" required>
387 <input name="title" type="hidden" value="<?= esc_attr(get_bloginfo('name')); ?>" required>
388 <input name="version" type="hidden" value="<?= esc_attr($this->version); ?>" required>
389
390 <div class="dw-wpmcs-reason">
391 <label><input type="radio" name="reason" value="I\'m only deactivating temporarily"> I'm only deactivating temporarily</label>
392 <label><input type="radio" name="reason" value="I no longer need the plugin"> I no longer need the plugin</label>
393 <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>
394 <label><input type="radio" name="reason" value="I found a better plugin"> I found a better plugin</label>
395 <label><input type="radio" name="reason" value="Upgrading to PRO version"> Upgrading to PRO version</label>
396 <label><input type="radio" name="reason" value="Plugin doesn\'t meet my requirements"> Plugin doesn't meet my requirements</label>
397 <label><input type="radio" name="reason" value="Plugin broke my site"> Plugin broke my site</label>
398 <label><input type="radio" name="reason" value="Plugin suddenly stopped working"> Plugin suddenly stopped working</label>
399 <label><input type="radio" name="reason" value="I found a bug"> I found a bug</label>
400 <label><input type="radio" name="reason" value="Other"> Other</label>
401 </div>
402
403 <div class="dw-wpmcs-comments" style="display:none;">
404 <textarea name="comments" placeholder="Please specify" rows="3"></textarea>
405 <p>Need help? <a href="https://dudlewebs.com/" target="_blank">Use live chat support</a></p>
406 </div>
407
408 <p id="dw-wpmcs-error" class="dw-wpmcs-error"></p>
409 <div class="dw-wpmcs-actions">
410 <button type="button" class="dw-button dw-skip" id="dw-wpmcs-skip">Skip & Deactivate</button>
411 <button type="button" class="dw-button dw-secondary" id="dw-wpmcs-cancel">Cancel</button>
412 <button type="submit" class="dw-button dw-primary" id="dw-wpmcs-deactivate">Submit & Deactivate</button>
413 </div>
414 </form>
415 </div>
416 </div>
417 <?php }
418 }
419
420
421
422 /**
423 * Add custom classes to the HTML body tag
424 *
425 * @param string $classes
426 *
427 * @return string
428 */
429 public function admin_body_class( $classes ) {
430 if ( ! $classes ) {
431 $classes = array();
432 } else {
433 $classes = explode( ' ', $classes );
434 }
435 $classes[] = $this->token.'_page';
436 /**
437 * Recommended way to target WP 3.8+
438 * http://make.wordpress.org/ui/2013/11/19/targeting-the-new-dashboard-design-in-a-post-mp6-world/
439 *
440 */
441 if ( version_compare( $GLOBALS['wp_version'], '3.8-alpha', '>' ) ) {
442 if ( ! in_array( 'mp6', $classes ) ) {
443 $classes[] = 'mp6';
444 }
445 }
446 return implode( ' ', $classes );
447 }
448
449
450 /**
451 * Ensures only one instance of Class is loaded or can be loaded.
452 *
453 * @return Main Class instance
454 * @since 1.0.0
455 * @static
456 */
457 public static function instance(){
458 if (is_null(self::$instance)) {
459 self::$instance = new self();
460 }
461 return self::$instance;
462 }
463
464 }