define_constants();
$this->init_general_part();
if ( $this->is_theme_panel() || wp_doing_ajax() ) {
$this->init();
}
add_action( 'wp_ajax_oceanwp_cp_fonts_clear', array( $this, 'clear_fonts' ) );
add_filter( 'oceanwp_theme_panel_panel_top_header', array( $this, 'panel_top_header' ) );
add_filter( 'oceanwp_tp_sidebar_warnings', array( $this, 'maybe_has_plugin_updates_warning' ) );
add_filter( 'oceanwp_theme_panel_sections', array( $this, 'control_theme_panel_sections' ), 9 );
}
/**
* Define constants.
*
* @since 1.0.0
*/
public function define_constants() {
if ( ! defined( 'OCEANWP_THEME_PANEL_DIR' ) ) {
define( 'OCEANWP_THEME_PANEL_DIR', OCEANWP_THEME_DIR . '/inc/themepanel' );
}
if ( ! defined( 'OCEANWP_THEME_PANEL_URI' ) ) {
define( 'OCEANWP_THEME_PANEL_URI', OCEANWP_THEME_URI . '/inc/themepanel' );
}
}
/**
* Safely define a constant.
*
* @since 1.0.4
*
* @param string $name Constant name.
* @param mixed $value Define value.
*/
public function define( $name, $value ) {
if ( ! defined( $name ) ) {
define( $name, $value );
}
}
/**
* Init control panel.
*
* Only init the control panel when the visiting page is control panel or currently doing ajax.
*
* @since 1.0.0
*/
public function init() {
require_once OCEANWP_THEME_PANEL_DIR . '/includes/js-messages.php';
require_once OCEANWP_THEME_PANEL_DIR . '/includes/plugins-compatibility.php';
require_once OCEANWP_THEME_PANEL_DIR . '/includes/classes/class-helpers.php';
/**
* Hook for control panel init.
*
* @since 1.3.0
*/
do_action( 'oceanwp_theme_panel_init' );
add_action( 'wp_ajax_oceanwp_cp_load_pane_action', array( $this, 'load_theme_panel_pane' ) );
add_action( 'wp_ajax_oceanwp_cp_load_sidebar_warnings_action', array( $this, 'load_sidebar_warnings' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
}
/**
* Init code on full dashboard part
*/
function init_general_part() {
add_action( 'wp_ajax_oceanwp_cp_load_awaiting_mods_action', array( $this, 'load_awaiting_mods' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) );
}
/**
* Check if its control panel is currently viewing page.
*
* @since 1.0.0
*
* @return boolean Test currently viewing page.
*/
public function is_theme_panel() {
return (bool) isset( $_GET['page'] ) && $_GET['page'] === 'oceanwp';
}
/**
* Load control panel styles and scripts.
*/
public function enqueue_assets() {
// Google Fonts.
wp_enqueue_style( 'oceanwp-tp-googlefonts', 'https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap', array(), null );
// Enqueue styles.
wp_enqueue_style( 'oceanwp-new-theme-panel', OCEANWP_THEME_PANEL_URI . '/assets/css/theme-panel.min.css', array(), OCEANWP_THEME_VERSION );
// Enqueue scripts.
wp_enqueue_script( 'oceanwp-changelog-markdown', OCEANWP_THEME_PANEL_URI . '/assets/js/marked.min.js', array(), OCEANWP_THEME_VERSION, true );
wp_enqueue_script( 'oceanwp-new-theme-panel', OCEANWP_THEME_PANEL_URI . '/assets/js/theme-panel.min.js', array( 'jquery', 'wp-util', 'updates' ), OCEANWP_THEME_VERSION, true );
// Localize scripts.
$sections = $this->get_sections();
// Get initial section.
$initial_section = reset( $sections );
if ( $initial_section ) {
$initial_section = $initial_section['href'];
}
wp_localize_script( 'oceanwp-new-theme-panel', 'oceanwp_cp_textdomain', oceanwp_adminpanel_textdomain() );
wp_localize_script(
'oceanwp-new-theme-panel',
'oceanwpThemePanel',
array(
'initialSection' => $initial_section,
'nonce' => wp_create_nonce( 'oceanwp_theme_panel' ),
)
);
}
function enqueue_admin_assets() {
wp_enqueue_script( 'oceanwp-admin-theme-panel', OCEANWP_THEME_PANEL_URI . '/assets/js/admin.js', array( 'jquery', 'wp-util' ), OCEANWP_THEME_VERSION, true );
}
/**
* Load the pane by the slug name.
*
* This function is called via admin-ajax.php.
*/
public function load_theme_panel_pane() {
$slug = esc_attr( $_POST['slug'] );
ob_start();
$this->print_pane( $slug );
$pane_html = ob_get_clean();
$pane_html = '
' . $pane_html;
wp_send_json_success( $pane_html );
wp_die();
}
/**
* Load Sidebar Warnings.
*
* @return void
*/
public function load_sidebar_warnings() {
$warnings = array();
if( ! empty( get_theme_update_available( wp_get_theme() ) ) ) {
$warnings['home'] = __( 'New theme version is available', 'oceanwp' );
}
$warnings = apply_filters( 'oceanwp_tp_sidebar_warnings', $warnings );
if ( empty( $warnings ) ) {
wp_send_json_error();
} else {
$warning_icon_text = esc_attr__( 'Warning icon', 'oceanwp' );
$warnings = array_map(
function( $message ) use ( $warning_icon_text ) {
return '';
},
$warnings
);
wp_send_json_success( $warnings );
}
}
/**
* Load Awaiting Modifications.
*
* @return void
*/
public function load_awaiting_mods() {
$warnings = array();
if( ! empty( get_theme_update_available( wp_get_theme() ) ) ) {
$warnings['home'] = __( 'New theme version is available', 'oceanwp' );
}
$warnings = apply_filters( 'oceanwp_tp_sidebar_warnings', $warnings );
if ( empty( $warnings ) ) {
wp_send_json_error();
} else {
wp_send_json_success( [
'count' => count( $warnings )
] );
}
}
/**
* Maybe has plugin updates warning.
*
* @param mixed $warnings
* @return void
*/
public function maybe_has_plugin_updates_warning( $warnings ) {
$has_updates = false;
$recommended_plugins = oceanwp_recommended_plugins();
$pro_plugins = oceanwp_pro_plugins();
$sidebar_plugins = oceanwp_sidebar_plugins();
$plugins_compatibility_versions = oceanwp_plugins_compatibility();
foreach ( $recommended_plugins as $recommended_plugin_slug => $recommended_plugin_data ) {
$real_plugin_path = oceanwp_theme_panel()->find_plugin_path( $recommended_plugin_slug );
$is_installed = oceanwp_theme_panel()->check_plugin_installed( $real_plugin_path );
if ( $is_installed ) {
$current_plugin_version = oceanwp_theme_panel()->get_current_plugin_version( $real_plugin_path );
if ( ! empty( $current_plugin_version ) && ! empty( $plugins_compatibility_versions[ $recommended_plugin_slug ] ) && version_compare( $current_plugin_version, $plugins_compatibility_versions[ $recommended_plugin_slug ], '<' ) ) {
$has_updates = true;
}
}
}
foreach ( $pro_plugins as $pro_plugin_slug => $pro_plugin_data ) {
$real_plugin_path = oceanwp_theme_panel()->find_plugin_path( $pro_plugin_slug );
$is_installed = oceanwp_theme_panel()->check_plugin_installed( $real_plugin_path );
if ( $is_installed ) {
$current_plugin_version = oceanwp_theme_panel()->get_current_plugin_version( $real_plugin_path );
if ( ! empty( $current_plugin_version ) && ! empty( $plugins_compatibility_versions[ $pro_plugin_slug ] ) && version_compare( $current_plugin_version, $plugins_compatibility_versions[ $pro_plugin_slug ], '<' ) ) {
$has_updates = true;
}
}
}
foreach ( $sidebar_plugins as $sidebar_plugin_slug ) {
$real_plugin_path = oceanwp_theme_panel()->find_plugin_path( $sidebar_plugin_slug );
$is_installed = oceanwp_theme_panel()->check_plugin_installed( $real_plugin_path );
if ( $sidebar_plugin_slug == 'ocean-elementor-widgets' || $sidebar_plugin_slug == 'ocean-gutenberg-blocks' || $sidebar_plugin_slug == 'ocean-white-label' ) {
$is_activated = false;
$method_name = str_replace('-','_', $sidebar_plugin_slug) . '_activated';
if( $is_installed && method_exists( 'OceanWP_Theme_Panel', $method_name ) ) {
$is_activated = $this->$method_name();
}
if ( ! $is_installed || ! $is_activated || ! $this->extra_installed() ) {
continue;
}
}
if ( $is_installed ) {
$current_plugin_version = oceanwp_theme_panel()->get_current_plugin_version( $real_plugin_path );
if ( ! empty( $current_plugin_version ) && ! empty( $plugins_compatibility_versions[ $sidebar_plugin_slug ] ) && version_compare( $current_plugin_version, $plugins_compatibility_versions[ $sidebar_plugin_slug ], '<' ) ) {
if ( $sidebar_plugin_slug == 'ocean-elementor-widgets' ) {
$warnings['elementor-widgets'] = __( 'You should update plugin Ocean Elementor Widgets to use new features', 'oceanwp' );
}
if ( $sidebar_plugin_slug == 'ocean-gutenberg-blocks' ) {
$warnings['gutenberg-blocks'] = __( 'You should update plugin Ocean Gutenberg Blocks to use new features', 'oceanwp' );
}
if ( $sidebar_plugin_slug == 'ocean-white-label' ) {
$warnings['white-label'] = __( 'You should update plugin Ocean White Label to use new features', 'oceanwp' );
}
}
}
}
if ( $has_updates ) {
$warnings['useful-plugins'] = __( 'Available new versions some plugins', 'oceanwp' );
}
return $warnings;
}
/**
* Print pane HTML by slug.
*
* @param string $slug Pane ID.
*/
public function print_pane( $slug = '' ) {
$sections = $this->get_sections();
$default = reset( $sections );
if ( empty( $slug ) ) {
$slug = $default['href'];
}
$file = OCEANWP_THEME_PANEL_DIR . "/views/panes/{$slug}.php";
// String pattern replace.
$slug = str_replace( '-', '_', $slug );
// Get file location.
$file = apply_filters( "oceanwp_theme_panel_pane_{$slug}", $file );
if ( file_exists( $file ) ) {
include_once $file;
return;
}
}
/**
* Panel Plugin Upgrade Message.
*
* @param mixed $plugin_slug
* @return void
*/
public function panel_plugin_upgrade_message( $plugin_slug ) {
$real_plugin_path = oceanwp_theme_panel()->find_plugin_path( $plugin_slug );
$is_installed = oceanwp_theme_panel()->check_plugin_installed( $real_plugin_path );
$is_activated = false;
$method_name = str_replace('-','_', $plugin_slug) . '_activated';
if( $is_installed && method_exists( 'OceanWP_Theme_Panel', $method_name ) ) {
$is_activated = $this->$method_name();
}
$plugins_compatibility_versions = oceanwp_plugins_compatibility();
if ( $is_installed && $is_activated && $this->extra_installed() ) {
$current_plugin_version = oceanwp_theme_panel()->get_current_plugin_version( $real_plugin_path );
if ( ! empty( $current_plugin_version ) && ! empty( $plugins_compatibility_versions[ $plugin_slug ] ) && version_compare( $current_plugin_version, $plugins_compatibility_versions[ $plugin_slug ], '<' ) ) {
$file = OCEANWP_THEME_PANEL_DIR . '/views/panes/plugin-upgrade-info.php';
if ( file_exists( $file ) ) {
$panel_args = array(
'plugin_name' => $this->get_current_plugin_name( $real_plugin_path ),
);
include_once $file;
return;
}
}
}
}
/**
* Get registered sections.
*
* @return array Registered sections.
*/
public function get_sections() {
$sections = array(
'home' => array(
'title' => __( 'Home', 'oceanwp' ),
'href' => 'home',
'order' => 10,
),
'customizer' => array(
'title' => __( 'Customizer', 'oceanwp' ),
'href' => 'customizer',
'order' => 20,
),
'install-demos' => array(
'title' => __( 'Install Demos', 'oceanwp' ),
'href' => 'install-demos',
'order' => 30,
),
'ocean-images' => array(
'title' => __( 'Ocean Images', 'oceanwp' ),
'href' => 'ocean-images',
'order' => 40,
),
'integration' => array(
'title' => __( 'Integration', 'oceanwp' ),
'href' => 'integration',
'order' => 50,
),
'useful-plugins' => array(
'title' => __( 'Useful Plugins', 'oceanwp' ),
'href' => 'useful-plugins',
'order' => 60,
),
'changelog' => array(
'title' => __( 'Changelog', 'oceanwp' ),
'href' => 'changelog',
'order' => 70,
),
'free_vs_pro' => array(
'title' => __( 'Free vs Pro', 'oceanwp' ),
'href' => 'free-vs-pro',
'order' => 80,
),
'elementor-widgets' => array(
'title' => __( 'Elementor Widgets', 'oceanwp' ),
'href' => 'elementor-widgets',
'order' => 90,
),
'elementor-library' => array(
'title' => __( 'Elementor Library', 'oceanwp' ),
'href' => 'elementor-library',
'order' => 91,
),
'gutenberg-blocks' => array(
'title' => __( 'Gutenberg Blocks', 'oceanwp' ),
'href' => 'gutenberg-blocks',
'order' => 100,
),
'extra-settings' => array(
'title' => __( 'Extra Settings', 'oceanwp' ),
'href' => 'extra-settings',
'order' => 110,
),
'admin-settings' => array(
'title' => __( 'Admin Settings', 'oceanwp' ),
'href' => 'admin-settings',
'order' => 111,
),
'white-label' => array(
'title' => __( 'White Label', 'oceanwp' ),
'href' => 'white-label',
'order' => 115,
),
'system-info' => array(
'title' => __( 'System Info', 'oceanwp' ),
'href' => 'system-info',
'order' => 120,
),
'help' => array(
'title' => __( 'Help', 'oceanwp' ),
'href' => 'help',
'order' => 130,
),
);
$sections = apply_filters( 'oceanwp_theme_panel_sections', $sections );
// Sort based on orders.
uasort(
$sections,
function( $first, $second ) {
return $first['order'] <=> $second['order'];
}
);
return $sections;
}
/**
* Theme Panel Sections
*
* @param mixed $sections
* @return void
*/
public function control_theme_panel_sections( $sections ) {
$white_label_need_hide = get_option( 'oceanwp_hide_box', false );
if( $white_label_need_hide && isset( $sections['white-label'] ) ) {
unset( $sections['white-label'] );
}
$changelog_need_hide = get_option( 'oceanwp_hide_changelog', false );
if( $changelog_need_hide && isset( $sections['changelog'] ) ) {
unset( $sections['changelog'] );
}
$help_section_need_hide = get_option( 'oceanwp_hide_help_section', false );
if( $help_section_need_hide && isset( $sections['help'] ) ) {
unset( $sections['help'] );
}
$need_to_upgrade = $this->need_to_upgrade();
if( ! $need_to_upgrade && isset( $sections['free_vs_pro'] ) ) {
unset( $sections['free_vs_pro'] );
}
return $sections;
}
/**
* Include Panel Top Header
*
* @return $string
*/
public function panel_top_header() {
return OCEANWP_THEME_DIR . '/inc/themepanel/views/layout/top-bar.php';
}
/**
* Banner upgrade link
*
* @return $string
*/
public function banner_upgrade_link() {
return 'https://oceanwp.org/core-extensions-bundle/';
}
/**
* Install Ocean Extra Proposal
*
* @return $string
*/
public function please_install_oe_text_link() {
return sprintf(
esc_html__( '%1$sInstall free Ocean Extra recommended plugin%2$s to unlock this feature.', 'oceanwp' ),
'',
''
);
}
/**
* Upgrade to plans Proposal
*
* @return $string
*/
public function upgrade_bundle_plan_text_link() {
return sprintf(
esc_html__( '%1$sUpgrade to the Business or Agency Ocean Core Extensions Bundle plans%2$s to unlock this feature.', 'oceanwp' ),
'',
''
);
}
/**
* Upgrade to Ocean Core Extensions Bundle
*
* @return $string
*/
public function upgrade_core_extensions_bundle_text_link() {
return sprintf(
esc_html__( '%1$sUpgrade to the Ocean Core Extensions Bundle%2$s to unlock this feature.', 'oceanwp' ),
'',
''
);
}
/**
* Install Ocean Extra and Upgrade to Ocean Core Extensions Bundle
*
* @return $string
*/
public function install_oe_upgrade_core_extensions_bundle_text_link() {
return sprintf(
esc_html__( '%1$s or %2$s', 'oceanwp' ),
sprintf(
'%s',
'https://youtu.be/kqHNgUPWMTY',
esc_html__( 'Install free Ocean Extra recommended plugin', 'oceanwp' )
),
sprintf(
'%s',
'https://oceanwp.org/core-extensions-bundle/',
esc_html__( 'upgrade to the Ocean Core Extensions Bundle', 'oceanwp' )
)
);
}
/**
* Check if Ocean Extra plugin is active.
*
* @return bool
*/
public function extra_installed() {
$retval = class_exists( 'Ocean_Extra' );
return $retval;
}
public function ocean_elementor_widgets_activated() {
$retval = class_exists( 'Ocean_Elementor_Widgets' );
return $retval;
}
public function ocean_gutenberg_blocks_activated() {
$retval = class_exists( 'Ocean_Gutenberg_Blocks' );
return $retval;
}
public function ocean_pro_demos_activated() {
$retval = class_exists( 'Ocean_Pro_Demos' );
return $retval;
}
public function ocean_white_label_activated() {
$retval = class_exists( 'Ocean_White_Label' );
return $retval;
}
/**
* Check AJAX Access.
*
* @param mixed $nonce_value
* @param mixed $nonce_action
* @param mixed $response_type
* @return void
*/
public static function check_ajax_access( $nonce_value, $nonce_action, $response_type = 'json' ) {
$response_message = '';
if ( empty( $nonce_value ) || ! wp_verify_nonce( $nonce_value, $nonce_action ) ) {
$response_message = esc_html__( 'Something went wrong', 'oceanwp' );
}
if ( ! current_user_can( 'administrator' ) ) {
$response_message = esc_html__( 'You do not have sufficient privileges for this action.', 'oceanwp' );
}
if ( ! empty( $response_message ) ) {
if ( $response_type == 'json' ) {
wp_send_json_error( array( 'message' => $response_message ) );
} else {
http_response_code( 404 );
echo $response_message;
die;
}
}
}
/**
* Check if user need to upgrade.
*
* @return bool
*/
public function need_to_upgrade() {
global $owp_fs;
if ( ! empty( $owp_fs ) ) {
$retval = $owp_fs->is_pricing_page_visible();
} else {
$retval = false;
}
if ( ! $this->extra_installed() ) {
$retval = true;
}
return $retval;
}
/**
* Get WP plugins information from WP.org API.
*
* @param string $slugs Plugin slugs.
*/
public function get_wp_plugins_info( $slugs = array() ) {
if ( empty( $slugs ) ) {
return array();
}
$wp_api = add_query_arg(
array(
'action' => 'plugin_information',
'request' => array(
'slugs' => $slugs,
'fields' => array(
'icons',
'short_description',
),
),
),
'https://api.wordpress.org/plugins/info/1.2'
);
$plugins_info = json_decode( wp_remote_retrieve_body( wp_remote_get( $wp_api ) ), true );
if ( isset( $plugins_info['error'] ) || empty( $plugins_info ) ) {
return array();
}
return $plugins_info;
}
/**
* Get plugin basename by plugin slug.
* Works only for installed plugins.
*
* @param string $plugin_slug
*/
public function find_plugin_path( $plugin_slug = '' ) {
$plugins = get_plugins();
foreach ( $plugins as $plugin_address => $plugin_data ) {
// Extract slug from address
if ( strlen( $plugin_address ) == basename( $plugin_address ) ) {
$slug = strtolower( str_replace( '.php', '', $plugin_address ) );
} else {
$slug = strtolower( str_replace( '/' . basename( $plugin_address ), '', $plugin_address ) );
}
// Check if slug exists
if ( strtolower( $plugin_slug ) == $slug ) {
return $plugin_address;
}
}
return false;
}
/**
* Check if Plugin is installed.
*
* @param mixed $plugin_slug
* @return void
*/
function check_plugin_installed( $plugin_slug ) {
$installed_plugins = get_plugins();
if ( ! empty( $plugin_slug ) ) {
$retval = array_key_exists( $plugin_slug, $installed_plugins ) || in_array( $plugin_slug, $installed_plugins, true );
} else {
$retval = false;
}
return $retval;
}
/**
* Get plugin version
*/
function get_current_plugin_version( $plugin_slug ) {
$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_slug );
$plugin_data_version = ! empty( $plugin_data['Version'] ) ? $plugin_data['Version'] : false;
return $plugin_data_version;
}
/**
* Get plugin name
*/
function get_current_plugin_name( $plugin_slug ) {
$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_slug );
$plugin_data_name = ! empty( $plugin_data['Name'] ) ? $plugin_data['Name'] : false;
return $plugin_data_name;
}
public function clear_fonts () {
self::check_ajax_access( $_POST['nonce'], 'oceanwp_theme_panel' );
$upload = wp_upload_dir();
$uploads_fonts_dir = 'oceanwp-webfonts';
$uploads_css_dir = 'oceanwp-webfonts-css';
if ( ! file_exists( trailingslashit( $upload['basedir'] ) . $uploads_fonts_dir ) ) {
wp_send_json_error( array( 'message' => esc_html__( 'Fonts folder does not exist', 'oceanwp' ) ) );
}
if ( ! file_exists( trailingslashit( $upload['basedir'] ) . $uploads_css_dir ) ) {
wp_send_json_error( array( 'message' => esc_html__( 'CSS folder does not exist', 'oceanwp' ) ) );
}
try {
$files_fonts = glob(trailingslashit( $upload['basedir'] ) . $uploads_fonts_dir."/*");
if (count($files_fonts) > 0) {
foreach ($files_fonts as $file) {
if (file_exists($file)) {
unlink($file);
}
}
}
$files_css = glob(trailingslashit( $upload['basedir'] ) . $uploads_css_dir."/*");
if (count($files_css) > 0) {
foreach ($files_css as $file) {
if (file_exists($file)) {
unlink($file);
}
}
}
} catch ( Exception $e ) {
wp_send_json_error( array( 'message' => esc_html__( 'Something went wrong', 'oceanwp' ) ) );
}
wp_send_json_success( array( 'message' => esc_html__( 'Data was cleared', 'oceanwp' ) ) );
}
}
/**
* Create single instance and globalize.
*
* @return OceanWP_Theme_Panel
*/
function oceanwp_theme_panel() {
return OceanWP_Theme_Panel::get_instance();
}
// Initialize control panel.
oceanwp_theme_panel();