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( '
' );
break;
case 'settings':
printf( '' );
break;
case 'conditions':
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( '',
__( 'Open event', 'jet-popup' ),
'attach' === $open_trigger ? 'disable-label' : 'enable-label',
$open_trigger_list[ $open_trigger ]
);
switch ( $open_trigger ) {
case 'page-load':
$verbose .= sprintf( '',
__( 'Open delay', 'jet-popup' ),
$settings[ 'jet_popup_page_load_delay' ]
);
break;
case 'user-inactive':
$verbose .= sprintf( '',
__( 'User inactivity time', 'jet-popup' ),
$settings[ 'jet_popup_user_inactivity_time' ]
);
break;
case 'scroll-trigger':
$verbose .= sprintf( '',
__( 'Scroll Page Progress(%)', 'jet-popup' ),
$settings[ 'jet_popup_scrolled_to_value' ]
);
break;
case 'on-date':
$verbose .= sprintf( '',
__( 'Open Date', 'jet-popup' ),
$settings[ 'jet_popup_on_date_value' ]
);
break;
case 'on-time':
$verbose .= sprintf( '',
__( 'Start Time', 'jet-popup' ),
$settings[ 'jet_popup_on_time_start_value' ]
);
$verbose .= sprintf( '',
__( 'End Time', 'jet-popup' ),
$settings[ 'jet_popup_on_time_end_value' ]
);
break;
case 'custom-selector':
$verbose .= sprintf( '',
__( 'Custom selector', 'jet-popup' ),
$settings[ 'jet_popup_custom_selector' ]
);
break;
}
$verbose .= sprintf( '',
__( 'Animation type', 'jet-popup' ),
$animation_list[ $animation_type ]
);
$verbose .= sprintf( '',
__( 'Loading content with Ajax', 'jet-popup' ),
$use_ajax ? 'enable-label' : 'disable-label',
$use_ajax ? __( 'Yes', 'jet-popup' ) : __( 'No', 'jet-popup' )
);
$verbose .= sprintf( '',
__( '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( '',
__( 'Disable page scrolling', 'jet-popup' ),
$prevent_scrolling ? 'enable-label' : 'disable-label',
$prevent_scrolling ? __( 'Yes', 'jet-popup' ) : __( 'No', 'jet-popup' )
);
$verbose .= sprintf( '',
__( '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( '',
__( '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;
}
}
}