plugin = Elementor\Plugin::instance(); if ( !empty( $this->plugin->preview ) && method_exists( $this->plugin->preview, 'is_preview_mode' ) && $this->plugin->preview->is_preview_mode() ) { add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_scripts' ) ); add_action( 'elementor/preview/enqueue_styles', array( $this, 'enqueue_preview_scripts' ) ); } } function enqueue_frontend_scripts() { $post_id = get_the_ID(); if( defined( 'Elementor\\DB::STATUS_DRAFT' ) && ! empty( $this->plugin->db ) && method_exists( $this->plugin->db, 'get_builder' ) ) { // This is necessary to ensure styles and scripts are enqueued. Not sure why this is enough, but I assume // Elementor is calling widgets' `widget` method with instance data in the process of retrieving editor data. $this->plugin->db->get_builder( $post_id, Elementor\DB::STATUS_DRAFT ); } } function enqueue_preview_scripts() { global $wp_widget_factory; foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) { if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) { /* @var $widget_obj SiteOrigin_Widget */ ob_start(); $widget_obj->widget( array(), array() ); ob_clean(); } } } function enqueue_active_widgets_scripts() { add_action( 'wp_print_footer_scripts', array( $this, 'print_footer_templates' ) ); global $wp_widget_factory; // Elementor does it's editing in it's own front end so enqueue required form scripts for active widgets. foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) { if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) { /* @var $widget_obj SiteOrigin_Widget */ ob_start(); $widget_obj->form( array() ); ob_clean(); } } wp_enqueue_style( 'sowb-styles-for-elementor', plugin_dir_url( __FILE__ ) . 'styles.css' ); wp_enqueue_script( 'sowb-js-for-elementor', plugin_dir_url( __FILE__ ) . 'sowb-elementor' . SOW_BUNDLE_JS_SUFFIX . '.js', array( 'jquery' ) ); } function print_footer_templates() { global $wp_widget_factory; // Elementor does it's editing in the front end so print required footer templates for active widgets. foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) { if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) { /* @var $widget_obj SiteOrigin_Widget */ $widget_obj->footer_admin_templates(); } } } function ajax_render_widget_preview() { add_filter( 'siteorigin_widgets_is_preview', '__return_true' ); add_filter( 'elementor/widget/render_content', array( $this, 'render_widget_preview' ) ); } function render_widget_preview( $widget_output ) { siteorigin_widget_print_styles(); return $widget_output; } function ajax_render_widget_form() { // Don't want to show the form preview button when using Elementor add_filter( 'siteorigin_widgets_form_show_preview_button', array( $this, '__return_false' ) ); } } SiteOrigin_Widgets_Bundle_Elementor::single();