* @license GPL-2.0+ * @link http://example.com * @copyright 2014 Tyler Digital */ /** * Plugin class. This class should ideally be used to work with the * administrative side of the WordPress site. * * If you're interested in introducing public-facing * functionality, then refer to `class-drawattention.php` * * * @package DrawAttention_Admin * @author Nathan Tyler */ if ( !class_exists( 'DrawAttention_Admin' ) ) { class DrawAttention_Admin { /** * Instance of this class. * * @since 1.0.0 * * @var object */ static $instance = null; public $da; public $plugin_slug; /** * Slug of the plugin screen. * * @since 1.0.0 * * @var string */ protected $plugin_screen_hook_suffix = null; /** * Initialize the plugin by loading admin scripts & styles and adding a * settings page and menu. * * @since 1.0.0 */ private function __construct() { /* * @TODO : * * - Uncomment following lines if the admin class should only be available for super admins */ /* if( ! is_super_admin() ) { return; } */ /* * Call $plugin_slug from public plugin class. * * @TODO: * * - Rename "DrawAttention" to the name of your initial plugin class * */ $this->da = DrawAttention::get_instance(); $this->plugin_slug = $this->da->get_plugin_slug(); // Load admin style sheet and JavaScript. add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_styles' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) ); add_action( 'admin_notices', array( $this, 'display_third_party_js_conflict_notice' ) ); add_action( 'admin_notices', array( $this, 'maybe_display_invalid_license_banner' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'store_enqueued_scripts' ), 1 ); add_action( 'admin_enqueue_scripts', array( $this, 'disable_third_party_js' ), 9999999 ); add_action( 'cmb2_save_post_fields', array( $this, 'save_hotspots_json' ), 10, 4 ); add_action( 'current_screen', array( $this, 'load_from_hotspots_json' ) ); add_action( 'admin_init', array( $this, 'upgrade_process' ) ); add_filter( 'gutenberg_can_edit_post_type', array( $this, 'exclude_cpt_from_gutenberg' ), 10, 2 ); add_action('add_meta_boxes', array( $this, 'remove_wp_seo_meta_box' ), 100); add_action('admin_init', array( $this, 'fix_mainwp_conflict' ), 100); } public function exclude_cpt_from_gutenberg( $can_edit, $post_type ) { if ( $post_type == $this->da->cpt->post_type ) { return false; } return $can_edit; } public function remove_wp_seo_meta_box() { remove_meta_box( 'wpseo_meta', $this->da->cpt->post_type, 'normal' ); } public function upgrade_process() { global $wpdb; $current_version = get_option( 'da_version', '0.0.0' ); while ( version_compare( $current_version, DrawAttention::VERSION ) < 0 ) { if ( version_compare( $current_version, '1.8' ) < 0 ) { $sql = $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key=%s", 'meta-box-order_da_image' ); $wpdb->get_results( $sql ); $current_version = '1.8'; continue; } $current_version = DrawAttention::VERSION; } update_option( 'da_version', DrawAttention::VERSION ); } /** * Return an instance of this class. * * @since 1.0.0 * * @return object A single instance of this class. */ public static function get_instance() { /* * @TODO : * * - Uncomment following lines if the admin class should only be available for super admins */ /* if( ! is_super_admin() ) { return; } */ // If the single instance hasn't been set, set it now. if ( null == self::$instance ) { self::$instance = new self; } return self::$instance; } /** * Register and enqueue admin-specific style sheet. * * @TODO: * * - Rename "DrawAttention" to the name your plugin * * @since 1.0.0 * * @return null Return early if no settings page is registered. */ public function enqueue_admin_styles() { $screen = get_current_screen(); if ( $this->da->cpt->post_type==$screen->post_type || $this->plugin_screen_hook_suffix == $screen->id ) { wp_enqueue_style( $this->plugin_slug .'-admin-styles', plugins_url( 'assets/css/admin.css', __FILE__ ), array(), DrawAttention::VERSION ); } } /** * Register and enqueue admin-specific JavaScript. * * @TODO: * * - Rename "DrawAttention" to the name your plugin * * @since 1.0.0 * * @return null Return early if no settings page is registered. */ public function enqueue_admin_scripts() { $screen = get_current_screen(); if ( $this->da->cpt->post_type==$screen->post_type || $this->plugin_screen_hook_suffix == $screen->id ) { wp_register_script( $this->plugin_slug . '-leaflet', plugins_url( 'public/assets/js/leaflet.js', dirname( __FILE__ ) ), array(), DrawAttention::VERSION, $in_footer = true ); wp_register_script( $this->plugin_slug . '-leaflet-draw', plugins_url( 'assets/js/leaflet.draw.js', __FILE__ ), array( $this->plugin_slug . '-leaflet' ), DrawAttention::VERSION ); wp_register_script( $this->plugin_slug . '-admin-script', plugins_url( 'assets/js/admin.js', __FILE__ ), array( 'jquery', 'cmb2-scripts', $this->plugin_slug . '-leaflet-draw' ), DrawAttention::VERSION ); do_action( 'da_register_admin_script' ); wp_localize_script( $this->plugin_slug . '-admin-script', 'hotspotAdminVars', array( 'ajaxURL' => admin_url( 'admin-ajax.php' ), ) ); wp_enqueue_script( $this->plugin_slug . '-admin-script', array(), DrawAttention::VERSION ); } } public function fix_mainwp_conflict() { // MainWP removes the scripts version which breaks our plugin (and many others) when a site has a caching plugin active // MainWP needs to update their code to instead output a hash of the version so it's obfuscated but not removed if (class_exists('\MainWP\Child\MainWP_Security')) { \MainWP\Child\MainWP_Security::update_security_option('scripts_version', false); \MainWP\Child\MainWP_Security::update_security_option('styles_version', false); } } /** * Register the administration menu for this plugin into the WordPress Dashboard menu. * * @since 1.0.0 */ public function add_plugin_admin_menu() { /* * Add a settings page for this plugin to the Settings menu. * * NOTE: Alternative menu locations are available via WordPress administration menu functions. * * Administration Menus: http://codex.wordpress.org/Administration_Menus * * @TODO: * * - Change 'Page Title' to the title of your plugin admin page * - Change 'Menu Text' to the text for menu item for the plugin settings page * - Change 'manage_options' to the capability you see fit * For reference: http://codex.wordpress.org/Roles_and_Capabilities */ $this->plugin_screen_hook_suffix = add_options_page( __( 'DrawAttention', 'draw-attention' ), __( 'DrawAttention', 'draw-attention' ), 'manage_options', $this->plugin_slug, array( $this, 'display_plugin_admin_page' ) ); } /** * Render the settings page for this plugin. * * @since 1.0.0 */ public function display_plugin_admin_page() { if ( class_exists( 'CMB2_hookup' ) ) { CMB2_hookup::enqueue_cmb_css(); CMB2_hookup::enqueue_cmb_js(); } include_once( 'views/admin.php' ); } /** * Add settings action link to the plugins page. * * @since 1.0.0 */ public function add_action_links( $links ) { return array_merge( array( 'settings' => '' . __( 'Settings', 'draw-attention' ) . '' ), $links ); } /** * Prompt unlicensed users to activate/purchase license * Only display the banner in 'All images' and 'Add New' screens * * @since 3.0.5 * */ function maybe_display_invalid_license_banner(){ $current_screen = get_current_screen(); if ( ! in_array( $current_screen->base, array( 'post', 'edit' ) ) ) return; if ( $current_screen->post_type !== 'da_image' ) return; $license_key_status = get_option( 'da_license_key_status' ); if ( ! empty( $license_key_status ) && $license_key_status == 'valid' ) { return; } $license_page = admin_url( 'edit.php?post_type=da_image&page=da_license' ); $store = 'https://wpdrawattention.com'; echo '
'; echo '

' . sprintf( __( 'Your Draw Attention License key is currently inactive or expired. %1$s Enter your license key %2$s or %3$s purchase a new one %4$s to enable automatic updates and support.', 'draw-attention' ), '', '', '', '' ) . '

'; echo '
'; } public function display_third_party_js_conflict_notice() { if ( !empty( $_GET['da_enable_third_party_js'] ) ) { delete_option( 'da_disable_third_party_js' ); } if ( get_option( 'da_disable_third_party_js' ) ) { return; } if ( !empty( $_GET['da_disable_third_party_js'] ) ) { update_option( 'da_disable_third_party_js', true ); $disable_url = add_query_arg( array( 'da_disable_third_party_js' => 1 ) ); $class = "da-disabled-third-party-js updated"; $message = "

3rd party scripts disabled

Draw Attention is currently disabling 3rd party scripts on this page. If you still have trouble using Draw Attention, please contact us at support@wpdrawattention.com

"; echo"
$message
"; } } public function store_enqueued_scripts() { global $pagenow; $screen = get_current_screen(); if ( $screen->base != 'post' || $screen->post_type != $this->da->cpt->post_type ) { return; } global $wp_scripts; $this->script_handle_whitelist = $wp_scripts->queue; } public function disable_third_party_js() { global $pagenow; $screen = get_current_screen(); if ( $screen->base != 'post' || $screen->post_type != $this->da->cpt->post_type ) { return; } if ( get_option( 'da_disable_third_party_js', false ) === false && empty( $_GET['da_disable_third_party_js'] ) ) { return; } $draw_attention_whitelist = array( 'drawattention-admin-script', 'plupload-all', 'dgd_uploaderScript' ); global $wp_scripts; foreach ($wp_scripts->queue as $key => $handle) { if ( in_array( $handle, $this->script_handle_whitelist ) || in_array( $handle, $draw_attention_whitelist ) ) { continue; } wp_dequeue_script( $handle ); } } public function save_hotspots_json( $post_id, $cmb_id, $updated_fields, $cmb_object ) { $post_type = get_post_type( $post_id ); if ( $this->da->cpt->post_type != $post_type || defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } if ( empty( $cmb_object->data_to_save['_da_hotspots'] ) ) { $da_hotspots = array(); } else { $da_hotspots = $cmb_object->data_to_save['_da_hotspots']; } update_post_meta( $post_id, '_da_hotspots_json', json_encode( $da_hotspots ) ); } public function load_from_hotspots_json() { $screen = get_current_screen(); if ( $screen->post_type!=='da_image' || empty( $_GET['action'] ) || $_GET['action'] !== 'edit' ) { return; } if ( empty( $_GET['post'] ) ) { return; } $post_id = $_GET['post']; $deserialized_hotspots = get_post_meta( $post_id, '_da_hotspots', true ); if ( empty( $deserialized_hotspots ) ) { /* Maybe a parse error when deserializing */ $json = get_post_meta( $post_id, '_da_hotspots_json', true ); if ( !empty( $json ) ) { /* Fall back to the JSON values */ update_post_meta( $post_id, '_da_hotspots', json_decode( $json, true ) ); } } } } } else { add_action( 'init', 'da_deactivate_free_version' ); }