get_redux_options(); self::$instance->includes(); self::$instance->hooks(); } return self::$instance; } // Shim since we changed the function name. Deprecated. public static function get_instance() { if ( ! self::$instance ) { self::$instance = new self; self::$instance->get_redux_options(); self::$instance->includes(); self::$instance->hooks(); } return self::$instance; } /** * Get Redux options * * @access public * @since 3.1.3 * @return void */ public function get_redux_options() { // Setup defaults $defaults = array( 'demo' => false, ); // If multisite is enabled if ( is_multisite() ) { // Get network activated plugins $plugins = get_site_option( 'active_sitewide_plugins' ); foreach ( $plugins as $file => $plugin ) { if ( strpos( $file, 'redux-framework.php' ) !== false ) { $this->plugin_network_activated = true; $this->options = get_site_option( 'ReduxFrameworkPlugin', $defaults ); } } } // If options aren't set, grab them now! if ( empty( $this->options ) ) { $this->options = get_option( 'ReduxFrameworkPlugin', $defaults ); } } /** * Include necessary files * * @access public * @since 3.1.3 * @return void */ public function includes() { // Include ReduxCore if ( file_exists( dirname( __FILE__ ) . '/ReduxCore/framework.php' ) ) { require_once( dirname( __FILE__ ) . '/ReduxCore/framework.php' ); } if ( isset( ReduxFramework::$_as_plugin ) ) { ReduxFramework::$_as_plugin = true; } if ( file_exists( dirname( __FILE__ ) . '/ReduxCore/redux-extensions/config.php' ) ) { require_once( dirname( __FILE__ ) . '/ReduxCore/redux-extensions/config.php' ); } // Include demo config, if demo mode is active if ( $this->options['demo'] && file_exists( dirname( __FILE__ ) . '/sample/sample-config.php' ) ) { require_once( dirname( __FILE__ ) . '/sample/sample-config.php' ); } } /** * Run action and filter hooks * * @access private * @since 3.1.3 * @return void */ private function hooks() { add_action( 'wp_loaded', array( $this, 'options_toggle_check' ) ); // Activate plugin when new blog is added add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) ); // Display admin notices add_action( 'admin_notices', array( $this, 'admin_notices' ) ); // Edit plugin metalinks add_filter( 'plugin_row_meta', array( $this, 'plugin_metalinks' ), null, 2 ); add_action( 'activated_plugin', array( $this, 'load_first' ) ); do_action( 'redux/plugin/hooks', $this ); } public function load_first() { $path = str_replace( WP_PLUGIN_DIR . '/', '', __FILE__ ); if ( $plugins = get_option( 'active_plugins' ) ) { if ( $key = array_search( $path, $plugins ) ) { array_splice( $plugins, $key, 1 ); array_unshift( $plugins, $path ); update_option( 'active_plugins', $plugins ); } } } /** * Fired on plugin activation * * @access public * @since 3.0.0 * * @param boolean $network_wide True if plugin is network activated, false otherwise * * @return void */ public static function activate( $network_wide ) { if ( function_exists( 'is_multisite' ) && is_multisite() ) { if ( $network_wide ) { // Get all blog IDs $blog_ids = self::get_blog_ids(); foreach ( $blog_ids as $blog_id ) { switch_to_blog( $blog_id ); self::single_activate(); } restore_current_blog(); } else { self::single_activate(); } } else { self::single_activate(); } delete_site_transient( 'update_plugins' ); } /** * Fired when plugin is deactivated * * @access public * @since 3.0.0 * * @param boolean $network_wide True if plugin is network activated, false otherwise * * @return void */ public static function deactivate( $network_wide ) { if ( function_exists( 'is_multisite' ) && is_multisite() ) { if ( $network_wide ) { // Get all blog IDs $blog_ids = self::get_blog_ids(); foreach ( $blog_ids as $blog_id ) { switch_to_blog( $blog_id ); self::single_deactivate(); } restore_current_blog(); } else { self::single_deactivate(); } } else { self::single_deactivate(); } delete_option( 'ReduxFrameworkPlugin' ); } /** * Fired when a new WPMU site is activated * * @access public * @since 3.0.0 * * @param int $blog_id The ID of the new blog * * @return void */ public function activate_new_site( $blog_id ) { if ( 1 !== did_action( 'wpmu_new_blog' ) ) { return; } switch_to_blog( $blog_id ); self::single_activate(); restore_current_blog(); } /** * Get all IDs of blogs that are not activated, not spam, and not deleted * * @access private * @since 3.0.0 * @global object $wpdb * @return array|false Array of IDs or false if none are found */ private static function get_blog_ids() { global $wpdb; // Get an array of IDs $sql = "SELECT blog_id FROM $wpdb->blogs WHERE archived = '0' AND spam = '0' AND deleted = '0'"; return $wpdb->get_col( $sql ); } /** * Fired for each WPMS blog on plugin activation * * @access private * @since 3.0.0 * @return void */ private static function single_activate() { $notices = get_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', array() ); $notices[] = __( 'Redux Framework has an embedded demo.', 'redux-framework' ) . ' ' . __( 'Click here to activate the sample config file.', 'redux-framework' ) . ''; update_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', $notices ); } /** * Display admin notices * * @access public * @since 3.0.0 * @return void */ public function admin_notices() { do_action( 'ReduxFrameworkPlugin_admin_notice' ); if ( $notices = get_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' ) ) { foreach ( $notices as $notice ) { echo '

' . $notice . '

'; } delete_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' ); } } /** * Fired for each blog when the plugin is deactivated * * @access private * @since 3.0.0 * @return void */ private static function single_deactivate() { delete_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' ); } /** * Turn on or off * * @access public * @since 3.0.0 * @global string $pagenow The current page being displayed * @return void */ public function options_toggle_check() { global $pagenow; if ( $pagenow == 'plugins.php' && is_admin() && ! empty( $_GET['ReduxFrameworkPlugin'] ) ) { $url = './plugins.php'; if ( $_GET['ReduxFrameworkPlugin'] == 'demo' ) { if ( $this->options['demo'] == false ) { $this->options['demo'] = true; } else { $this->options['demo'] = false; } } if ( is_multisite() && is_network_admin() && $this->plugin_network_activated ) { update_site_option( 'ReduxFrameworkPlugin', $this->options ); } else { update_option( 'ReduxFrameworkPlugin', $this->options ); } wp_redirect( $url ); } } /** * Add settings action link to plugins page * * @access public * @since 3.0.0 * @return void */ public function add_action_links( $links ) { // In case we ever want to do this... return $links; /** * return array_merge( * array( 'redux_plugin_settings' => '' . __( 'Settings', 'redux-framework' ) . '' ), * $links * ); */ } /** * Edit plugin metalinks * * @access public * @since 3.0.0 * * @param array $links The current array of links * @param string $file A specific plugin row * * @return array The modified array of links */ public function plugin_metalinks( $links, $file ) { if ( strpos( $file, 'redux-framework.php' ) !== false && is_plugin_active( $file ) ) { $new_links = array( '' . __( 'Repo', 'redux-framework' ) . '', '' . __( 'Generator', 'redux-framework' ) . '', '' . __( 'Issues', 'redux-framework' ) . '', '' . __( 'Documentation', 'redux-framework' ) . '', ); if ( ( is_multisite() && $this->plugin_network_activated ) || ! is_network_admin() || ! is_multisite() ) { if ( $this->options['demo'] ) { $new_links[3] .= '
' . __( 'Deactivate Demo Mode', 'redux-framework' ) . ''; } else { $new_links[3] .= '
' . __( 'Activate Demo Mode', 'redux-framework' ) . ''; } } $links = array_merge( $links, $new_links ); } return $links; } } }