slug() . '_posts_columns', [ $this, 'set_post_columns' ] ); add_action( 'manage_' . $this->slug() . '_posts_custom_column', [ $this, 'post_columns' ], 10, 2 ); add_action( 'template_include', [ $this, 'set_post_type_template' ], 9999 ); add_action( 'save_post', [ $this, 'save_popup_post_type'], 10, 3 ); add_action( 'wp_trash_post', [ $this, 'remove_popup_from_site_conditions' ] ); add_action( 'admin_footer', [ $this, 'print_vue_templates' ], 998 ); add_action( 'admin_footer', [ $this, 'print_template_library' ], 999 ); add_action( 'load-post-new.php', [ $this, 'create_new_popup_redirect' ] ); add_filter( 'admin_body_class', [ $this, 'body_status_classes' ] ); } /** * Returns post type slug * * @return string */ public function slug() { return $this->post_type; } /** * Returns Mega Menu meta key * * @return string */ public function meta_key() { return $this->meta_key; } /** * Set required post columns * * @param [type] $columns [description] */ public function set_post_columns( $columns ) { unset( $columns['date'] ); unset( $columns['author'] ); $columns['info'] = __( 'Info', 'jet-popup' ); $columns['settings'] = __( 'Settings', 'jet-popup' ); $columns['conditions'] = __( 'Visibility Conditions', 'jet-popup' ); $columns['date'] = __( 'Date', 'jet-popup' ); return $columns; } /** * Manage post columns content * * @return [type] [description] */ public function post_columns( $column, $post_id ) { switch ( $column ) { case 'info': printf( '
', $post_id ); printf( '
%1$s
', $this->popup_info_verbose( $post_id ) ); printf( '
' ); break; case 'settings': printf( '
', $post_id ); printf( '
%1$s
', $this->popup_settings_verbose( $post_id ) ); printf( '%2$s%3$s', $post_id, \Jet_Popup_Utils::get_admin_ui_icon( 'edit' ), __( 'Edit Settings', 'jet-popup' ) ); printf( '
' ); break; case 'conditions': printf( '
', $post_id ); printf( '
%1$s
', jet_popup()->conditions_manager->popup_conditions_verbose( $post_id ) ); printf( '%2$s%3$s', $post_id, \Jet_Popup_Utils::get_admin_ui_icon( 'edit' ), __( 'Edit Conditions', 'jet-popup' ) ); printf( '
' ); break; } } /** * Add elementor support for mega menu items. */ public function set_option_support( $value ) { if ( empty( $value ) ) { $value = array(); } return array_merge( $value, array( $this->slug() ) ); } /** * Register post type * * @return void */ static public function register_post_type() { $labels = array( 'name' => esc_html__( 'JetPopup', 'jet-popup' ), 'singular_name' => esc_html__( 'JetPopup', 'jet-popup' ), 'all_items' => esc_html__( 'All Popups', 'jet-popup' ), 'add_new' => esc_html__( 'Create New Popup', 'jet-popup' ), 'add_new_item' => esc_html__( 'Create New Popup', 'jet-popup' ), 'edit_item' => esc_html__( 'Edit Popup', 'jet-popup' ), 'menu_name' => esc_html__( 'JetPopup', 'jet-popup' ), ); $supports = apply_filters( 'jet-popups/post-type/register/supports', [ 'title', 'editor', 'author', 'elementor', 'custom-fields' ] ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'description', 'taxonomies' => [], 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'show_in_admin_bar' => true, 'menu_position' => 101, 'menu_icon' => 'data:image/svg+xml;base64,' . base64_encode(''), 'show_in_nav_menus' => false, 'show_in_rest' => true, 'publicly_queryable' => true, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => true, 'rewrite' => true, 'capability_type' => 'post', 'supports' => $supports, ); register_post_type( 'jet-popup', $args ); } /** * @return void */ public function create_new_popup_redirect() { if ( $this->post_type === $_GET['post_type'] ) { wp_redirect('edit.php?post_type=' . $this->post_type . '&library_action=open_create_new_popup' ); } } /** * [print_vue_templates description] * @return [type] [description] */ public function print_vue_templates() { $map = [ 'conditions-item', 'conditions-manager', 'create-popup-form', 'import-popup-form', 'settings-manager', ]; foreach ( glob( jet_popup()->plugin_path( 'templates/vue-templates/admin/popup-library/' ) . '*.php' ) as $file ) { $name = basename( $file, '.php' ); if ( ! in_array( $name, $map ) ) { continue; } ob_start(); include $file; printf( '', $name, ob_get_clean() ); } } /** * Print template type form HTML * * @return void */ public function print_template_library() { $screen = get_current_screen(); if ( $screen->id !== 'edit-' . $this->slug() ) { return; } include jet_popup()->get_template( 'vue-templates/admin/popup-library/popup-library.php' ); } /** * Set blank template for editor */ public function set_post_type_template( $template ) { if ( is_singular( jet_popup()->post_type->slug() ) ) { $template = jet_popup()->plugin_path( 'templates/single.php' ); do_action( 'jet-popups/template-include/found' ); return apply_filters( 'jet-popups/post-type/single-template', $template ); } return $template; } /** * @param $popup_id * * @return void */ public function save_popup_post_type( $popup_id, $post, $update ) { if ( empty( $post ) || 'jet-popup' !== $post->post_type ) { return; } delete_post_meta( $popup_id, '_is_deps_ready' ); delete_post_meta( $popup_id, '_is_script_deps' ); delete_post_meta( $popup_id, '_is_style_deps' ); delete_post_meta( $popup_id, '_is_content_elements' ); delete_transient( md5( sprintf( 'jet_popup_render_content_data_styles_%s', $popup_id ) ) ); delete_transient( md5( sprintf( 'jet_popup_render_content_data_scripts_%s', $popup_id ) ) ); } /** * @param $popup_id * * @return void */ public function remove_popup_from_site_conditions( $popup_id = 0 ) { $conditions = get_option( jet_popup()->conditions_manager->conditions_key, [] ); $conditions = $this->remove_popup_from_conditions_array( $popup_id, $conditions ); update_option( jet_popup()->conditions_manager->conditions_key, $conditions, true ); } /** * Check if post currently presented in conditions array and remove it if yes. * * @param integer $post_id [description] * @param array $conditions [description] * @return [type] [description] */ public function remove_popup_from_conditions_array( $popup_id = 0, $conditions = array() ) { foreach ( $conditions as $type => $type_conditions ) { if ( array_key_exists( $popup_id, $type_conditions ) ) { unset( $conditions[ $type ][ $popup_id ] ); } } return $conditions; } /** * @param $popup_id * * @return false|string */ public function popup_settings_verbose( $popup_id = null ) { $settings = jet_popup()->settings->get_popup_settings( $popup_id ); $verbose = ''; $animation_list = Jet_Popup_Utils::get_popup_animation_list(); $open_trigger_list = Jet_Popup_Utils::get_popup_open_trigger_list(); $animation_type = $settings['jet_popup_animation']; $open_trigger = $settings['jet_popup_open_trigger']; $prevent_scrolling = filter_var( $settings['jet_popup_prevent_scrolling'], FILTER_VALIDATE_BOOLEAN ); $show_once = filter_var( $settings['jet_popup_show_once'], FILTER_VALIDATE_BOOLEAN ); $use_ajax = filter_var( $settings['jet_popup_use_ajax'], FILTER_VALIDATE_BOOLEAN ); $force_ajax = filter_var( $settings['jet_popup_force_ajax'], FILTER_VALIDATE_BOOLEAN ); $close_on_overlay = filter_var( $settings['close_on_overlay_click'], FILTER_VALIDATE_BOOLEAN ); $verbose .= sprintf( '
%1$s: %3$s
', __( 'Open event', 'jet-popup' ), 'attach' === $open_trigger ? 'disable-label' : 'enable-label', $open_trigger_list[ $open_trigger ] ); switch ( $open_trigger ) { case 'page-load': $verbose .= sprintf( '
%1$s: %2$s
', __( 'Open delay', 'jet-popup' ), $settings[ 'jet_popup_page_load_delay' ] ); break; case 'user-inactive': $verbose .= sprintf( '
%1$s: %2$s
', __( 'User inactivity time', 'jet-popup' ), $settings[ 'jet_popup_user_inactivity_time' ] ); break; case 'scroll-trigger': $verbose .= sprintf( '
%1$s: %2$s
', __( 'Scroll Page Progress(%)', 'jet-popup' ), $settings[ 'jet_popup_scrolled_to_value' ] ); break; case 'on-date': $verbose .= sprintf( '
%1$s: %2$s
', __( 'Open Date', 'jet-popup' ), $settings[ 'jet_popup_on_date_value' ] ); break; case 'on-time': $verbose .= sprintf( '
%1$s: %2$s
', __( 'Start Time', 'jet-popup' ), $settings[ 'jet_popup_on_time_start_value' ] ); $verbose .= sprintf( '
%1$s: %2$s
', __( 'End Time', 'jet-popup' ), $settings[ 'jet_popup_on_time_end_value' ] ); break; case 'custom-selector': $verbose .= sprintf( '
%1$s: %2$s
', __( 'Custom selector', 'jet-popup' ), $settings[ 'jet_popup_custom_selector' ] ); break; } $verbose .= sprintf( '
%1$s: %2$s
', __( 'Animation type', 'jet-popup' ), $animation_list[ $animation_type ] ); $verbose .= sprintf( '
%1$s: %3$s
', __( 'Loading content with Ajax', 'jet-popup' ), $use_ajax ? 'enable-label' : 'disable-label', $use_ajax ? __( 'Yes', 'jet-popup' ) : __( 'No', 'jet-popup' ) ); $verbose .= sprintf( '
%1$s: %3$s
', __( 'Use ajax every time you open the popup', 'jet-popup' ), $force_ajax ? 'enable-label' : 'disable-label', $force_ajax ? __( 'Yes', 'jet-popup' ) : __( 'No', 'jet-popup' ) ); $verbose .= sprintf( '
%1$s: %3$s
', __( 'Disable page scrolling', 'jet-popup' ), $prevent_scrolling ? 'enable-label' : 'disable-label', $prevent_scrolling ? __( 'Yes', 'jet-popup' ) : __( 'No', 'jet-popup' ) ); $verbose .= sprintf( '
%1$s: %3$s
', __( 'Show once', 'jet-popup' ), $show_once ? 'enable-label' : 'disable-label', $show_once ? __( 'Yes', 'jet-popup' ) : __( 'No', 'jet-popup' ) ); return $verbose; } /** * @param $popup_id * * @return string */ public function popup_info_verbose( $popup_id = null ) { $verbose = ''; $content_type = $this->get_popup_content_type( $popup_id ); $content_type_icons = $this->get_popup_content_type_icons(); $icon = isset( $content_type_icons[ $content_type ] ) ? $content_type_icons[ $content_type ] : ''; $verbose .= sprintf( '
%1$s: %2$s%3$s
', __( 'Content type', 'jet-popup' ), $icon, 'default' === $content_type ? __( 'Gutenberg', 'jet-popup' ) : __( 'Elementor', 'jet-popup' ) ); return $verbose; } /** * [predesigned_popups description] * @return [type] [description] */ public function get_predesigned_popups() { $base_url = jet_popup()->plugin_url( 'templates/dummy-popups/' ); $base_dir = jet_popup()->plugin_path( 'templates/dummy-popups/' ); return apply_filters( 'jet-popup/predesigned-popups', [ 'popup-1' => [ 'id' => 'popup-1', 'title' => __( 'Classic', 'jet-popup' ), 'preset-default' => $base_dir . 'popup-1/preset-default.json', 'preset-elementor' => $base_dir . 'popup-1/preset-elementor.json', 'svg' => '', ], 'popup-2' => [ 'id' => 'popup-2', 'title' => __( 'Slide In', 'jet-popup' ), 'preset-default' => $base_dir . 'popup-2/preset-default.json', 'preset-elementor' => $base_dir . 'popup-2/preset-elementor.json', 'svg' => '', ], 'popup-3' => [ 'id' => 'popup-3', 'title' => __( 'Bar', 'jet-popup' ), 'preset-default' => $base_dir . 'popup-3/preset-default.json', 'preset-elementor' => $base_dir . 'popup-3/preset-elementor.json', 'svg' => '', ], 'popup-4' => [ 'id' => 'popup-4', 'title' => __( 'Bordering', 'jet-popup' ), 'preset-default' => $base_dir . 'popup-4/preset-default.json', 'preset-elementor' => $base_dir . 'popup-4/preset-elementor.json', 'svg' => '', ], 'popup-5' => [ 'id' => 'popup-5', 'title' => __( 'Full View', 'jet-popup' ), 'preset-default' => $base_dir . 'popup-5/preset-default.json', 'preset-elementor' => $base_dir . 'popup-5/preset-elementor.json', 'svg' => '', ], 'popup-6' => [ 'id' => 'popup-6', 'title' => __( 'Full Width', 'jet-popup' ), 'preset-default' => $base_dir . 'popup-6/preset-default.json', 'preset-elementor' => $base_dir . 'popup-6/preset-elementor.json', 'svg' => '', ], ] ); } /** * @param false $template_type * @param string $content_type * @param string $template_name * * @return array */ public function create_popup( $preset = false, $content_type = 'default', $name = '' ) { if ( ! current_user_can( 'edit_posts' ) ) { return [ 'type' => 'error', 'message' => __( 'You don\'t have permissions to do this', 'jet-popup' ), 'redirect' => false, 'newTemplateId' => false, ]; } $popup_default_settings = jet_popup()->settings->get_popup_default_settings(); $popup_default_styles = jet_popup()->settings->get_popup_styles(); if ( ! $preset ) { switch ( $content_type ) { case 'default': $meta_input = [ '_content_type' => $content_type, '_conditions' => [], '_relation_type' => 'or', '_settings' => $popup_default_settings, '_styles' => $popup_default_styles, '_elementor_template_type' => $this->slug(), // Elementor Compatibility / add doc type meta field ]; break; case 'elementor': $documents = \Elementor\Plugin::instance()->documents; $doc_type = $documents->get_document_type( $this->slug() ); $preset_data = false; if ( ! $doc_type ) { return [ 'type' => 'error', 'message' => __( 'Incorrect type', 'jet-popup' ), 'redirect' => false, 'newTemplateId' => false, ]; } $meta_input = [ '_elementor_edit_mode' => 'builder', $doc_type::TYPE_META_KEY => $this->slug(), '_content_type' => $content_type, '_conditions' => [], '_relation_type' => 'or', '_settings' => [], '_styles' => $popup_default_styles, ]; break; } $new_popup_args = [ 'post_status' => 'publish', 'post_title' => ! empty( $name ) ? $name : __( 'Jet Popup', 'jet-popup' ), 'post_type' => $this->slug(), 'meta_input' => $meta_input, ]; } else { $preset_data = $this->get_preset_data( $preset, $content_type ); $new_popup_args = jet_popup()->export_import->get_new_popup_args( $preset_data ); if ( ! empty( $name ) ) { $new_popup_args['post_title'] = $name; } } $popup_id = wp_insert_post( $new_popup_args, true ); if ( empty( $name ) ) { $post_title = $new_popup_args['post_title'] . ' #' . $popup_id; wp_update_post( [ 'ID' => $popup_id, 'post_title' => $post_title, ] ); } if ( $popup_id ) { switch ( $content_type ) { case 'default': $redirect = get_edit_post_link( $popup_id, '' ); break; case 'elementor': $redirect = \Elementor\Plugin::$instance->documents->get( $popup_id )->get_edit_url(); break; } return [ 'type' => 'success', 'message' => __( 'Popup has been created', 'jet-popup' ), 'redirect' => $redirect, 'newPopupId' => $popup_id, ]; } else { return [ 'type' => 'error', 'message' => __( 'Server Error. Please try again later.', 'jet-popup' ), 'redirect' => false, 'newTemplateId' => false, ]; } } /** * @param $preset * * @return array|false */ public function get_preset_data( $preset = false, $content_type = 'default' ) { if ( ! $preset ) { return false; } $predesigned_popups = $this->get_predesigned_popups(); if ( ! isset( $predesigned_popups[ $preset ] ) ) { return false; } $data = $predesigned_popups[ $preset ]; $dummy_file = ''; switch ( $content_type ) { case 'default': $dummy_file = $data['preset-default']; break; case 'elementor': $dummy_file = $data['preset-elementor']; break; } if ( empty( $dummy_file ) ) { return false; } ob_start(); include $dummy_file; $preset_data = ob_get_clean(); $preset_data = json_decode( $preset_data, true ); return $preset_data; } /** * @param false $page_template_id * * @return array|mixed */ public function get_popup_relation_type( $popup_id = false ) { if ( ! $popup_id ) { return 'or'; } $relation_type = get_post_meta( $popup_id, '_relation_type', true ); return ! empty( $relation_type ) ? $relation_type : 'or'; } /** * @param false $page_template_id * * @return array|mixed */ public function get_popup_content_type( $popup_id = false ) { if ( ! $popup_id ) { return 'default'; } $content_type = get_post_meta( $popup_id, '_content_type', true ); return ! empty( $content_type ) ? $content_type : 'elementor'; } /** * @return mixed|void */ public function get_popup_content_type_options() { return apply_filters( 'jet-popup/post-type/content-type-options', [ [ 'label' => __( 'Block Editor', 'jet-popup' ), 'value' => 'default', ], ] ); } /** * @return mixed|void */ public function get_popup_default_content_type() { return apply_filters( 'jet-popup/post-type/default-content-type', 'default' ); } /** * @return mixed|void */ public function get_popup_content_type_icons() { return apply_filters( 'jet-popup/post-type/content-type-icons', [ 'default' => '', ] ); } /** * @param $classes * @return mixed */ public function body_status_classes( $classes ) { global $pagenow; if ( in_array( $pagenow, [ 'post.php', 'post-new.php' ], true ) ) { $post = get_post(); $popup_id = $post->ID; $post_type = get_post_type( $popup_id ); if ( 'jet-popup' === $post_type ) { $content_type = jet_popup()->post_type->get_popup_content_type( $popup_id ); $classes .= ' ' . 'post-type-jet-popup--' . $content_type . '-content-type'; } } return $classes; } /** * Returns the instance. * * @since 1.0.0 * @return object */ public static function get_instance() { // If the single instance hasn't been set, set it now. if ( null == self::$instance ) { self::$instance = new self; } return self::$instance; } } }