initial
This commit is contained in:
@@ -0,0 +1,735 @@
|
||||
<?php
|
||||
/**
|
||||
* This file displays our block elements on the site.
|
||||
*
|
||||
* @package GP Premium
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // No direct access, please.
|
||||
}
|
||||
|
||||
/**
|
||||
* Class GeneratePress_Pro_Site_Editor
|
||||
*/
|
||||
class GenerateBlocks_Pro_Overlays extends GenerateBlocks_Pro_Singleton {
|
||||
/**
|
||||
* Initialize the class filters.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function init() {
|
||||
// Don't initialize if overlays are disabled.
|
||||
if ( ! generateblocks_pro_overlays_enabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
|
||||
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) );
|
||||
add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_block_editor_assets' ), 8 );
|
||||
add_filter( 'block_editor_settings_all', array( $this, 'editor_css' ), 15 );
|
||||
add_action( 'admin_bar_menu', array( $this, 'add_admin_bar' ), 100 );
|
||||
add_filter( 'generateblocks_dashboard_tabs', [ $this, 'dashboard_tab' ] );
|
||||
add_filter( 'generateblocks_dashboard_screens', [ $this, 'dashboard_screen' ] );
|
||||
add_action( 'init', [ $this, 'register_post_meta' ] );
|
||||
add_action( 'rest_api_init', [ $this, 'register_rest' ] );
|
||||
add_action( 'save_post_gblocks_overlay', [ $this, 'save_post' ] );
|
||||
add_action( 'delete_post', [ $this, 'delete_post' ] );
|
||||
add_action( 'transition_post_status', [ $this, 'transition_post_status' ], 10, 3 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default values for overlay meta fields.
|
||||
*
|
||||
* @return array Default values.
|
||||
*/
|
||||
public static function get_meta_defaults() {
|
||||
return array(
|
||||
'_gb_overlay_display_condition' => '',
|
||||
'_gb_overlay_display_condition_invert' => false,
|
||||
'_gb_overlay_trigger_type' => 'click',
|
||||
'_gb_overlay_type' => 'standard',
|
||||
'_gb_overlay_placement' => 'bottom-start',
|
||||
'_gb_overlay_backdrop' => true,
|
||||
'_gb_overlay_backdrop_color' => 'rgba(0, 0, 0, 0.5)',
|
||||
'_gb_overlay_backdrop_blur' => '',
|
||||
'_gb_overlay_animation_in' => '',
|
||||
'_gb_overlay_animation_out' => '',
|
||||
'_gb_overlay_animation_duration' => '',
|
||||
'_gb_overlay_animation_target' => '',
|
||||
'_gb_overlay_animation_distance' => '',
|
||||
'_gb_overlay_scroll_percent' => '',
|
||||
'_gb_overlay_time_delay' => '',
|
||||
'_gb_overlay_cookie_duration' => '',
|
||||
'_gb_overlay_close_on_esc' => true,
|
||||
'_gb_overlay_close_on_click_outside' => true,
|
||||
'_gb_overlay_disable_page_scroll' => false,
|
||||
'_gb_overlay_position' => 'center',
|
||||
'_gb_overlay_custom_event' => '',
|
||||
'_gb_overlay_hide_if_cookies_disabled' => false,
|
||||
'_gb_overlay_position_to_parent' => '',
|
||||
'_gb_overlay_hover_buffer' => '20',
|
||||
'_gb_overlay_width_mode' => '',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register our post meta.
|
||||
*/
|
||||
public function register_post_meta() {
|
||||
$defaults = self::get_meta_defaults();
|
||||
|
||||
$meta_fields = array(
|
||||
'_gb_overlay_display_condition' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_display_condition_invert' => array(
|
||||
'type' => 'boolean',
|
||||
'sanitize_callback' => 'rest_sanitize_boolean',
|
||||
),
|
||||
'_gb_overlay_trigger_type' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
$allowed = [ 'click', 'hover', 'both', 'exit-intent', 'scroll', 'time', 'custom' ];
|
||||
return in_array( $value, $allowed ) ? $value : 'click';
|
||||
},
|
||||
),
|
||||
'_gb_overlay_type' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_placement' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_backdrop' => array(
|
||||
'type' => 'boolean',
|
||||
'sanitize_callback' => 'rest_sanitize_boolean',
|
||||
),
|
||||
'_gb_overlay_backdrop_color' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_backdrop_blur' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_animation_in' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_animation_out' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_animation_duration' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
return '' === $value ? '' : absint( $value );
|
||||
},
|
||||
),
|
||||
'_gb_overlay_animation_target' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_animation_distance' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_scroll_percent' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
return '' === $value ? '' : max( 0, min( 100, absint( $value ) ) );
|
||||
},
|
||||
),
|
||||
'_gb_overlay_time_delay' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
return '' === $value ? '' : absint( $value );
|
||||
},
|
||||
),
|
||||
'_gb_overlay_cookie_duration' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
return '' === $value ? '' : absint( $value );
|
||||
},
|
||||
),
|
||||
'_gb_overlay_close_on_esc' => array(
|
||||
'type' => 'boolean',
|
||||
'sanitize_callback' => 'rest_sanitize_boolean',
|
||||
),
|
||||
'_gb_overlay_close_on_click_outside' => array(
|
||||
'type' => 'boolean',
|
||||
'sanitize_callback' => 'rest_sanitize_boolean',
|
||||
),
|
||||
'_gb_overlay_disable_page_scroll' => array(
|
||||
'type' => 'boolean',
|
||||
'sanitize_callback' => 'rest_sanitize_boolean',
|
||||
),
|
||||
'_gb_overlay_position' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
$allowed = [ 'center', 'top-left', 'top-center', 'top-right', 'center-left', 'center-right', 'bottom-left', 'bottom-center', 'bottom-right' ];
|
||||
return in_array( $value, $allowed ) ? $value : 'center';
|
||||
},
|
||||
),
|
||||
'_gb_overlay_custom_event' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_hide_if_cookies_disabled' => array(
|
||||
'type' => 'boolean',
|
||||
'sanitize_callback' => 'rest_sanitize_boolean',
|
||||
),
|
||||
'_gb_overlay_position_to_parent' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
),
|
||||
'_gb_overlay_hover_buffer' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
return '' === $value ? '' : max( 0, min( 100, absint( $value ) ) );
|
||||
},
|
||||
),
|
||||
'_gb_overlay_width_mode' => array(
|
||||
'type' => 'string',
|
||||
'sanitize_callback' => function ( $value ) {
|
||||
$allowed = [ '', 'full' ];
|
||||
return in_array( $value, $allowed ) ? $value : '';
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
foreach ( $meta_fields as $key => $args ) {
|
||||
register_post_meta(
|
||||
'gblocks_overlay',
|
||||
$key,
|
||||
array(
|
||||
'single' => true,
|
||||
'type' => $args['type'],
|
||||
'auth_callback' => static function() {
|
||||
return GenerateBlocks_Pro_Overlays::current_user_can_use_overlays( 'manage' );
|
||||
},
|
||||
'sanitize_callback' => $args['sanitize_callback'],
|
||||
'show_in_rest' => true,
|
||||
'default' => $defaults[ $key ],
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get overlay meta with proper defaults.
|
||||
* This uses WordPress's built-in caching, so multiple calls are efficient.
|
||||
*
|
||||
* @param int $post_id Post ID.
|
||||
* @param string $meta_key Meta key.
|
||||
* @return mixed Meta value or default.
|
||||
*/
|
||||
public static function get_overlay_meta( $post_id, $meta_key ) {
|
||||
$defaults = self::get_meta_defaults();
|
||||
|
||||
// Check if meta exists in database.
|
||||
$meta_exists = metadata_exists( 'post', $post_id, $meta_key );
|
||||
|
||||
if ( ! $meta_exists && isset( $defaults[ $meta_key ] ) ) {
|
||||
// Meta doesn't exist, return default.
|
||||
return $defaults[ $meta_key ];
|
||||
}
|
||||
|
||||
// Meta exists, get the value.
|
||||
$value = get_post_meta( $post_id, $meta_key, true );
|
||||
|
||||
// For boolean fields, properly convert WordPress storage to boolean.
|
||||
// WordPress stores: true as '1', false as '' (empty string).
|
||||
if ( isset( $defaults[ $meta_key ] ) && is_bool( $defaults[ $meta_key ] ) ) {
|
||||
return '1' === $value;
|
||||
}
|
||||
|
||||
// For string/number fields, if empty and has default, return default.
|
||||
if ( '' === $value && isset( $defaults[ $meta_key ] ) && ! is_bool( $defaults[ $meta_key ] ) ) {
|
||||
return $defaults[ $meta_key ];
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all overlay meta at once for better performance.
|
||||
* WordPress caches all meta after first query, but this can be more convenient.
|
||||
*
|
||||
* @param int $post_id Post ID.
|
||||
* @return array All overlay meta with defaults applied.
|
||||
*/
|
||||
public static function get_all_overlay_meta( $post_id ) {
|
||||
$defaults = self::get_meta_defaults();
|
||||
$meta = array();
|
||||
|
||||
foreach ( $defaults as $key => $default ) {
|
||||
$meta[ $key ] = self::get_overlay_meta( $post_id, $key );
|
||||
}
|
||||
|
||||
return $meta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the REST field for the admin edit URL.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register_rest() {
|
||||
register_rest_field(
|
||||
'gblocks_overlay',
|
||||
'admin_edit_url',
|
||||
array(
|
||||
'get_callback' => function ( $post_object ) {
|
||||
if ( current_user_can( 'edit_post', $post_object['id'] ) ) {
|
||||
return get_edit_post_link( $post_object['id'], 'raw' );
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
'schema' => array(
|
||||
'description' => 'Admin URL to edit the post.',
|
||||
'type' => 'string',
|
||||
'format' => 'uri',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
register_rest_field(
|
||||
'gblocks_overlay',
|
||||
'trigger_info',
|
||||
array(
|
||||
'get_callback' => function ( $post_object ) {
|
||||
$trigger_type = self::get_overlay_meta( $post_object['id'], '_gb_overlay_trigger_type' );
|
||||
|
||||
// Only return data for interactive overlays.
|
||||
if ( ! in_array( $trigger_type, array( 'click', 'hover', 'both' ), true ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return array(
|
||||
'trigger_type' => $trigger_type,
|
||||
'is_interactive' => true,
|
||||
);
|
||||
},
|
||||
'schema' => array(
|
||||
'description' => 'Overlay trigger information for block editor.',
|
||||
'type' => 'object',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
'properties' => array(
|
||||
'trigger_type' => array(
|
||||
'type' => 'string',
|
||||
'enum' => array( 'click', 'hover', 'both' ),
|
||||
),
|
||||
'is_interactive' => array(
|
||||
'type' => 'boolean',
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
add_filter( 'rest_gblocks_overlay_collection_params', array( $this, 'increase_overlay_collection_limit' ), 10, 1 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Increase the per_page limit for overlay collections.
|
||||
* This is the proper WordPress way to handle this.
|
||||
*
|
||||
* @param array $params Collection parameters.
|
||||
* @return array Modified parameters.
|
||||
*/
|
||||
public function increase_overlay_collection_limit( $params ) {
|
||||
// Increase limit to reasonable amount (not unlimited).
|
||||
if ( isset( $params['per_page'] ) ) {
|
||||
$params['per_page']['maximum'] = 200; // Reasonable limit for overlays.
|
||||
$params['per_page']['default'] = 100; // Keep default reasonable.
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the capability required for overlays.
|
||||
*
|
||||
* @since 2.4.0
|
||||
* @param string $context The context: 'use' (select existing) or 'manage' (create/edit/dashboard).
|
||||
* @return string The capability required.
|
||||
*/
|
||||
public static function get_overlays_capability( $context = 'use' ) {
|
||||
// Default capabilities.
|
||||
if ( 'manage' === $context ) {
|
||||
// Can create/edit/access dashboard - default to manage_options.
|
||||
$capability = 'manage_options';
|
||||
} else {
|
||||
// Can select/use existing overlays - anyone who can edit posts.
|
||||
$capability = 'edit_posts';
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the capability required for overlays.
|
||||
*
|
||||
* @since 2.4.0
|
||||
* @param string $capability The capability required.
|
||||
* @param string $context The context: 'use' or 'manage'.
|
||||
*/
|
||||
return apply_filters( 'generateblocks_overlays_capability', $capability, $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if current user can use overlays.
|
||||
*
|
||||
* @since 2.4.0
|
||||
* @param string $context The context: 'use' (select existing) or 'manage' (create/edit/dashboard).
|
||||
* @return bool
|
||||
*/
|
||||
public static function current_user_can_use_overlays( $context = 'use' ) {
|
||||
$capability = self::get_overlays_capability( $context );
|
||||
return current_user_can( $capability );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the Site Editor menu item.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function admin_menu() {
|
||||
// Get the required capability.
|
||||
$capability = self::get_overlays_capability( 'manage' );
|
||||
|
||||
// Only add menu if user has permission.
|
||||
if ( ! current_user_can( $capability ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
add_submenu_page(
|
||||
'generateblocks',
|
||||
__( 'Overlay Panels', 'generateblocks-pro' ),
|
||||
__( 'Overlay Panels', 'generateblocks-pro' ),
|
||||
$capability,
|
||||
'generateblocks-overlay-panels',
|
||||
array( $this, 'render_page' ),
|
||||
4
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the Site Editor page.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function render_page() {
|
||||
// Double-check permission before rendering.
|
||||
if ( ! self::current_user_can_use_overlays( 'manage' ) ) {
|
||||
wp_die( esc_html__( 'Sorry, you are not allowed to access this page.', 'generateblocks-pro' ) );
|
||||
}
|
||||
?>
|
||||
<div class="wrap gblocks-dashboard-wrap">
|
||||
<div class="generateblocks-settings-area generateblocks-overlay-panels-area">
|
||||
<div id="gblocks-overlays"></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue the admin assets.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function enqueue_admin_assets() {
|
||||
$screen = get_current_screen();
|
||||
|
||||
if ( 'generateblocks_page_generateblocks-overlay-panels' !== $screen->id ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$assets = generateblocks_pro_get_enqueue_assets( 'overlay-dashboard' );
|
||||
|
||||
wp_enqueue_script(
|
||||
'gb-overlay-dashboard',
|
||||
GENERATEBLOCKS_PRO_DIR_URL . 'dist/overlay-dashboard.js',
|
||||
$assets['dependencies'],
|
||||
$assets['version'],
|
||||
true
|
||||
);
|
||||
|
||||
wp_enqueue_style(
|
||||
'gb-overlay-dashboard',
|
||||
GENERATEBLOCKS_PRO_DIR_URL . 'dist/overlay-dashboard.css',
|
||||
array( 'wp-components', 'generateblocks-pro-dashboard-table' ),
|
||||
GENERATEBLOCKS_PRO_VERSION
|
||||
);
|
||||
|
||||
wp_localize_script(
|
||||
'gb-overlay-dashboard',
|
||||
'gbOverlaysDashboard',
|
||||
array(
|
||||
'newOverlayUrl' => admin_url( 'post-new.php?post_type=gblocks_overlay' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue the block editor assets.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function enqueue_block_editor_assets() {
|
||||
if ( 'gblocks_overlay' !== get_post_type() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$assets = generateblocks_pro_get_enqueue_assets( 'overlay-editor' );
|
||||
|
||||
wp_enqueue_script(
|
||||
'gb-overlay-editor',
|
||||
GENERATEBLOCKS_PRO_DIR_URL . 'dist/overlay-editor.js',
|
||||
$assets['dependencies'],
|
||||
$assets['version'],
|
||||
true
|
||||
);
|
||||
|
||||
wp_enqueue_style(
|
||||
'gb-overlay-editor',
|
||||
GENERATEBLOCKS_PRO_DIR_URL . 'dist/overlay-editor.css',
|
||||
array( 'wp-components' ),
|
||||
GENERATEBLOCKS_PRO_VERSION
|
||||
);
|
||||
|
||||
wp_localize_script(
|
||||
'gb-overlay-editor',
|
||||
'gbOverlayDefaults',
|
||||
self::get_meta_defaults()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* This resets the `max-width`, `margin-left`, and `margin-right` properties for our blocks in the editor.
|
||||
* We have to do this as most themes use `.wp-block` to set a `max-width` and auto margins.
|
||||
*
|
||||
* We used to do this directly in the block CSS if those block attributes didn't exist, but this allows us
|
||||
* to overwrite the reset in the `block_editor_settings_all` filter with a later priority.
|
||||
*
|
||||
* @param array $editor_settings The existing editor settings.
|
||||
*/
|
||||
public function editor_css( $editor_settings ) {
|
||||
if ( 'gblocks_overlay' === get_post_type() ) {
|
||||
$post_id = get_the_ID();
|
||||
$width_mode = self::get_overlay_meta( $post_id, '_gb_overlay_width_mode' );
|
||||
|
||||
$css = '.is-root-container {max-width: calc(100% - 20px);margin-left: auto;margin-right:auto;}';
|
||||
$css .= '.editor-styles-wrapper {--content-width: 100% !important;}';
|
||||
|
||||
// Add width mode specific styles.
|
||||
if ( 'full' === $width_mode ) {
|
||||
$css .= '.is-root-container {width: 100%;}';
|
||||
} else {
|
||||
$css .= '.is-root-container {width: max-content;min-width: 300px;}';
|
||||
}
|
||||
|
||||
$editor_settings['styles'][] = [ 'css' => $css ];
|
||||
}
|
||||
|
||||
return $editor_settings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the Elementd admin bar item.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*/
|
||||
public function add_admin_bar() {
|
||||
if ( ! self::current_user_can_use_overlays( 'manage' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
global $wp_admin_bar;
|
||||
global $gb_overlays;
|
||||
|
||||
$title = __( 'Overlay Panels', 'generateblocks-pro' );
|
||||
$count = ! empty( $gb_overlays ) ? count( $gb_overlays ) : 0;
|
||||
|
||||
// Prevent "Entire Site" Elements from being counted on non-edit pages in the admin.
|
||||
if ( is_admin() && function_exists( 'get_current_screen' ) ) {
|
||||
$screen = get_current_screen();
|
||||
|
||||
if ( ! isset( $screen->is_block_editor ) || ! $screen->is_block_editor ) {
|
||||
$count = 0;
|
||||
}
|
||||
|
||||
if ( 'edit' !== $screen->parent_base ) {
|
||||
$count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $count > 0 ) {
|
||||
$title = sprintf(
|
||||
/* translators: Active Element count. */
|
||||
__( 'Overlay Panels (%s)', 'generateblocks-pro' ),
|
||||
$count
|
||||
);
|
||||
}
|
||||
|
||||
$wp_admin_bar->add_menu(
|
||||
array(
|
||||
'id' => 'gb_overlays-menu',
|
||||
'title' => $title,
|
||||
'href' => esc_url( admin_url( 'edit.php?post_type=gblocks_overlay' ) ),
|
||||
)
|
||||
);
|
||||
|
||||
if ( ! empty( $gb_overlays ) ) {
|
||||
// Prevent "Entire Site" Elements from being counted on non-edit pages in the admin.
|
||||
if ( is_admin() && function_exists( 'get_current_screen' ) ) {
|
||||
$screen = get_current_screen();
|
||||
|
||||
if ( ! isset( $screen->is_block_editor ) || ! $screen->is_block_editor ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( 'edit' !== $screen->parent_base ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( (array) $gb_overlays as $key => $data ) {
|
||||
$wp_admin_bar->add_menu(
|
||||
array(
|
||||
'id' => 'template-' . absint( $data['id'] ),
|
||||
'parent' => 'gb_overlays-menu',
|
||||
'title' => get_the_title( $data['id'] ),
|
||||
'href' => get_edit_post_link( $data['id'] ),
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the Site Editor tab to our Dashboard tabs.
|
||||
*
|
||||
* @param array $tabs Existing tabs.
|
||||
* @return array New tabs.
|
||||
*/
|
||||
public function dashboard_tab( $tabs ) {
|
||||
$screen = get_current_screen();
|
||||
|
||||
$tabs['Overlay Panels'] = array(
|
||||
'name' => __( 'Overlay Panels', 'generateblocks-pro' ),
|
||||
'url' => admin_url( 'admin.php?page=generateblocks-overlay-panels' ),
|
||||
'class' => 'generateblocks_page_generateblocks-overlay-panels' === $screen->id ? 'active' : '',
|
||||
);
|
||||
|
||||
return $tabs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the Site Editor tab to our Dashboard screens.
|
||||
*
|
||||
* @param array $screens Existing screens.
|
||||
* @return array New screens.
|
||||
*/
|
||||
public function dashboard_screen( $screens ) {
|
||||
$screens[] = 'generateblocks_page_generateblocks-overlay-panels';
|
||||
|
||||
return $screens;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all overlays.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function get_overlays() {
|
||||
// Return empty array if overlays are disabled.
|
||||
if ( ! generateblocks_pro_overlays_enabled() ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$overlays = get_posts(
|
||||
array(
|
||||
'post_type' => 'gblocks_overlay',
|
||||
'posts_per_page' => 500, // phpcs:ignore -- Limit to 500 for performance.
|
||||
'post_status' => 'publish',
|
||||
)
|
||||
);
|
||||
|
||||
if ( empty( $overlays ) ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
return array_map(
|
||||
function ( $overlay ) {
|
||||
return array(
|
||||
'title' => $overlay->post_title,
|
||||
'id' => $overlay->ID,
|
||||
'type' => get_post_meta( $overlay->ID, '_gb_overlay_type', true ),
|
||||
);
|
||||
},
|
||||
$overlays
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save post callback for overlays.
|
||||
*
|
||||
* This is used to clear the dynamic CSS cache when a overlay is saved.
|
||||
*
|
||||
* @param int $post_id The post ID being saved.
|
||||
*/
|
||||
public function save_post( $post_id ) {
|
||||
// If this is an autosave, do nothing.
|
||||
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is not a overlay post type, do nothing.
|
||||
if ( get_post_type( $post_id ) !== 'gblocks_overlay' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
update_option( 'generateblocks_dynamic_css_posts', [] );
|
||||
|
||||
// Clear overlay cache when any overlay is saved.
|
||||
generateblocks_pro_clear_overlay_cache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete post callback for overlays.
|
||||
*
|
||||
* @param int $post_id The post ID being deleted.
|
||||
*/
|
||||
public function delete_post( $post_id ) {
|
||||
if ( get_post_type( $post_id ) !== 'gblocks_overlay' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear overlay cache when any overlay is deleted.
|
||||
generateblocks_pro_clear_overlay_cache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Transition post status callback for overlays.
|
||||
*
|
||||
* @param string $new_status New post status.
|
||||
* @param string $old_status Old post status.
|
||||
* @param WP_Post $post Post object.
|
||||
*/
|
||||
public function transition_post_status( $new_status, $old_status, $post ) {
|
||||
if ( 'gblocks_overlay' !== $post->post_type ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear cache when overlay status changes.
|
||||
if ( $new_status !== $old_status ) {
|
||||
generateblocks_pro_clear_overlay_cache();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GenerateBlocks_Pro_Overlays::get_instance()->init();
|
||||
Reference in New Issue
Block a user