plugin_url = self::get_plugin_url(); //plugins_url() . '/' . $this->plugin_name; $this->plugin_path = self::get_plugin_path(); //plugin_dir_path($rootfile); $this->plugin_name = trim(basename($this->plugin_path), '/'); $this->installed_version = get_option(MAXBUTTONS_VERSION_KEY); if ( defined('MAXBUTTONS_DEBUG') && MAXBUTTONS_DEBUG) $this->debug_mode = true; add_action('plugins_loaded', array($this, 'load_textdomain')); add_filter('widget_text', 'do_shortcode'); add_shortcode('maxbutton', array($this, 'shortcode')); add_action("mb-footer", array($this, 'do_footer'),10,3); add_action("wp_footer", array($this, "footer")); // Media buttons add_action('media_buttons', array($this,'media_button')); add_filter('plugin_action_links', array($this, "plugin_action_links"), 10, 2); add_filter('plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2); if( is_admin()) { add_action('admin_enqueue_scripts', array($this,'add_admin_styles')); add_action('admin_enqueue_scripts', array($this,'add_admin_scripts')); add_action('admin_init', array($this,'register_settings' )); add_action('admin_init', array($this, 'do_review_notice')); // Ask for review add_action('admin_init', array('maxInstall','check_database')); add_action('admin_menu', array($this, 'admin_menu')); add_action('admin_footer', array($this, "footer")); add_filter("admin_footer_text",array($this, "admin_footer_text")); // errors in user space. No internal error but user output friendly issues add_action("mb/editor/display_notices", array($this,"display_notices"), 99); add_action("mb/collection/display_notices", array($this,"display_notices"), 99); add_action('mb/header/display_notices', array($this, 'display_notices'), 99); add_action("wp_ajax_getAjaxButtons", array('maxButtonsAdmin', 'getAjaxButtons')); add_action("wp_ajax_set_review_notice_status", array($this, "setReviewNoticeStatus")); // Collection AJAX add_action("wp_ajax_collection-edit", array("maxCollections", "ajax_save")); add_action('wp_ajax_mbpro_collection_block', array("maxCollections", "ajax_action")); // all block level ajax stuff - for logged in users - backend add_action('wp_ajax_mb_button_action', array('maxButtons', "ajax_action")); } // FRONT AJAX add_action('wp_ajax_mbpro_collection_block_front', array("maxCollections", "ajax_action_front")); // front end for all users add_action('wp_ajax_nopriv_mbpro_collection_block_front', array("maxCollections", "ajax_action_front")); // front scripts add_action('wp_enqueue_scripts', array($this, 'front_scripts')); $this->setMainClasses(); // struct for override functionality // The second the blocks are being loaded, check dbase integrity add_action("mb_blockclassesloaded", array($this, "check_database")); // setup page hooks and shortcode add_shortcode('maxcollection', array($this, 'collection_shortcode')); if (! is_admin()) $hook_bool = maxCollections::setupHooks(); // setup the hooks to insert collections self::$instance = $this; maxIntegrations::init(); // fire the integrations. } public static function getInstance() { return self::$instance; } public function setMainClasses() { $classes = array( "button" => "maxButton", "buttons" => "maxButtons", "block" => "maxBlock", "admin" => "maxButtonsAdmin", "install" => "maxInstall", "groups" => "maxGroups", "collections" => "maxCollections", "collection" => "maxCollection", "pack" => "maxPack", ); $this->mainClasses = $classes; } // from block loader action. Checks if all parts of the table are there, or panic if not. public function check_database($blocks) { maxUtils::addTime("Check database"); $sql = "SELECT id,name,status,cache, created "; foreach ($blocks as $block => $class) { $sql .= ", $block"; } $sql .= " from " . maxUtils::get_table_name() . " limit 1"; global $wpdb; $wpdb->hide_errors(); $result = $wpdb->get_results($sql); // check this query for errors. If there is an error, one or more database fields are missing. Fix that. if (isset($wpdb->last_error) && $wpdb->last_error != '') { $install = $this->getClass("install"); $install::create_database_table(); $install::migrate(); } maxUtils::addTime("End check database"); } public function getClass($class) { if (isset($this->mainClasses[$class])) { $load_class = $this->mainClasses[$class]; if (method_exists($load_class,'getInstance')) { return $load_class::getInstance(); } return new $load_class; } } /* Load the plugin textdomain */ public function load_textdomain() { // see: http://geertdedeckere.be/article/loading-wordpress-language-files-the-right-way $domain = 'maxbuttons'; // The "plugin_locale" filter is also used in load_plugin_textdomain() $locale = apply_filters('plugin_locale', get_locale(), $domain); load_textdomain($domain, WP_LANG_DIR.'/maxbuttons/'.$domain.'-'.$locale.'.mo'); $res = load_plugin_textdomain('maxbuttons', false, $this->plugin_name . '/languages/'); } public function register_settings() { register_setting( 'maxbuttons_settings', 'maxbuttons_user_level' ); register_setting( 'maxbuttons_settings', 'maxbuttons_noshowtinymce' ); register_setting( 'maxbuttons_settings', 'maxbuttons_minify' ); register_setting( 'maxbuttons_settings', 'maxbuttons_hidedescription' ); } protected function checkbox_option($options) { if (! isset($options["maxbuttons_minify"])) $options["maxbuttons_minify"] = 0; return $options; } /** Returns the full path of the plugin installation directory */ public static function get_plugin_path() { return plugin_dir_path(MAXBUTTONS_ROOT_FILE); } /** Returns the full URL of the plugin installation path */ public static function get_plugin_url() { $url = plugin_dir_url(MAXBUTTONS_ROOT_FILE); return $url; } /** Returns the current installed version */ public function get_installed_version() { return $this->installed_version; } /** Installs and adds the main menu and the submenu items */ function admin_menu() { $maxbuttons_capabilities = get_option('maxbuttons_user_level'); if(!$maxbuttons_capabilities) { $maxbuttons_capabilities = 'manage_options'; settings_fields( 'maxbuttons_settings' ); update_option('maxbuttons_user_level', $maxbuttons_capabilities); } $admin_pages = array(); $page_title = __('MaxButtons: Buttons', 'maxbuttons'); $menu_title = __('MaxButtons', 'maxbuttons'); $capability = $maxbuttons_capabilities; $admin_capability = 'manage_options'; $menu_slug = 'maxbuttons-controller'; $function = array($this, 'load_admin_page'); $icon_url = $this->plugin_url . 'images/mb-peach-icon.png'; $submenu_function = array($this, 'load_admin_page'); add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url); // We add this submenu page with the same slug as the parent to ensure we don't get duplicates $sub_menu_title = __('Buttons', 'maxbuttons'); $admin_pages[] = add_submenu_page($menu_slug, $page_title, $sub_menu_title, $capability, $menu_slug, $function); // Now add the submenu page for the Add New page $submenu_page_title = __('MaxButtons: Add/Edit Button', 'maxbuttons'); $submenu_title = __('Add New', 'maxbuttons'); $submenu_slug = 'maxbuttons-controller&action=edit'; //$submenu_function = 'maxbuttons_button'; $admin_pages[] = add_submenu_page($menu_slug, $submenu_page_title, $submenu_title, $capability, $submenu_slug, $submenu_function); // Now add the submenu page for the Export page $submenu_page_title = __('MaxButtons: Social Share', 'maxbuttons'); $submenu_title = __('Social Share', 'maxbuttons'); $submenu_slug = 'maxbuttons-collections'; $admin_pages[] = add_submenu_page($menu_slug, $submenu_page_title, $submenu_title, $capability, $submenu_slug, $submenu_function); // Now add the submenu page for the Go Pro page $submenu_page_title = __('MaxButtons: Upgrade to Pro', 'maxbuttons'); $submenu_title = __('Upgrade to Pro', 'maxbuttons'); $submenu_slug = 'maxbuttons-pro'; //$submenu_function = 'maxbuttons_pro'; $admin_pages[] = add_submenu_page($menu_slug, $submenu_page_title, $submenu_title, $capability, $submenu_slug, $submenu_function); // Now add the submenu page for the Settings page $submenu_page_title = __('MaxButtons: Settings', 'maxbuttons'); $submenu_title = __('Settings', 'maxbuttons'); $submenu_slug = 'maxbuttons-settings'; //$submenu_function = 'maxbuttons_settings'; $admin_pages[] = add_submenu_page($menu_slug, $submenu_page_title, $submenu_title, $admin_capability, $submenu_slug, $submenu_function); // Now add the submenu page for the Support page $submenu_page_title = __('MaxButtons: Support', 'maxbuttons'); $submenu_title = __('Support', 'maxbuttons'); $submenu_slug = 'maxbuttons-support'; //$submenu_function = 'maxbuttons_support'; $admin_pages[] = add_submenu_page($menu_slug, $submenu_page_title, $submenu_title, $admin_capability, $submenu_slug, $submenu_function); } function load_admin_page($page) { $page = sanitize_text_field($_GET["page"]); switch($page) { case "maxbuttons-button": $pagepath = "includes/maxbuttons-button.php"; break; case "maxbuttons-support": $pagepath = "includes/maxbuttons-support.php"; break; case "maxbuttons-settings": $pagepath = "includes/maxbuttons-settings.php"; break; case "maxbuttons-pro": $pagepath = "includes/maxbuttons-pro.php"; break; case "maxbuttons-collections": $pagepath = "includes/maxbuttons-collections.php"; break; default: $pagepath = "includes/maxbuttons-controller.php"; break; } $pagepath = $this->plugin_path . $pagepath; include(apply_filters("mb-load-admin-page-$page", $pagepath)); } function add_admin_styles($hook) { // only hook in maxbuttons realm. if ( strpos($hook,'maxbuttons') === false && $hook != 'post.php' && $hook != 'post-new.php' ) { if (! isset($_GET['fl_builder'])) // exception for beaver builder return; } $fa_url = apply_filters("mb_fa_url", $this->plugin_url . 'assets/libraries/font-awesome/css/font-awesome.min.css'); if ($fa_url != false && $fa_url != '') { wp_register_style('mbpro-font-awesome', $fa_url ); wp_enqueue_style('mbpro-font-awesome'); } wp_enqueue_style('wp-color-picker'); wp_enqueue_style('maxbuttons-css', $this->plugin_url . 'assets/css/style.css'); } /** Add Admin scripts * * Uses WP hook for Admin scripts to add needed js. */ function add_admin_scripts($hook) { // only hook in maxbuttons realm. if ( strpos($hook,'maxbuttons') === false ) //&& $hook != 'post.php' && $hook != 'post-new.php' return; $version = MAXBUTTONS_VERSION_NUM; $js_url = trailingslashit($this->plugin_url . 'js'); if (! $this->debug_mode) $js_url .= 'min/'; wp_enqueue_script('jquery-ui-draggable'); //wp_enqueue_script('maxbuttons-colorpicker-js', $js_url .'colpick.js', array('jquery'), $version, true); wp_enqueue_script('maxbutton-admin', $js_url . 'maxbuttons-admin.js', array('jquery', 'jquery-ui-draggable', 'maxbuttons-tabs','maxbuttons-modal', 'wp-color-picker', 'underscore'),$version, true); wp_enqueue_script('maxbutton-js-init', $js_url . 'init.js', array('maxbutton-admin','maxcollections','maxbuttons-modal'),$version, true); wp_enqueue_script('maxbuttons-tabs', $js_url . 'maxtabs.js', array('jquery'),$version, true); wp_enqueue_script('maxbuttons-responsive', $js_url . 'responsive.js', array('maxbutton-admin'), $version, true ); wp_register_script('maxcollections', $js_url . 'maxcollections.js', array('jquery', 'maxbutton-admin', 'jquery-ui-sortable'),$version, true ); $local = array(); $local["ajaxurl"] = admin_url( 'admin-ajax.php' ); $local["maxurl"] = $this->plugin_url; wp_localize_script('maxbutton-admin', 'mb_ajax', $local); $local = array( "leave_page" => __("You have unsaved data, are you sure you want to leave the page?","maxbuttons"), 'picker_title' => __('Select your buttons','maxbuttons'), ); wp_localize_script('maxcollections', 'maxcol_wp', $local); $this->load_modal_script(); wp_enqueue_script('maxcollections'); } /** Load the Modal Script * The modal script is the generic solution for all popups within the plugin. */ public function load_modal_script() { $version = MAXBUTTONS_VERSION_NUM; $js_url = trailingslashit($this->plugin_url . 'js'); if (! $this->debug_mode) $js_url .= 'min/'; wp_register_script('maxbuttons-modal', $js_url . 'maxmodal.js', array('jquery','jquery-ui-draggable'), $version, true); // translations of controls and other elements that can be used in maxmodal $translations = array( 'yes' => __("Yes","maxbuttons"), 'no' => __("No","maxbuttons"), 'ok' => __("OK","maxbuttons"), 'cancel' => __("Cancel","maxbuttons"), ); wp_localize_script('maxbuttons-modal', 'modaltext', $translations); wp_enqueue_script('maxbuttons-modal'); } /** Load Media Buttons Script Useful for integrations that don't implement the media button but uses the media button JS for loading the button picker */ public function load_media_script() { $version = MAXBUTTONS_VERSION_NUM; $js_url = trailingslashit($this->plugin_url . 'js'); if (! $this->debug_mode) $js_url .= 'min/'; $fa_url = apply_filters("mb_fa_url", $this->plugin_url . 'assets/libraries/font-awesome/css/font-awesome.min.css'); if ($fa_url != false && $fa_url != '') { wp_register_style('mbpro-font-awesome', $fa_url); wp_enqueue_style('mbpro-font-awesome'); } wp_enqueue_script('mb-media-button', $js_url . 'maxbuttons_media_button.js', array('jquery', 'maxbuttons-modal'), $version, true); $this->load_modal_script(); $translations = array( 'insert' => __('Insert Button into Editor', 'maxbuttons'), 'loading' => __("Loading your buttons","maxbuttons"), 'select' => __('Click on a button from the list below to place the button shortcode in the editor.', 'maxbuttons'), 'cancel' => __('Cancel', 'maxbuttons'), 'windowtitle' => __("Select a MaxButton","maxbuttons"), 'icon' => $this->plugin_url . 'images/mb-peach-32.png', 'ajax_url' => admin_url( 'admin-ajax.php' ), ); wp_localize_script('mb-media-button','mbtrans', $translations); } /** Load Media Button in WP editor * * The 'add button' interface in WP post and page editor to simplify adding buttons. Loads button plus required Javascript. */ function media_button($editor_id) { $output = ''; // options if (get_option('maxbuttons_noshowtinymce') == 1) return; $this->load_media_script(); // Only run in post/page creation and edit screens $title = __('Add Button', 'maxbuttons'); $icon = $this->plugin_url . 'images/mb-peach-icon.png'; $img = ''; $output = '' . $img . ' ' . $title . ''; echo $output; } /** Scripts run on front-end Load font-awesome, and limited javascript for the front-end. This is being kept extremely limited for performance reasons. */ public function front_scripts() { $fa_url = apply_filters("mb_fa_url", $this->plugin_url . 'assets/libraries/font-awesome/css/font-awesome.min.css'); if ($fa_url != false && $fa_url != '') { wp_register_style('mbpro-font-awesome', $fa_url); wp_enqueue_style('mbpro-font-awesome'); } // load backend script on front in Beaver Builder if (isset($_GET['fl_builder'])) { $this->add_admin_styles('maxbuttons'); } wp_enqueue_script('maxbuttons-front', $this->plugin_url . 'js/min/front.js', array('jquery'), true); $local = array(); $local["ajaxurl"] = admin_url( 'admin-ajax.php' ); wp_localize_script('maxbuttons-front', 'mb_ajax', $local); } /** Extra text to display in admin footer */ function admin_footer_text($text) { if (! isset($_GET["page"])) return $text; if ( strpos($_GET["page"],'maxbuttons') === false) return $text; $text = ''; $text .= sprintf("If you like MaxButtons please give us a %s★★★★★%s rating!", "", "") ; return $text; } function shortcode($atts) { $button = $this->getClass("button"); return $button->shortcode($atts); } public function collection_shortcode($atts, $content = null) { $atts = shortcode_atts(array( "id" => 0, "name" => '', "nocache" => false, // these are button options. "mode" => "normal", "style" => "footer", ), $atts); $id = intval($atts["id"]); $name = sanitize_text_field($atts["name"]); if ($id > 0) $collection = maxCollections::getCollectionByID($id); elseif ($atts["name"] != '') $collection = maxCollections::getCollectionByName($name); if ($collection) return $collection->shortcode($atts,$content); } function plugin_action_links($links, $file) { if ($file == plugin_basename(dirname(MAXBUTTONS_ROOT_FILE) . '/maxbuttons.php')) { $label = __('Buttons', 'maxbuttons'); $dashboard_link = '' . $label . ''; array_unshift($links, $dashboard_link); } return $links; } function plugin_row_meta($links, $file) { if ($file == plugin_basename(dirname(__FILE__) . '/maxbuttons.php')) { $links[] = sprintf(__('%sUpgrade to Pro Version%s', 'maxbuttons'), '', ''); } return $links; } function do_footer($id, $code, $type = "css") { $this->footer[$type][$id] = $code; } function footer() { if(count($this->footer) == 0) return; // nothing foreach ($this->footer as $type => $part) { // add tag if ($type == 'css') { echo "\n"; } } } public function do_review_notice () { $current_user_id = get_current_user_id(); $review = get_user_meta( $current_user_id, 'maxbuttons_review_notice' , true ); if ($review == '') { //$created = get_option("MBFREE_CREATED"); $show = time() + (7* DAY_IN_SECONDS); update_user_meta($current_user_id, 'maxbuttons_review_notice', $show); return; } $display_review = false; if ($review == 'off') { return; // no show } elseif (is_numeric($review)) { $now = time(); if ($now > $review) { $display_review = true; } } // load style / script. It's seperated since it should show everywhere in admin. if ($display_review) { add_action( 'admin_notices', array('maxAdmin', 'mb_review_notice')); wp_enqueue_style('maxbuttons-review-notice', $this->plugin_url . 'assets/css/review_notice.css'); wp_enqueue_script('maxbuttons-review-notice', $this->plugin_url . 'js/min/review-notice.js', array('jquery'), true); $local = array(); $local["ajaxurl"] = admin_url( 'admin-ajax.php' ); wp_localize_script('maxbuttons-review-notice', 'mb_ajax_review', $local); } } public function setReviewNoticeStatus() { $status = isset($_POST["status"]) ? sanitize_text_field($_POST["status"]) : ''; $current_user_id = get_current_user_id(); $updated = false; if ($status == 'off') { $updated = true; update_user_meta($current_user_id, 'maxbuttons_review_notice', 'off'); } if ($status == 'later') { $updated = true; $later = time() + (14 * DAY_IN_SECONDS ); update_user_meta($current_user_id, 'maxbuttons_review_notice', $later); } if ($status == 'reviewoffer-dismiss') // different ad! { $updated = true; update_user_meta($current_user_id, 'maxbuttons_review_offer', 'off'); } echo json_encode(array("updated" => $updated)) ; exit(); } /* Add a notice The added notice will be displayed to the user in WordPress format. @see display_notices @param $type string message | notice | error | fatal @param $message string User understandable message */ public static function add_notice($type, $message) { self::$notices[] = array("type" => $type, "message" => $message ); } /* Display all notices Then notices added by @see add_notice will be displayed. This function is called by an action hook @param $echo echo the results or silently return. @return string|null If not written to screen via echo, the HTML output will be returned */ public function display_notices($echo = true) { if ($echo === '') $echo = true; $notices = self::$notices; $output = ''; if (count($notices) == 0) return; foreach($notices as $index => $notice) { $type = $notice["type"]; $message = $notice["message"]; $output .= "
"; $output .= $message ; $output .= "
"; } self::$notices = array(); // empty notices to prevent double display if ($echo) echo $output; else return $output; } } // class