<?php /** * Class for Elementor * * @package visual-portfolio/elementor */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Class Visual_Portfolio_3rd_Elementor */ class Visual_Portfolio_3rd_Elementor { /** * Lightbox fix added. * * @var boolean */ public $lightbox_fix_added = false; /** * Visual_Portfolio_3rd_Elementor constructor. */ public function __construct() { add_action( 'elementor/widgets/register', array( $this, 'register_widget' ) ); // We should also try to include this script in the footer, // since caching plugins place jQuery in the footer, and our script depends on it. add_action( 'wp_body_open', array( $this, 'maybe_fix_elementor_lightbox_conflict' ) ); add_action( 'wp_footer', array( $this, 'maybe_fix_elementor_lightbox_conflict' ), 20 ); // Compatibility code for Swiper library. add_action( 'wp_enqueue_scripts', array( $this, 'fix_elementor_swiper_assets' ), 101 ); } /** * Register widget */ public function register_widget() { require_once visual_portfolio()->plugin_path . 'classes/3rd/plugins/class-elementor-widget.php'; \Elementor\Plugin::instance()->widgets_manager->register( new Visual_Portfolio_3rd_Elementor_Widget() ); } /** * Fix Elementor lightbox conflict. * * @see https://github.com/nk-crew/visual-portfolio/issues/103 */ public function maybe_fix_elementor_lightbox_conflict() { if ( ! defined( 'ELEMENTOR_VERSION' ) ) { return; } // We should check it, as we are trying to inject this script twice. if ( $this->lightbox_fix_added ) { return; } if ( ! wp_script_is( 'jquery', 'enqueued' ) ) { return; } $this->lightbox_fix_added = true; ?> <script> (function($) { if (!$) { return; } // Previously we added this code on Elementor pages only, // but sometimes Lightbox enabled globally and it still conflicting with our galleries. // if (!$('.elementor-page').length) { // return; // } function addDataAttribute($items) { $items.find('.vp-portfolio__item a:not([data-elementor-open-lightbox])').each(function () { if (/\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i.test(this.href)) { this.dataset.elementorOpenLightbox = 'no'; } }); } $(document).on('init.vpf', function(event, vpObject) { if ('vpf' !== event.namespace) { return; } addDataAttribute(vpObject.$item); }); $(document).on('addItems.vpf', function(event, vpObject, $items) { if ('vpf' !== event.namespace) { return; } addDataAttribute($items); }); })(window.jQuery); </script> <?php } /** * Add Swiper from the Elementor plugin to prevent conflicts. * * @link https://wordpress.org/support/topic/visual-portfolio-elementor-issue/ - Old Elementor (< v3.11.0) and their lightbox is not working properly if we include new Swiper library. * @link https://wordpress.org/support/topic/elementor-image-carousel-navigation-is-affected-by-this-plugin/ - New Elementor (>= 3.11.0) added support for the latest version of Swiper library and changed their old fallback Swiper library. This is why we have to include Swiper's assets instead of ours. */ public function fix_elementor_swiper_assets() { if ( ! class_exists( '\Elementor\Plugin' ) || ! isset( \Elementor\Plugin::$instance->experiments ) || ! defined( 'ELEMENTOR_URL' ) ) { return; } global $wp_scripts; global $wp_styles; // Since the Elementor assets methods like `get_css_assets_url` are protected // and we can't use it directly, we prepare assets URLs manually. // Since Elementor 3.28.0, they have added support for the latest version of Swiper library. // // @link https://github.com/elementor/elementor/commit/33e96605426ad2895f81f29868b3feed0d0f048d. // @link https://wordpress.org/support/topic/problem-with-elementor-3-28/. $e_swiper_latest = version_compare( ELEMENTOR_VERSION, '3.28.0', '>=' ) || \Elementor\Plugin::$instance->experiments->is_feature_active( 'e_swiper_latest' ); $e_swiper_asset_path = $e_swiper_latest ? 'assets/lib/swiper/v8/' : 'assets/lib/swiper/'; $e_swiper_version = $e_swiper_latest ? '8.4.5' : '5.3.6'; $e_file_name = 'swiper'; $e_assets_base_url = ELEMENTOR_URL; $e_assets_relative_url = 'assets/'; $e_css_relative_url = $e_swiper_asset_path . 'css/'; $e_js_relative_url = $e_swiper_asset_path; if ( ! $e_css_relative_url ) { $e_css_relative_url = $e_assets_relative_url . 'css/'; } if ( ! $e_js_relative_url ) { $e_js_relative_url = $e_assets_relative_url; } $e_swiper_css_url = $e_assets_base_url . $e_css_relative_url . $e_file_name . '.css'; $e_swiper_js_url = $e_assets_base_url . $e_js_relative_url . $e_file_name . '.js'; // Elementor < 3.11.0 does not have a Swiper CSS file. if ( version_compare( ELEMENTOR_VERSION, '3.11.0', '<' ) ) { $e_swiper_css_url = visual_portfolio()->plugin_url . 'assets/vendor/swiper-5-3-6/swiper.min.css'; } // Since we include Swiper library ourselves, here we have to override assets URLs. if ( isset( $wp_scripts->registered['swiper']->src ) ) { $wp_scripts->registered['swiper']->src = $e_swiper_js_url; $wp_scripts->registered['swiper']->ver = $e_swiper_version; } if ( isset( $wp_styles->registered['swiper']->src ) ) { $wp_styles->registered['swiper']->src = $e_swiper_css_url; $wp_styles->registered['swiper']->ver = $e_swiper_version; } } } new Visual_Portfolio_3rd_Elementor();