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