Files
hub-insurance/wp-content/plugins/generateblocks-pro/includes/class-global-styles.php
T
2026-07-02 15:54:39 -06:00

304 lines
9.5 KiB
PHP

<?php
/**
* Handle post types in GenerateBlocks Pro.
*
* @package GenerateBlocks Pro
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* The Local templates class.
*/
class GenerateBlocks_Pro_Global_Styles {
/**
* Instance.
*
* @access private
* @var object Instance
*/
private static $instance;
/**
* Initiator.
*
* @return object initialized object of class.
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Initiate class.
*/
public function __construct() {
// Disable this deprecated feature if no posts exist.
// We run this if `is_admin()` as we don't want the query on the frontend.
if ( is_admin() ) {
$global_styles = get_posts(
[
'post_type' => 'gblocks_global_style',
'post_status' => [ 'any', 'trash' ],
'posts_per_page' => 1,
'fields' => 'ids',
]
);
if ( 0 === count( (array) $global_styles ) ) {
add_option( 'generateblocks_global_styles', array(), '', true );
$viewing_post_type = isset( $_GET['post_type'] ) && 'gblocks_global_style' === sanitize_text_field( $_GET['post_type'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( $viewing_post_type ) {
// Prevent an "invalid post type" error when deleting the last global style.
add_action( 'init', array( $this, 'add_custom_post_types' ), 100 );
}
return;
}
} else {
// If we have no Global Styles on the frontend, we can bail now.
$global_styles = get_option( 'generateblocks_global_styles', array() );
if ( empty( $global_styles ) ) {
return;
}
}
add_action( 'init', array( $this, 'add_custom_post_types' ), 100 );
add_action( 'save_post_gblocks_global_style', array( $this, 'build_css' ), 10, 2 );
add_filter( 'generateblocks_do_content', array( $this, 'do_blocks' ) );
add_filter( 'generateblocks_headline_selector_tagname', array( $this, 'change_headline_selector' ), 10, 2 );
add_filter( 'generateblocks_dashboard_screens', array( $this, 'add_to_dashboard_pages' ) );
add_filter( 'views_edit-gblocks_global_style', array( $this, 'deprecation_notice' ) );
}
/**
* Register custom post type.
*/
public function add_custom_post_types() {
register_post_type(
'gblocks_global_style',
array(
'labels' => array(
'name' => _x( 'Global Styles (Legacy)', 'Post Type General Name', 'generateblocks-pro' ),
'singular_name' => _x( 'Global Style', 'Post Type Singular Name', 'generateblocks-pro' ),
'menu_name' => __( 'Global Styles', 'generateblocks-pro' ),
'parent_item_colon' => __( 'Parent Global Style', 'generateblocks-pro' ),
'all_items' => __( 'Global Styles', 'generateblocks-pro' ),
'view_item' => __( 'View Global Style', 'generateblocks-pro' ),
'add_new_item' => __( 'Add New Global Style', 'generateblocks-pro' ),
'add_new' => __( 'Add New', 'generateblocks-pro' ),
'edit_item' => __( 'Edit Global Style', 'generateblocks-pro' ),
'update_item' => __( 'Update Global Style', 'generateblocks-pro' ),
'search_items' => __( 'Search Global Style', 'generateblocks-pro' ),
'not_found' => __( 'Not Found', 'generateblocks-pro' ),
'not_found_in_trash' => __( 'Not found in Trash', 'generateblocks-pro' ),
),
'public' => false,
'publicly_queryable' => false,
'has_archive' => false,
'show_ui' => true,
'exclude_from_search' => true,
'show_in_nav_menus' => false,
'rewrite' => false,
'hierarchical' => false,
'show_in_menu' => false,
'show_in_admin_bar' => true,
'show_in_rest' => true,
'capabilities' => array(
'create_posts' => false,
'publish_posts' => 'manage_options',
'edit_posts' => 'manage_options',
'edit_others_posts' => 'manage_options',
'delete_posts' => 'manage_options',
'delete_others_posts' => 'manage_options',
'read_private_posts' => 'manage_options',
'edit_post' => 'manage_options',
'delete_post' => 'manage_options',
'read_post' => 'manage_options',
),
'supports' => array(
'title',
'editor',
'thumbnail',
),
)
);
}
/**
* Add to our Dashboard pages.
*
* @since 1.0.0
* @param array $pages The existing pages.
*/
public function add_to_dashboard_pages( $pages ) {
$pages[] = 'edit-gblocks_global_style';
return $pages;
}
/**
* Build our global CSS.
*
* @since 1.0.0
* @param int $post_id The post ID.
* @param object $post The post.
*/
public function build_css( $post_id, $post ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
$global_styles = get_option( 'generateblocks_global_styles', array() );
$global_style_attrs = get_option( 'generateblocks_global_style_attrs', array() );
// Set our content for this global style page.
$global_styles[ $post_id ]['content'] = $post->post_content;
$parsed_content = parse_blocks( $post->post_content );
$block_data = generateblocks_get_block_data( $parsed_content );
$defaults = generateblocks_get_block_defaults();
// Empty our global style IDs so they can be re-populated.
$global_style_attrs[ $post_id ]['ids'] = array();
// Remove IDs from our front-end data as it's not needed anymore.
if ( isset( $global_styles[ $post_id ]['ids'] ) ) {
unset( $global_styles[ $post_id ]['ids'] );
}
// Save all of our attribute values so we can use them in the editor.
foreach ( (array) $block_data as $name => $data ) {
if ( ! empty( $data ) && is_array( $data ) ) {
foreach ( $data as $attributes ) {
$defaultBlockName = 'container';
if ( 'button' === $name ) {
$defaultBlockName = 'button';
} elseif ( 'button-container' === $name ) {
$defaultBlockName = 'buttonContainer';
} elseif ( 'headline' === $name ) {
$defaultBlockName = 'headline';
} elseif ( 'grid' === $name ) {
$defaultBlockName = 'gridContainer';
}
// Save block defaults as values.
foreach ( $defaults[ $defaultBlockName ] as $key => $value ) {
if ( ! array_key_exists( $key, $attributes ) && ( ! empty( $value ) || 0 === $value ) ) {
$attributes[ $key ] = $value;
}
}
if ( ! isset( $global_style_attrs[ $post_id ]['ids'][ $name ] ) ) {
$global_style_attrs[ $post_id ]['ids'][ $name ][ $attributes['uniqueId'] ] = array();
}
if ( isset( $attributes['uniqueId'] ) ) {
$global_style_attrs[ $post_id ]['ids'][ $name ][ $attributes['uniqueId'] ] = $attributes;
}
}
}
}
if ( 'publish' !== $post->post_status ) {
unset( $global_styles[ $post_id ] );
unset( $global_style_attrs[ $post_id ] );
}
// Force regenerate our static CSS files.
update_option( 'generateblocks_dynamic_css_posts', array() );
update_option( 'generateblocks_global_styles', $global_styles );
update_option( 'generateblocks_global_style_attrs', $global_style_attrs );
}
/**
* Tell GB about our styles.
*
* @param string $content The existing content.
*/
public function do_blocks( $content ) {
$global_styles = get_option( 'generateblocks_global_styles', array() );
foreach ( (array) $global_styles as $id => $data ) {
$content = $data['content'] . $content;
}
return $content;
}
/**
* Remove the tagname from our global style Headline selectors.
*
* @param boolean $do Whether to include the tagname or not.
* @param array $atts The attributes for the block.
*/
public function change_headline_selector( $do, $atts ) {
if ( isset( $atts['isGlobalStyle'] ) && $atts['isGlobalStyle'] ) {
$do = false;
}
return $do;
}
/**
* Show a deprecation notice in our post type.
*
* @param string $views Existing text in this filter.
*/
public function deprecation_notice( $views ) {
?>
<style>
.gb-deprecation-notice {
background: #fef8ee;
border-left: 5px solid #f0b849;
padding: 20px;
margin: 20px 0;
}
.gb-deprecation-notice p {
margin-top: 0;
}
.gb-deprecation-notice p:last-child {
margin-bottom: 0;
}
</style>
<div class="gb-deprecation-notice">
<p><?php esc_html_e( 'This Global Styles system has been deprecated. You can still edit and use existing styles, but you cannot add new ones.', 'generateblocks-pro' ); ?></p>
<p>
<?php
printf(
/* translators: %1$s and %2$s are placeholders for the opening and closing anchor tags */
esc_html__(
'Please use the new %1$sGlobal Styles%2$s system instead.',
'generateblocks-pro'
),
'<a href="' . esc_url( admin_url( 'admin.php?page=generateblocks-styles' ) ) . '">',
'</a>'
);
?>
</p>
<p>
<a href="https://docs.generateblocks.com/article/global-styles-overview/" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Learn more about the new Global Styles', 'generateblocks-pro' ); ?> <svg xmlns="http://www.w3.org/2000/svg" style="fill: currentColor;width: 15px;height:15px;position: relative;top: 3px;left: 3px;" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><path d="M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z"></path></svg></a></p>
</div>
<?php
return $views;
}
}
GenerateBlocks_Pro_Global_Styles::get_instance();