PluginProbe
Media Cloud Sync / 1.2.5
Media Cloud Sync v1.2.5
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.2.5, at includes/admin.php

441 lines 28.1 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 if(get_option( $this->token.'_db_version' ) !== WPMCS_DB_VERSION) {
61 Db::instance()->do_database_upgrade();
62 }
63
64 if (get_option($this->token.'_do_activation_redirect', false) && !Utils::get_service()) {
65 delete_option($this->token.'_do_activation_redirect');
66 wp_redirect(admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure'));
67 } else {
68 delete_option($this->token.'_do_activation_redirect');
69 }
70 }
71
72 /**
73 * Installation. Runs on activation.
74 *
75 * @access public
76 * @return void
77 * @since 1.0.0
78 */
79 public function install($network_wide = false) {
80 Db::handle_tables($network_wide);
81
82 // Redirection on activation
83 add_option($this->token.'_do_activation_redirect', true);
84
85 //Protect directories
86 $this->_protect_upload_dir();
87 }
88
89 /**
90 * Create plugin specific upload directory
91 * @since 1.0.0
92 */
93 public function create_plugin_dir() {
94 //Protect directories
95 $this->_protect_upload_dir();
96 }
97
98 /**
99 * Protect Directory from external access.
100 *
101 * @access private
102 * @return void
103 * @since 1.0.0
104 */
105 private function _protect_upload_dir(){
106 $upload_dir = wp_upload_dir();
107
108 $files = array(
109 array(
110 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'),
111 'file' => '.htaccess',
112 'content' => 'Options -Indexes' . "\n"
113 . '<Files *.php>' . "\n"
114 . 'deny from all' . "\n"
115 . '</Files>'
116 ),
117 array(
118 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'),
119 'file' => 'index.php',
120 'content' => '<?php ' . "\n"
121 . '// Silence is golden.'
122 )
123 );
124
125 foreach ($files as $file) {
126 if ((wp_mkdir_p($file['base'])) && (!file_exists(trailingslashit($file['base']) . $file['file'])) // If file not exist
127 ) {
128 if ($file_handle = @fopen(trailingslashit($file['base']) . $file['file'], 'w')) {
129 fwrite($file_handle, $file['content']);
130 fclose($file_handle);
131 }
132 }
133 }
134 }
135
136 /**
137 * Deactivation hook
138 */
139 public function deactivation(){
140 }
141
142
143 /**
144 * Handle multisite site creation.
145 */
146 public function create_multisite_table($site) {
147 if (is_numeric($site)) {
148 $site_id = (int) $site;
149 } elseif ($site instanceof \WP_Site) {
150 $site_id = $site->blog_id;
151 } else {
152 return; // Invalid input
153 }
154
155 switch_to_blog($site_id);
156 Db::instance()->create_table();
157 restore_current_blog();
158 }
159
160 /**
161 * Load admin Javascript.
162 * @access public
163 * @return void
164 * @since 1.0.0
165 */
166 public function admin_enqueue_scripts($hook = '') {
167 if (!isset($this->hook_suffix) || empty($this->hook_suffix)) {
168 return;
169 }
170
171 $screen = get_current_screen();
172
173 // deactivate form js
174 if ($screen->id == 'plugins') {
175 wp_enqueue_script($this->token . '-deactivate-form', esc_url($this->assets_url) . 'js/deactivate.js', array('jquery'), $this->version, true);
176 }
177
178
179 if (in_array($screen->id, $this->hook_suffix, true)) {
180 // Enqueue WordPress media scripts.
181 if (!did_action('wp_enqueue_media')) {
182 wp_enqueue_media();
183 }
184
185 // Enqueue custom backend script.
186 wp_enqueue_script($this->token . '-backend', esc_url($this->assets_url) . 'js/backend.js', array('wp-i18n'), $this->version, true);
187
188 // Localize a script.
189 wp_localize_script(
190 $this->token . '-backend',
191 $this->token . '_object',
192 array(
193 'api_nonce' => wp_create_nonce('wp_rest'),
194 'root' => rest_url($this->token . '/v1/'),
195 'assets_url' => $this->assets_url,
196 )
197 );
198 }
199 }
200
201
202
203 /**
204 * Load admin CSS.
205 * @access public
206 * @return void
207 * @since 1.0.0
208 */
209 public function admin_enqueue_styles($hook = '') {
210 if ( ! isset($this->hook_suffix) || empty($this->hook_suffix)) {
211 return;
212 }
213 $screen = get_current_screen();
214 if (in_array($screen->id, $this->hook_suffix)) {
215 wp_register_style($this->token.'-backend',
216 esc_url($this->assets_url).'css/backend.css?nocache='.rand(0, 10000), array(), $this->version);
217 wp_enqueue_style($this->token.'-backend');
218 }
219
220 if ($screen->id == 'plugins') {
221 wp_enqueue_style($this->token . '-deactivate-form', esc_url($this->assets_url) . 'css/deactivate.css', array(), $this->version);
222 }
223 }
224
225 /**
226 * Show action links on the plugin screen.
227 *
228 * @param mixed $links Plugin Action links.
229 *
230 * @return array
231 */
232 public function plugin_action_links($links){
233 $action_links = array(
234 'getstarted' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure') . '">' . esc_html__('Get Started', 'media-cloud-sync') . '</a>',
235 'settings' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui/') . '">' . esc_html__('Settings', 'media-cloud-sync') . '</a>',
236 );
237
238 return array_merge($action_links, $links);
239 }
240
241
242
243
244 /**
245 * Add Admin Menu
246 */
247 public function add_menu() {
248 $this->hook_suffix[] = add_menu_page(
249 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
250 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
251 'manage_options',
252 $this->token.'-admin-ui',
253 array($this, 'adminUi'),
254 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgdmlld0JveD0iMCAwIDUwIDUwIiBmaWxsPSJub25lIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEwNDRfNzQ4KSI+CjxwYXRoIGQ9Ik0xNC4yNDg0IDIxLjQyNDdDMTQuNjcxMiAxOC44Nzc2IDE1Ljk4NDMgMTYuNTYzMiAxNy45NTM4IDE0Ljg5MzZDMTkuOTIzNCAxMy4yMjQgMjIuNDIxNiAxMi4zMDc2IDI1LjAwMzUgMTIuMzA3NkMyNy41ODU1IDEyLjMwNzYgMzAuMDgzNyAxMy4yMjQgMzIuMDUzMyAxNC44OTM2QzM0LjAyMjggMTYuNTYzMiAzNS4zMzU5IDE4Ljg3NzYgMzUuNzU4NyAyMS40MjQ3QzM3Ljg1MDMgMjEuNjIyNiAzOS43ODU0IDIyLjYxOCA0MS4xNjI3IDI0LjIwNDZDNDIuNTM5OSAyNS43OTEyIDQzLjI1MzQgMjcuODQ3MSA0My4xNTUzIDI5Ljk0NTdDNDMuMDU3MSAzMi4wNDQzIDQyLjE1NDggMzQuMDI0NiA0MC42MzU1IDM1LjQ3NTdDMzkuMTE2MiAzNi45MjY4IDM3LjA5NjYgMzcuNzM3MyAzNC45OTU3IDM3LjczOTFIMTUuMDExNEMxMi45MTA1IDM3LjczNzMgMTAuODkwOSAzNi45MjY4IDkuMzcxNTkgMzUuNDc1N0M3Ljg1MjMxIDM0LjAyNDYgNi45NDk5OSAzMi4wNDQzIDYuODUxODMgMjkuOTQ1N0M2Ljc1MzY4IDI3Ljg0NzEgNy40NjcyMiAyNS43OTEyIDguODQ0NDMgMjQuMjA0NkMxMC4yMjE2IDIyLjYxOCAxMi4xNTY4IDIxLjYyMjYgMTQuMjQ4NCAyMS40MjQ3WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMjMuMTg2NyAyOS41NjRDMjMuMTg2NyAzMC42Mzc3IDIyLjk3NTIgMzEuNzAwNyAyMi41NjQ0IDMyLjY5MjZDMjIuMTUzNSAzMy42ODQ1IDIxLjU1MTMgMzQuNTg1OCAyMC43OTIyIDM1LjM0NDlDMjAuMDMzIDM2LjEwNDEgMTkuMTMxOCAzNi43MDYzIDE4LjEzOTkgMzcuMTE3MUMxNy4xNDggMzcuNTI4IDE2LjA4NDkgMzcuNzM5NCAxNS4wMTEzIDM3LjczOTRDMTMuOTM3NyAzNy43Mzk0IDEyLjg3NDYgMzcuNTI4IDExLjg4MjcgMzcuMTE3MUMxMC44OTA4IDM2LjcwNjMgOS45ODk2IDM2LjEwNDEgOS4yMzA0NSAzNS4zNDQ5QzguNDcxMjkgMzQuNTg1OCA3Ljg2OTEgMzMuNjg0NSA3LjQ1ODI1IDMyLjY5MjZDNy4wNDc0IDMxLjcwMDcgNi44MzU5NCAzMC42Mzc3IDYuODM1OTQgMjkuNTY0QzYuODM1OTQgMjcuMzk1OCA3LjY5NzI3IDI1LjMxNjQgOS4yMzA0NSAyMy43ODMyQzEwLjc2MzYgMjIuMjUgMTIuODQzMSAyMS4zODg3IDE1LjAxMTMgMjEuMzg4N0MxNy4xNzk2IDIxLjM4ODcgMTkuMjU5IDIyLjI1IDIwLjc5MjIgMjMuNzgzMkMyMi4zMjUzIDI1LjMxNjQgMjMuMTg2NyAyNy4zOTU4IDIzLjE4NjcgMjkuNTY0WiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzEwNDRfNzQ4KSIgZmlsbC1vcGFjaXR5PSIwLjMiLz4KPHBhdGggZD0iTTI1LjAwMzQgMzQuMTA1N0MyNy4wODMyIDM0LjEwNTUgMjkuMTE5NSAzMy41MTAzIDMwLjg3MiAzMi4zOTA0QzMyLjYyNDUgMzEuMjcwNSAzNC4wMjAxIDI5LjY3MjYgMzQuODk0IDI3Ljc4NTRDMzUuNzY3OCAyNS44OTgxIDM2LjA4MzYgMjMuODAwMiAzNS44MDM5IDIxLjczOTNDMzUuNTI0MiAxOS42Nzg1IDM0LjY2MDggMTcuNzQwNiAzMy4zMTU2IDE2LjE1NDVDMzEuOTcwMyAxNC41Njg0IDMwLjE5OTQgMTMuNDAwMiAyOC4yMTE4IDEyLjc4NzlDMjYuMjI0MiAxMi4xNzU1IDI0LjEwMyAxMi4xNDQ2IDIyLjA5ODMgMTIuNjk4NkMyMC4wOTM3IDEzLjI1MjcgMTguMjg5NSAxNC4zNjg3IDE2Ljg5ODUgMTUuOTE0OUMxNS41MDc2IDE3LjQ2MTEgMTQuNTg4IDE5LjM3MjkgMTQuMjQ4MyAyMS40MjQ4QzE0LjQ5OSAyMS40MDA2IDE0Ljc1MzMgMjEuMzg4NCAxNS4wMTEzIDIxLjM4ODRDMTYuNDUxNyAyMS4zODgyIDE3Ljg2NjYgMjEuNzY4NSAxOS4xMTI3IDIyLjQ5MDhDMjAuMzU4OCAyMy4yMTMyIDIxLjM5MiAyNC4yNTE5IDIyLjEwNzcgMjUuNTAxOUMyMi44MjMzIDI2Ljc1MiAyMy4xOTYgMjguMTY4OCAyMy4xODggMjkuNjA5MkMyMy4xOCAzMS4wNDk1IDIyLjc5MTYgMzIuNDYyMiAyMi4wNjIxIDMzLjcwNDJDMjMuMDE5NyAzMy45NzE1IDI0LjAwOTMgMzQuMTA2NiAyNS4wMDM0IDM0LjEwNTdaIiBmaWxsPSJ1cmwoI3BhaW50Ml9saW5lYXJfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuMyIvPgo8cGF0aCBkPSJNMjUuMDAzNCAzNC4xMDU3QzI3LjA4MzIgMzQuMTA1NSAyOS4xMTk1IDMzLjUxMDMgMzAuODcyIDMyLjM5MDRDMzIuNjI0NSAzMS4yNzA1IDM0LjAyMDEgMjkuNjcyNiAzNC44OTQgMjcuNzg1NEMzNS43Njc4IDI1Ljg5ODEgMzYuMDgzNiAyMy44MDAyIDM1LjgwMzkgMjEuNzM5M0MzNS41MjQyIDE5LjY3ODUgMzQuNjYwOCAxNy43NDA2IDMzLjMxNTYgMTYuMTU0NUMzMS45NzAzIDE0LjU2ODQgMzAuMTk5NCAxMy40MDAyIDI4LjIxMTggMTIuNzg3OUMyNi4yMjQyIDEyLjE3NTUgMjQuMTAzIDEyLjE0NDYgMjIuMDk4MyAxMi42OTg2QzIwLjA5MzcgMTMuMjUyNyAxOC4yODk1IDE0LjM2ODcgMTYuODk4NSAxNS45MTQ5QzE1LjUwNzYgMTcuNDYxMSAxNC41ODggMTkuMzcyOSAxNC4yNDgzIDIxLjQyNDhDMTQuNDk5IDIxLjQwMDYgMTQuNzUzMyAyMS4zODg0IDE1LjAxMTMgMjEuMzg4NEMxNi40NTE3IDIxLjM4ODIgMTcuODY2NiAyMS43Njg1IDE5LjExMjcgMjIuNDkwOEMyMC4zNTg4IDIzLjIxMzIgMjEuMzkyIDI0LjI1MTkgMjIuMTA3NyAyNS41MDE5QzIyLjgyMzMgMjYuNzUyIDIzLjE5NiAyOC4xNjg4IDIzLjE4OCAyOS42MDkyQzIzLjE4IDMxLjA0OTUgMjIuNzkxNiAzMi40NjIyIDIyLjA2MjEgMzMuNzA0MkMyMy4wMTk3IDMzLjk3MTUgMjQuMDA5MyAzNC4xMDY2IDI1LjAwMzQgMzQuMTA1N1oiIGZpbGw9InVybCgjcGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCkiLz4KPHBhdGggZD0iTTE0LjI0ODQgMjEuNDI0N0MxNC42NzEyIDE4Ljg3NzYgMTUuOTg0MyAxNi41NjMyIDE3Ljk1MzggMTQuODkzNkMxOS45MjM0IDEzLjIyNCAyMi40MjE2IDEyLjMwNzYgMjUuMDAzNSAxMi4zMDc2QzI3LjU4NTUgMTIuMzA3NiAzMC4wODM3IDEzLjIyNCAzMi4wNTMzIDE0Ljg5MzZDMzQuMDIyOCAxNi41NjMyIDM1LjMzNTkgMTguODc3NiAzNS43NTg3IDIxLjQyNDdDMzcuODUwMyAyMS42MjI2IDM5Ljc4NTQgMjIuNjE4IDQxLjE2MjcgMjQuMjA0NkM0Mi41Mzk5IDI1Ljc5MTIgNDMuMjUzNCAyNy44NDcxIDQzLjE1NTMgMjkuOTQ1N0M0My4wNTcxIDMyLjA0NDMgNDIuMTU0OCAzNC4wMjQ2IDQwLjYzNTUgMzUuNDc1N0MzOS4xMTYyIDM2LjkyNjggMzcuMDk2NiAzNy43MzczIDM0Ljk5NTcgMzcuNzM5MUgxNS4wMTE0QzEyLjkxMDUgMzcuNzM3MyAxMC44OTA5IDM2LjkyNjggOS4zNzE1OSAzNS40NzU3QzcuODUyMzEgMzQuMDI0NiA2Ljk0OTk5IDMyLjA0NDMgNi44NTE4MyAyOS45NDU3QzYuNzUzNjggMjcuODQ3MSA3LjQ2NzIyIDI1Ljc5MTIgOC44NDQ0MyAyNC4yMDQ2QzEwLjIyMTYgMjIuNjE4IDEyLjE1NjggMjEuNjIyNiAxNC4yNDg0IDIxLjQyNDdaIiBmaWxsPSJ1cmwoI3BhaW50NF9yYWRpYWxfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzEwNDRfNzQ4KSI+CjxyZWN0IHg9IjM1LjkzNzUiIHk9IjQuNjg3NSIgd2lkdGg9IjkuMzc1IiBoZWlnaHQ9IjkuMzc1IiByeD0iNC42ODc1IiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxwYXRoIGQ9Ik00Mi41ODA5IDEwLjcyQzQyLjM2MTYgMTEuMzY3NSA0MS45Nzg3IDExLjYwODYgNDEuNzc2OCAxMS43MTE3QzQxLjk2MTMgMTEuNzE2MiA0Mi4zMTk4IDExLjc2NTEgNDIuNzI3MSAxMS41MjQyQzQzLjMxMTkgMTEuMTM3OCA0My40MjQ0IDEwLjY0MzYgNDMuNDM3MiAxMC41MTEyQzQzLjQ0NzcgMTAuNDAzNiA0My40MzcyIDEwLjI4MDcgNDMuNDM3MiA5Ljg2MzcxQzQzLjQwNTkgOS43OTQyMSA0My4zNDMyIDkuNTcxMzEgNDMuMDA5IDkuNTcxMzFDNDIuNzQxNyA5LjU3MTMxIDQyLjYxMjIgOS43OTA2MSA0Mi42MTIyIDkuOTA1NDhDNDIuNjEyMiAxMC4xOTc5IDQyLjYyMjcgMTAuNDI3NiA0Mi41ODA5IDEwLjcyWiIgZmlsbD0idXJsKCNwYWludDVfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNNDEuMjIzMyAxMC41ODQzQzQxLjE4MTUgMTEuMTAyMyA0MC43NjczIDExLjU1MiA0MC41NjU0IDExLjcxMjFDNDAuNzQ5OSAxMS43MTkxIDQxLjE5ODIgMTEuNjcwNCA0MS41MTU3IDExLjQxOTdDNDEuOTEyNSAxMS4xMDY0IDQyLjA2NjggMTAuNjk1OSA0Mi4wNzk2IDEwLjQ5MDNDNDIuMDkwMSAxMC4zMjMyIDQyLjA5MDEgOS4yNzg5IDQyLjA5MDEgOC42MzE0M0M0Mi4wNTg3IDguNTIzNTIgNDEuOTI5MiA4LjMwNzY5IDQxLjY2MTkgOC4zMDc2OUM0MS4zOTQ1IDguMzA3NjkgNDEuMjc5IDguNTIzNTIgNDEuMjU0NiA4LjYzMTQzQzQxLjI2MTYgOS4wNjY1NiA0MS4yNjUxIDEwLjA2NjMgNDEuMjIzMyAxMC41ODQzWiIgZmlsbD0idXJsKCNwYWludDZfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMzkuNzcxNyAxMC4zOTYzVjcuNDkzMTNDMzkuNzcxNyA3LjMyNjA0IDM5Ljg1OTQgNy4wMDAyMiA0MC4yMTAzIDcuMDMzNjRDNDAuNTYxMiA3LjA2NzA1IDQwLjYwMzIgNy4zMjYwNCA0MC42MDcxIDcuNDkzMTNDNDAuNjIxMSA4LjA4ODM5IDQwLjY0MDYgOS41MDIzOCA0MC42MDcxIDEwLjM5NjNDNDAuNDgxOCAxMS4zMDQ5IDM5Ljc1MDggMTEuNjIxNiAzOS4zNTQgMTEuNjkxMkMzOC43Mzc4IDExLjc5OTMgMzcuODcyMiAxMS40MTk3IDM3LjcyNDggMTAuNTczOEMzNy40ODQ3IDkuMTk1MzUgMzguNzc5NiA4Ljc0NjMgMzkuMDcyIDguNzc3NjNDMzkuMzAxOCA4Ljc2ODc5IDM5LjM1MDUgOC44OTI1IDM5LjM1NCA4Ljk1NTE2VjkuNjQ0NDFDMzguOTc4IDkuNTM5OTggMzguNDAzNyA5LjgyMTk0IDM4LjU0OTkgMTAuMzk2M0MzOC43Nzk2IDExLjEwNjQgMzkuNjI1NSAxMC45MzkzIDM5Ljc3MTcgMTAuMzk2M1oiIGZpbGw9InVybCgjcGFpbnQ3X2xpbmVhcl8xMDQ0Xzc0OCkiLz4KPGNpcmNsZSBjeD0iMzQuOTYwOSIgY3k9IjMzLjM5ODQiIHI9IjYuMjk2ODgiIHN0cm9rZT0iIzMxNjRFNCIgc3Ryb2tlLXdpZHRoPSI0Ii8+CjxwYXRoIGQ9Ik0zMy44MTQzIDMwLjU2NTJMMzIuNzE1IDMxLjY1MDVDMzIuNjY4MyAzMS42OTY2IDMyLjYzNjUgMzEuNzU1MyAzMi42MjM2IDMxLjgxOTNDMzIuNjEwNyAzMS44ODMyIDMyLjYxNzMgMzEuOTQ5NSAzMi42NDI2IDMyLjAwOThMMzIuNjUzOSAzMi4wMzM2QzMyLjY4MTkgMzIuMDg3NyAzMi43MjQ1IDMyLjEzMyAzMi43NzY5IDMyLjE2NDdDMzIuODI5MyAzMi4xOTYzIDMyLjg4OTYgMzIuMjEzMSAzMi45NTExIDMyLjIxMzFIMzMuMzgyN0wzMy4zODI1IDM0LjYzMTZDMzMuMzgyNSAzNC43MTkgMzMuNDE3NyAzNC44MDI5IDMzLjQ4MDMgMzQuODY0N0MzMy41NDI5IDM0LjkyNjUgMzMuNjI3OCAzNC45NjEyIDMzLjcxNjQgMzQuOTYxMkgzNC4zODRMMzQuNDA5MSAzNC45NjA0QzM0LjQ5MyAzNC45NTQxIDM0LjU3MTUgMzQuOTE2OCAzNC42Mjg4IDM0Ljg1NThDMzQuNjg2MSAzNC43OTQ5IDM0LjcxNzkgMzQuNzE0OCAzNC43MTc5IDM0LjYzMTZWMzIuMjEzMUgzNS4xNDk3QzM1LjIxNTcgMzIuMjEzMSAzNS4yODAyIDMyLjE5MzggMzUuMzM1MSAzMi4xNTc1QzM1LjM5IDMyLjEyMTMgMzUuNDMyOCAzMi4wNjk5IDM1LjQ1OCAzMi4wMDk2QzM1LjQ4MzMgMzEuOTQ5NCAzNS40ODk5IDMxLjg4MzIgMzUuNDc3IDMxLjgxOTNDMzUuNDY0MSAzMS43NTUzIDM1LjQzMjQgMzEuNjk2NiAzNS4zODU3IDMxLjY1MDVMMzQuMjg2NCAzMC41NjUyQzM0LjIyMzggMzAuNTAzNSAzNC4xMzg5IDMwLjQ2ODggMzQuMDUwNCAzMC40Njg4QzMzLjk2MTggMzAuNDY4OCAzMy44NzY5IDMwLjUwMzUgMzMuODE0MyAzMC41NjUyWiIgZmlsbD0iIzMxNjRFNCIvPgo8cGF0aCBkPSJNMzYuNDM3OSAzNi4zNzMyTDM3LjMzNjkgMzUuNDc0M0MzNy4zNzUxIDM1LjQzNjEgMzcuNDAxMSAzNS4zODc1IDM3LjQxMTYgMzUuMzM0NUMzNy40MjIyIDM1LjI4MTUgMzcuNDE2OCAzNS4yMjY2IDM3LjM5NjEgMzUuMTc2N0wzNy4zODY4IDM1LjE1N0MzNy4zNjM5IDM1LjExMjIgMzcuMzI5MSAzNS4wNzQ3IDM3LjI4NjMgMzUuMDQ4NEMzNy4yNDM0IDM1LjAyMjIgMzcuMTk0MSAzNS4wMDgzIDM3LjE0MzkgMzUuMDA4M0gzNi43OTA5TDM2Ljc5MDkgMzMuNTE4NkMzNi43OTA5IDMzLjQ0NjIgMzYuNzYyMSAzMy4zNzY4IDM2LjcxMSAzMy4zMjU2QzM2LjY1OTggMzMuMjc0NCAzNi41OTAzIDMzLjI0NTcgMzYuNTE3OSAzMy4yNDU3SDM1Ljk3MkwzNS45NTE1IDMzLjI0NjNDMzUuODgyOCAzMy4yNTE1IDM1LjgxODYgMzMuMjgyNCAzNS43NzE4IDMzLjMzMjlDMzUuNzI1IDMzLjM4MzQgMzUuNjk5IDMzLjQ0OTggMzUuNjk5IDMzLjUxODZMMzUuNjk5MSAzNS4wMDgzSDM1LjM0NkMzNS4yOTIxIDM1LjAwODMgMzUuMjM5MyAzNS4wMjQ0IDM1LjE5NDQgMzUuMDU0M0MzNS4xNDk1IDM1LjA4NDMgMzUuMTE0NiAzNS4xMjcgMzUuMDkzOSAzNS4xNzY4QzM1LjA3MzIgMzUuMjI2NyAzNS4wNjc4IDM1LjI4MTYgMzUuMDc4NCAzNS4zMzQ1QzM1LjA4ODkgMzUuMzg3NSAzNS4xMTQ5IDM1LjQzNjEgMzUuMTUzMSAzNS40NzQzTDM2LjA1MiAzNi4zNzMyQzM2LjEwMzIgMzYuNDI0NCAzNi4xNzI2IDM2LjQ1MzEgMzYuMjQ1IDM2LjQ1MzFDMzYuMzE3MyAzNi40NTMxIDM2LjM4NjggMzYuNDI0NCAzNi40Mzc5IDM2LjM3MzJaIiBmaWxsPSIjMzE2NEU0Ii8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF8xMDQ0Xzc0OCIgeD0iMjUuOTM3NSIgeT0iLTUuMzEyNSIgd2lkdGg9IjI5LjM3NSIgaGVpZ2h0PSIyOS4zNzUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU1vcnBob2xvZ3kgcmFkaXVzPSIyIiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzEwNDRfNzQ4Ii8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiLz4KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0ib3V0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjguMTMzMiIgeTE9IjE3LjA3MzYiIHgyPSIyNC40MTMxIiB5Mj0iNDEuMjM2NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjxzdG9wIG9mZnNldD0iMC42OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzEwNDRfNzQ4IiB4MT0iNi44MzU5NCIgeTE9IjI0LjE5MDEiIHgyPSIxNy44NTgyIiB5Mj0iMzMuOTQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+CjxzdG9wIG9mZnNldD0iMC43ODUiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAuOCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Ml9saW5lYXJfMTA0NF83NDgiIHgxPSIxOC4wMDE3IiB5MT0iMTMuNTMxIiB4Mj0iMjAuODk1OCIgeTI9IjI4LjU1NzMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agb2Zmc2V0PSIwLjIzNSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgxNS4wOTQ5IDMwLjE1NDMpIHJvdGF0ZSgtMjIuOTg1Nikgc2NhbGUoMTMuMjU5MiAxMS44NzY4KSI+CjxzdG9wIG9mZnNldD0iMC4zOSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIwLjkzIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjQyIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQ0X3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgyMy40OTAyIDEwLjcxNSkgcm90YXRlKDYzLjU3NTEpIHNjYWxlKDMxLjQ2ODEgMjI3LjE3NSkiPgo8c3RvcCBvZmZzZXQ9IjAuNDQ1IiBzdG9wLWNvbG9yPSIjMThCQUE3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjwvcmFkaWFsR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQ1X2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjM3LjY5NTMiIHkxPSI4Ljk5NzM1IiB4Mj0iNDMuNDQxOSIgeTI9IjguOTk3MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzM0QkI3QSIvPgo8c3RvcCBvZmZzZXQ9IjAuMjU1MjA4IiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMxNjRFNCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Nl9saW5lYXJfMTA0NF83NDgiIHgxPSIzNy42OTUzIiB5MT0iOC45OTczNSIgeDI9IjQzLjQ0MTkiIHkyPSI4Ljk5NzM0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMzNEJCN0EiLz4KPHN0b3Agb2Zmc2V0PSIwLjI1NTIwOCIgc3RvcC1jb2xvcj0iIzE4QkFBNyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMTY0RTQiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDdfbGluZWFyXzEwNDRfNzQ4IiB4MT0iMzcuNjk1MyIgeTE9IjguOTk3MzUiIHgyPSI0My40NDE5IiB5Mj0iOC45OTczNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMzRCQjdBIi8+CjxzdG9wIG9mZnNldD0iMC4yNTUyMDgiIHN0b3AtY29sb3I9IiMxOEJBQTciLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzE2NEU0Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTA0NF83NDgiPgo8cmVjdCB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+',
255 25
256 );
257
258 $this->hook_suffix[] = add_submenu_page(
259 $this->token . '-admin-ui',
260 esc_html__('Dashboard', 'media-cloud-sync'),
261 esc_html__('Dashboard', 'media-cloud-sync'),
262 'manage_options',
263 $this->token . '-admin-ui' ,
264 array($this, 'adminUi')
265 );
266
267 if(Utils::is_service_enabled()) {
268 $this->hook_suffix[] = add_submenu_page(
269 $this->token . '-admin-ui',
270 esc_html__('Settings', 'media-cloud-sync'),
271 esc_html__('Settings', 'media-cloud-sync'),
272 'manage_options',
273 $this->token . '-admin-ui#/settings' ,
274 array($this, 'adminUi')
275 );
276 } else {
277 $this->hook_suffix[] = add_submenu_page(
278 $this->token . '-admin-ui',
279 esc_html__('Configure', 'media-cloud-sync'),
280 esc_html__('Configure', 'media-cloud-sync'),
281 'manage_options',
282 $this->token . '-admin-ui#/configure' ,
283 array($this, 'adminUi')
284 );
285 }
286 }
287
288 /**
289 * Calling view function for admin page components
290 */
291 public function adminUi() {
292 echo wp_kses_post(sprintf(
293 '<div id="%s_ui_root">
294 <div class="%s_loader">
295 <h1>%s</h1>
296 <p>%s</p>
297 </div>
298 </div>',
299 $this->token,
300 $this->token,
301 esc_html__('Media Cloud Sync By Dudlewebs','media-cloud-sync'),
302 esc_html__('Plugin is loading Please wait for a while..', 'media-cloud-sync')
303 ));
304
305 }
306
307
308 /**
309 * Load the media assets
310 */
311 public function load_media_assets() {
312 /** CSS */
313 wp_enqueue_style($this->token . '-media', esc_url($this->assets_url) . 'css/media.css', array(), $this->version);
314
315 /** JS */
316 wp_enqueue_script(
317 $this->token . '-media',
318 esc_url($this->assets_url) . 'js/media.js',
319 array(
320 'jquery',
321 'media-views',
322 'media-grid',
323 'wp-util'
324 ),
325 $this->version,
326 true
327 );
328
329 // Localize a script.
330 wp_localize_script(
331 $this->token . '-media',
332 $this->token . '_media_object',
333 array(
334 'file_details_nonce' => wp_create_nonce('get_media_provider_details'),
335 'admin_ajax_url' => admin_url('admin-ajax.php'),
336 'strings' => array(
337 'provider' => esc_html__("Provider: ", "media-cloud-sync"),
338 'region' => esc_html__("Region: ", "media-cloud-sync"),
339 'access' => esc_html__("Access: ", "media-cloud-sync"),
340 'access_private' => esc_html__("Private", "media-cloud-sync"),
341 'access_public' => esc_html__("Public", "media-cloud-sync"),
342 )
343 )
344 );
345 }
346
347
348 /**
349 * Deactivation form
350 * @since 1.0.2
351 */
352 public function wpmcs_deactivation_form() {
353 $currentScreen = get_current_screen();
354 $screenID = $currentScreen->id;
355 if ($screenID == 'plugins') {
356 ?>
357 <div id="dw-wpmcs-survey-form-wrap">
358 <div id="dw-wpmcs-survey-form">
359 <h2>We Value Your Feedback</h2>
360 <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>
361 <form method="POST">
362 <input name="plugin_name" type="hidden" value="<?= $this->token ?>" required>
363 <input name="website" type="hidden" value="<?= get_site_url(); ?>" required>
364 <input name="title" type="hidden" value="<?= get_bloginfo('name'); ?>" required>
365 <input name="version" type="hidden" value="<?= $this->version; ?>" required>
366
367 <div class="dw-wpmcs-reason">
368 <label><input type="radio" name="reason" value="I\'m only deactivating temporarily"> I'm only deactivating temporarily</label>
369 <label><input type="radio" name="reason" value="I no longer need the plugin"> I no longer need the plugin</label>
370 <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>
371 <label><input type="radio" name="reason" value="I found a better plugin"> I found a better plugin</label>
372 <label><input type="radio" name="reason" value="Upgrading to PRO version"> Upgrading to PRO version</label>
373 <label><input type="radio" name="reason" value="Plugin doesn\'t meet my requirements"> Plugin doesn't meet my requirements</label>
374 <label><input type="radio" name="reason" value="Plugin broke my site"> Plugin broke my site</label>
375 <label><input type="radio" name="reason" value="Plugin suddenly stopped working"> Plugin suddenly stopped working</label>
376 <label><input type="radio" name="reason" value="I found a bug"> I found a bug</label>
377 <label><input type="radio" name="reason" value="Other"> Other</label>
378 </div>
379
380 <div class="dw-wpmcs-comments" style="display:none;">
381 <textarea name="comments" placeholder="Please specify" rows="3"></textarea>
382 <p>Need help? <a href="https://dudlewebs.com/" target="_blank">Use live chat support</a></p>
383 </div>
384
385 <p id="dw-wpmcs-error" class="dw-wpmcs-error"></p>
386 <div class="dw-wpmcs-actions">
387 <button type="button" class="dw-button dw-skip" id="dw-wpmcs-skip">Skip & Deactivate</button>
388 <button type="button" class="dw-button dw-secondary" id="dw-wpmcs-cancel">Cancel</button>
389 <button type="submit" class="dw-button dw-primary" id="dw-wpmcs-deactivate">Submit & Deactivate</button>
390 </div>
391 </form>
392 </div>
393 </div>
394 <?php }
395 }
396
397
398
399 /**
400 * Add custom classes to the HTML body tag
401 *
402 * @param string $classes
403 *
404 * @return string
405 */
406 public function admin_body_class( $classes ) {
407 if ( ! $classes ) {
408 $classes = array();
409 } else {
410 $classes = explode( ' ', $classes );
411 }
412 $classes[] = $this->token.'_page';
413 /**
414 * Recommended way to target WP 3.8+
415 * http://make.wordpress.org/ui/2013/11/19/targeting-the-new-dashboard-design-in-a-post-mp6-world/
416 *
417 */
418 if ( version_compare( $GLOBALS['wp_version'], '3.8-alpha', '>' ) ) {
419 if ( ! in_array( 'mp6', $classes ) ) {
420 $classes[] = 'mp6';
421 }
422 }
423 return implode( ' ', $classes );
424 }
425
426
427 /**
428 * Ensures only one instance of Class is loaded or can be loaded.
429 *
430 * @return Main Class instance
431 * @since 1.0.0
432 * @static
433 */
434 public static function instance(){
435 if (is_null(self::$instance)) {
436 self::$instance = new self();
437 }
438 return self::$instance;
439 }
440
441 }