site_oueb_2/wp-content/plugins/ocean-extra/ocean-extra.php

784 lines
22 KiB
PHP
Raw Permalink Normal View History

2022-11-22 20:23:31 +01:00
<?php
/**
* Plugin Name: Ocean Extra
* Plugin URI: https://oceanwp.org/extension/ocean-extra/
* Description: Add extra features and flexibility to your OceanWP theme for a turbocharged premium experience and full control over every aspect of your website.
* Version: 2.0.6
* Author: OceanWP
* Author URI: https://oceanwp.org/
* Requires at least: 5.6
* Tested up to: 6.1
* Text Domain: ocean-extra
* Domain Path: /languages
*
* @package Ocean_Extra
* @category Core
* @author OceanWP
*/
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Returns the main instance of Ocean_Extra to prevent the need to use globals.
*
* @since 1.0.0
* @return object Ocean_Extra
*/
function Ocean_Extra() {
return Ocean_Extra::instance();
} // End Ocean_Extra()
Ocean_Extra();
/**
* Main Ocean_Extra Class
*
* @class Ocean_Extra
* @version 1.0.0
* @since 1.0.0
* @package Ocean_Extra
*/
final class Ocean_Extra {
/**
* Ocean_Extra The single instance of Ocean_Extra.
*
* @var object
* @access private
* @since 1.0.0
*/
private static $_instance = null;
/**
* The token.
*
* @var string
* @access public
* @since 1.0.0
*/
public $token;
/**
* The version number.
*
* @var string
* @access public
* @since 1.0.0
*/
public $version;
// Admin - Start
/**
* The admin object.
*
* @var object
* @access public
* @since 1.0.0
*/
public $admin;
/**
* Constructor function.
*
* @access public
* @since 1.0.0
* @return void
*/
public function __construct( $widget_areas = array() ) {
$this->token = 'ocean-extra';
$this->plugin_url = plugin_dir_url( __FILE__ );
$this->plugin_path = plugin_dir_path( __FILE__ );
$this->version = '2.0.6';
define( 'OE_URL', $this->plugin_url );
define( 'OE_PATH', $this->plugin_path );
define( 'OE_VERSION', $this->version );
define( 'OE_FILE_PATH', __FILE__ );
define( 'OE_ADMIN_PANEL_HOOK_PREFIX', 'theme-panel_page_oceanwp-panel' );
// WooCommerce Wishlist partner ID
if ( class_exists( 'TInvWL_Wishlist' ) ) {
define( 'TINVWL_PARTNER', 'oceanwporg' );
define( 'TINVWL_CAMPAIGN', 'oceanwp_theme' );
}
register_activation_hook( __FILE__, array( $this, 'install' ) );
add_action( 'init', array( $this, 'load_plugin_textdomain' ) );
// Setup all the things
add_action( 'init', array( $this, 'setup' ) );
// Menu icons
$theme = wp_get_theme();
if ( 'OceanWP' == $theme->name || 'oceanwp' == $theme->template ) {
if ( get_template_directory() == get_stylesheet_directory() ) {
$current_theme_version = theme_version();
} else {
$parent = wp_get_theme()->parent();
// get parent version
if ( ! empty( $parent) ) {
$current_theme_version = $parent->Version;
}
}
$required_theme_version = '3.3.3';
require_once OE_PATH . '/includes/panel/theme-panel.php';
require_once OE_PATH . '/includes/panel/integrations-tab.php';
$oe_library_active_status = get_option( 'oe_library_active_status', 'yes' );
if( $oe_library_active_status == 'yes' ) {
require_once OE_PATH . '/includes/panel/library.php';
}
require_once OE_PATH . '/includes/panel/library-shortcode.php';
require_once OE_PATH . '/includes/menu-icons/menu-icons.php';
// require_once OE_PATH . '/includes/wizard/wizard.php';
require_once OE_PATH . '/includes/themepanel/theme-panel.php';
if ( ! empty( $current_theme_version ) && ! empty( $required_theme_version ) && version_compare( $current_theme_version, $required_theme_version , '>' ) ) {
require_once OE_PATH . '/includes/compatibility/ocean.php';
}
// Outputs custom JS to the footer
add_action( 'wp_footer', array( $this, 'custom_js' ), 9999 );
// Register Custom JS file
add_action( 'init', array( $this, 'register_custom_js' ) );
// Move the Custom CSS section into the Custom CSS/JS section
add_action( 'customize_register', array( $this, 'customize_register' ), 11 );
// Remove customizer unnecessary sections
add_action( 'customize_register', array( $this, 'remove_customize_sections' ), 11 );
// Load custom widgets
add_action( 'widgets_init', array( $this, 'custom_widgets' ), 10 );
// Add meta tags
add_filter( 'wp_head', array( $this, 'meta_tags' ), 1 );
}
// Allow shortcodes in text widgets
add_filter( 'widget_text', 'do_shortcode' );
// Allow for the use of shortcodes in the WordPress excerpt
add_filter( 'the_excerpt', 'shortcode_unautop' );
add_filter( 'the_excerpt', 'do_shortcode' );
}
/**
* Main Ocean_Extra Instance
*
* Ensures only one instance of Ocean_Extra is loaded or can be loaded.
*
* @since 1.0.0
* @static
* @see Ocean_Extra()
* @return Main Ocean_Extra instance
*/
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
} // End instance()
/**
* Load the localisation file.
*
* @access public
* @since 1.0.0
* @return void
*/
public function load_plugin_textdomain() {
load_plugin_textdomain( 'ocean-extra', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
/**
* Cloning is forbidden.
*
* @since 1.0.0
*/
public function __clone() {
_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?' ), '1.0.0' );
}
/**
* Deserializing instances of this class is forbidden.
*
* @since 1.0.0
*/
public function __wakeup() {
_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?' ), '1.0.0' );
}
/**
* Installation.
* Runs on activation. Logs the version number and assigns a notice message to a WordPress option.
*
* @access public
* @since 1.0.0
* @return void
*/
public function install() {
$this->_log_version_number();
}
/**
* Log the plugin version number.
*
* @access private
* @since 1.0.0
* @return void
*/
private function _log_version_number() {
// Log the version number.
update_option( $this->token . '-version', $this->version );
}
/**
* Return the correct icon
*
* @param string $icon Icon class.
* @param bool $echo Print string.
* @param string $class Icon class.
* @param string $title Optional SVG title.
* @param string $desc Optional SVG description.
* @param string $aria_hidden Optional SVG description.
* @param boolean $fallback Fallback icon.
*
* @since 1.7.6
* @return string OceanWP Icon.
*/
public static function oe_svg_icon( $icon, $echo = true, $class = '', $title = '', $desc = '', $aria_hidden = true, $fallback = false ) {
// Get icon class.
$theme_icons = oceanwp_theme_icons();
if ( function_exists( 'oceanwp_icon' ) ) {
return oceanwp_icon( $icon, $echo, $class, $title, $desc, $aria_hidden, $fallback );
} else {
if ( true === $echo ) {
echo '<i class="' . $class . ' ' . $theme_icons[ $icon ]['fai'] . '"' . $aria_hidden . ' role="img"></i>';
} else {
return '<i class="' . $class . ' ' . $theme_icons[ $icon ]['fai'] . '"' . $aria_hidden . ' role="img"></i>';
}
return;
}
}
/**
* All theme functions hook into the oceanwp_footer_js filter for this function.
*
* @since 1.3.8
*/
public static function custom_js( $output = null ) {
// Add filter for adding custom js via other functions
$output = apply_filters( 'ocean_footer_js', $output );
// Minify and output JS in the wp_footer
if ( ! empty( $output ) ) { ?>
<script type="text/javascript">
/* OceanWP JS */
<?php echo Ocean_Extra_JSMin::minify( $output ); ?>
</script>
<?php
}
}
/**
* Adds customizer options
*
* @since 1.3.8
*/
public function register_custom_js() {
// Var
$dir = OE_PATH . '/includes/';
// File
if ( Ocean_Extra_Theme_Panel::get_setting( 'oe_custom_code_panel' ) ) {
require_once $dir . 'custom-code.php';
}
}
/**
* Move the Custom CSS section into the Custom CSS/JS section
*
* @since 1.3.8
*/
public static function customize_register( $wp_customize ) {
// Move custom css setting
$wp_customize->get_control( 'custom_css' )->section = 'ocean_custom_code_panel';
}
/**
* Remove customizer unnecessary sections
*
* @since 1.0.0
*/
public static function remove_customize_sections( $wp_customize ) {
// Remove core sections
$wp_customize->remove_section( 'colors' );
$wp_customize->remove_section( 'themes' );
$wp_customize->remove_section( 'background_image' );
// Remove core controls
$wp_customize->remove_control( 'header_textcolor' );
$wp_customize->remove_control( 'background_color' );
$wp_customize->remove_control( 'background_image' );
$wp_customize->remove_control( 'display_header_text' );
// Remove default settings
$wp_customize->remove_setting( 'background_color' );
$wp_customize->remove_setting( 'background_image' );
}
/**
* Setup all the things.
* Only executes if OceanWP or a child theme using OceanWP as a parent is active and the extension specific filter returns true.
*
* @return void
*/
public function setup() {
$theme = wp_get_theme();
if ( 'OceanWP' == $theme->name || 'oceanwp' == $theme->template ) {
require_once OE_PATH . '/includes/metabox/butterbean/butterbean.php';
require_once OE_PATH . '/includes/metabox/metabox.php';
require_once OE_PATH . '/includes/metabox/shortcodes.php';
require_once OE_PATH . '/includes/metabox/gallery-metabox/gallery-metabox.php';
require_once OE_PATH . '/includes/shortcodes/shortcodes.php';
require_once OE_PATH . '/includes/image-resizer.php';
require_once OE_PATH . '/includes/jsmin.php';
require_once OE_PATH . '/includes/panel/notice.php';
require_once OE_PATH . '/includes/walker.php';
require_once OE_PATH . '/includes/ocean-extra-strings.php';
require_once OE_PATH . '/includes/dashboard.php';
require_once OE_PATH . '/includes/panel/demos.php';
$oe_notification_active_status = get_option( 'oe_notification_active_status', 'no' );
if( $oe_notification_active_status == 'no' ) {
require_once OE_PATH . '/includes/admin-bar/admin-bar.php';
require_once OE_PATH . '/includes/admin-bar/notifications.php';
}
add_action( 'wp_enqueue_scripts', array( $this, 'scripts' ), 999 );
}
}
/**
* Include flickr widget class
*
* @since 1.0.0
*/
public static function custom_widgets() {
if ( ! version_compare( PHP_VERSION, '5.6', '>=' ) ) {
return;
}
// Define array of custom widgets for the theme
$widgets = apply_filters(
'ocean_custom_widgets',
array(
'about-me',
'contact-info',
'custom-links',
'custom-menu',
'facebook',
'flickr',
'instagram',
'mailchimp',
'recent-posts',
'social',
'social-share',
'tags',
'twitter',
'video',
'custom-header-logo',
'custom-header-nav',
)
);
// Loop through widgets and load their files
if ( $widgets && is_array( $widgets ) ) {
foreach ( $widgets as $widget ) {
$file = OE_PATH . '/includes/widgets/' . $widget . '.php';
if ( file_exists( $file ) ) {
require_once $file;
}
}
}
}
/**
* Add meta tags
*
* @since 1.5.1
*/
public static function meta_tags() {
// Return if disabled or if Yoast SEO enabled as they have their own meta tags
if ( false == get_theme_mod( 'ocean_open_graph', false )
|| defined( 'WPSEO_VERSION' )
|| defined( 'RANK_MATH_FILE' ) ) {
return;
}
// Facebook URL
$facebook_url = get_theme_mod( 'ocean_facebook_page_url' );
// Disable Jetpack's Open Graph tags
add_filter( 'jetpack_enable_opengraph', '__return_false', 99 );
add_filter( 'jetpack_enable_open_graph', '__return_false', 99 );
add_filter( 'jetpack_disable_twitter_cards', '__return_true', 99 );
// Type
if ( is_front_page() || is_home() ) {
$type = 'website';
} elseif ( is_singular() ) {
$type = 'article';
} else {
// We use "object" for archives etc. as article doesn't apply there.
$type = 'object';
}
// Title
if ( is_singular() ) {
$title = get_the_title();
} else {
$title = oceanwp_has_page_title();
}
// Description
if ( is_category() || is_tag() || is_tax() ) {
$description = strip_shortcodes( wp_strip_all_tags( term_description() ) );
} else {
$description = html_entity_decode( htmlspecialchars_decode( oceanwp_excerpt( 40 ) ) );
}
// Image.
$image = '';
$has_img = false;
if ( OCEANWP_WOOCOMMERCE_ACTIVE
&& is_product_category() ) {
global $wp_query;
$cat = $wp_query->get_queried_object();
$thumbnail_id = get_term_meta( $cat->term_id, 'thumbnail_id', true );
$get_image = wp_get_attachment_url( $thumbnail_id );
if ( $get_image ) {
$image = $get_image;
$has_img = true;
}
} else {
$get_image = wp_get_attachment_image_src( get_post_thumbnail_id( get_the_ID() ), 'full' );
if ( is_array( $get_image ) ) {
$image = $get_image[0];
$has_img = true;
}
}
// Post author.
if ( $facebook_url ) {
$author = $facebook_url;
}
// Facebook publisher URL
if ( ! empty( $facebook_url ) ) {
$publisher = $facebook_url;
}
// Facebook APP ID
$facebook_appid = get_theme_mod( 'ocean_facebook_appid' );
if ( ! empty( $facebook_appid ) ) {
$fb_app_id = $facebook_appid;
}
// Twiiter handle
$twitter_handle = '@' . str_replace( '@', '', get_theme_mod( 'ocean_twitter_handle' ) );
// Output
$output = self::opengraph_tag( 'property', 'og:type', trim( $type ) );
$output .= self::opengraph_tag( 'property', 'og:title', trim( $title ) );
if ( isset( $description ) && ! empty( $description ) ) {
$output .= self::opengraph_tag( 'property', 'og:description', trim( $description ) );
}
if ( has_post_thumbnail( oceanwp_post_id() ) && true == $has_img ) {
$output .= self::opengraph_tag( 'property', 'og:image', trim( $image ) );
$output .= self::opengraph_tag( 'property', 'og:image:width', absint( $get_image[1] ) );
$output .= self::opengraph_tag( 'property', 'og:image:height', absint( $get_image[2] ) );
}
$output .= self::opengraph_tag( 'property', 'og:url', trim( get_permalink() ) );
$output .= self::opengraph_tag( 'property', 'og:site_name', trim( get_bloginfo( 'name' ) ) );
if ( is_singular() && ! is_front_page() ) {
if ( isset( $author ) && ! empty( $author ) ) {
$output .= self::opengraph_tag( 'property', 'article:author', trim( $author ) );
}
if ( is_singular( 'post' ) ) {
$output .= self::opengraph_tag( 'property', 'article:published_time', trim( get_post_time( 'c' ) ) );
$output .= self::opengraph_tag( 'property', 'article:modified_time', trim( get_post_modified_time( 'c' ) ) );
$output .= self::opengraph_tag( 'property', 'og:updated_time', trim( get_post_modified_time( 'c' ) ) );
}
}
if ( is_singular() ) {
$tags = get_the_tags();
if ( ! is_wp_error( $tags ) && ( is_array( $tags ) && $tags !== array() ) ) {
foreach ( $tags as $tag ) {
$output .= self::opengraph_tag( 'property', 'article:tag', trim( $tag->name ) );
}
}
$terms = get_the_category();
if ( ! is_wp_error( $terms ) && ( is_array( $terms ) && $terms !== array() ) ) {
// We can only show one section here, so we take the first one.
$output .= self::opengraph_tag( 'property', 'article:section', trim( $terms[0]->name ) );
}
}
if ( isset( $publisher ) && ! empty( $publisher ) ) {
$output .= self::opengraph_tag( 'property', 'article:publisher', trim( $publisher ) );
}
if ( isset( $fb_app_id ) && ! empty( $fb_app_id ) ) {
$output .= self::opengraph_tag( 'property', 'fb:app_id', trim( $fb_app_id ) );
}
// Twitter
$output .= self::opengraph_tag( 'name', 'twitter:card', 'summary_large_image' );
$output .= self::opengraph_tag( 'name', 'twitter:title', trim( $title ) );
if ( isset( $description ) && ! empty( $description ) ) {
$output .= self::opengraph_tag( 'name', 'twitter:description', trim( $description ) );
}
if ( has_post_thumbnail( get_the_ID() ) && true == $has_img ) {
$output .= self::opengraph_tag( 'name', 'twitter:image', trim( $image ) );
}
if ( isset( $twitter_handle ) && ! empty( $twitter_handle ) ) {
$output .= self::opengraph_tag( 'name', 'twitter:site', trim( $twitter_handle ) );
$output .= self::opengraph_tag( 'name', 'twitter:creator', trim( $twitter_handle ) );
}
echo $output;
}
/**
* Get meta tags
*
* @since 1.5.1
*/
public static function opengraph_tag( $attr, $property, $content ) {
echo '<meta ', esc_attr( $attr ), '="', esc_attr( $property ), '" content="', esc_attr( $content ), '" />', "\n";
}
/**
* Enqueue scripts
*
* @since 1.0.0
*/
public function scripts() {
// Load main stylesheet
wp_enqueue_style( 'oe-widgets-style', plugins_url( '/assets/css/widgets.css', __FILE__ ) );
// If rtl
if ( is_RTL() ) {
wp_enqueue_style( 'oe-widgets-style-rtl', plugins_url( '/assets/css/rtl.css', __FILE__ ) );
}
}
} // End Class.
/**
* Check link rel and return correct aria label
*
* @since 1.6.4
*/
if ( ! function_exists( 'ocean_link_rel' ) ) {
function ocean_link_rel( $ocean_srt, $nofollow, $target ) {
if ( $nofollow === 'yes' ) {
if ( $target === 'blank' ) {
$link_rel = 'rel="nofollow noopener noreferrer"';
$ocean_sr = $ocean_srt;
} else {
$link_rel = 'rel="nofollow"';
$ocean_sr = '';
}
} elseif ( $nofollow === 'no' || $nofollow === '' ) {
if ( $target === 'blank' ) {
$link_rel = 'rel="noopener noreferrer"';
$ocean_sr = $ocean_srt;
} else {
$link_rel = '';
$ocean_sr = '';
}
}
return array( $ocean_sr, $link_rel );
}
}
/**
* Returns current theme version
*
* @since 2.0.0
*/
function theme_version() {
// Get theme data.
$theme = wp_get_theme();
// Return theme version.
return $theme->get( 'Version' );
}
/**
* Display Notice when Ocean Extra is outdated.
*
* @since 2.0.0
*
* @return void
*/
if ( ! function_exists( 'ocean_theme_is_outdated_admin_notice' ) ) {
function ocean_theme_is_outdated_admin_notice() {
$theme = wp_get_theme();
if ( current_user_can( 'install_plugins' ) ) {
if ( 'OceanWP' == $theme->name || 'oceanwp' == $theme->template ) {
if ( ! defined( 'OCEANWP_THEME_VERSION' ) ) {
define( 'OCEANWP_THEME_VERSION', theme_version() );
}
if ( ! is_child_theme() ) {
$current_theme_version = OCEANWP_THEME_VERSION;
} else {
$current_theme_version = '3.3.0';
}
$required_theme_version = '3.3.0';
if ( ! empty( $current_theme_version ) && ! empty( $required_theme_version ) && version_compare( $current_theme_version, $required_theme_version , '<' ) ) :
?>
<div class="notice notice-warning is-dismissible">
<p><?php esc_html_e( 'We made changes to our Theme Panel. To complete the installation and enjoy both old and new features, please make sure the OceanWP theme and all Ocean plugins are up to date.', 'oceanwp' ); ?></p>
<a href="<?php echo esc_url( admin_url( 'update-core.php' ) ); ?>"><?php esc_html_e( 'Update and get the new Theme Panel', 'oceanwp' ); ?></a>
<br><br>
</div>
<?php
endif;
}
}
}
}
add_action( 'admin_notices', 'ocean_theme_is_outdated_admin_notice' );
// --------------------------------------------------------------------------------
// region Freemius
// --------------------------------------------------------------------------------
function owp_include_client_migration() {
require_once dirname( __FILE__ ) . '/includes/client-migration/edd.php';
owp_fs()->add_filter( 'has_paid_plan_account', '__return_false' );
owp_fs()->add_filter( 'is_submenu_visible', 'owp_fs_is_submenu_visible', 10, 2 );
}
add_action( 'owp_fs_loaded', 'owp_include_client_migration' );
function owp_fs_is_submenu_visible( $is_visible, $submenu_id ) {
if ( 'pricing' === $submenu_id ) {
$show_pricing_transient = false; // get_transient( 'oceanwp_show_pricing' );
if ( is_string( $show_pricing_transient ) ) {
$show_pricing = ( 'yes' === $show_pricing_transient );
} else {
$show_pricing = true;
foreach ( OceanWP_EDD_License_Key::$paid_addons as $class_name => $data ) {
if ( ! class_exists( $class_name ) ) {
continue;
}
if ( ! function_exists( $data['fs_shortcode'] ) ) {
continue;
}
/**
* Initiate the Freemius instance before migrating.
*
* @var Freemius $addon_fs
*/
$addon_fs = call_user_func( $data['fs_shortcode'] );
if ( $addon_fs->has_active_valid_license() ) {
$licenses = $addon_fs->_get_license();
if ( is_object( $licenses ) &&
FS_Plugin_License::is_valid_id( $licenses->parent_license_id )
) {
$show_pricing = false;
break;
}
}
}
// set_transient(
// 'oceanwp_show_pricing',
// $show_pricing ? 'yes' : 'no',
// WP_FS__TIME_5_MIN_IN_SEC
// );
}
return $show_pricing;
}
return $is_visible;
}
// function owp_fs_after_client_migration( $license_accessor ) {
// if ('OceanWP_EDD_License_Key' !== get_class($license_accessor)) {
// return;
// }
//
// delete_transient( 'oceanwp_show_pricing' );
// }
//
// add_action( 'fs_after_client_migration', 'owp_fs_after_client_migration' );
// endregion