File manager - Edit - /home/matthif/www/wp-content-20260615172829/plugins/advanced-gutenberg/incl/advanced-gutenberg-main.php
Back
<?php use PublishPress\Blocks\Utilities; defined( 'ABSPATH' ) || die; /** * Main class of Gutenberg Advanced */ if ( ! class_exists( 'AdvancedGutenbergMain' ) ) { class AdvancedGutenbergMain { /** * Default role access * * @var array Array of default role access */ public static $default_roles_access = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ); /** * Default active all blocks * * @var string All blocks */ public static $default_active_blocks = 'all'; /** * Default custom styles * * @var array Default custom styles for first install */ public static $default_custom_styles = array( 0 => array( 'id' => 1, 'title' => 'Blue message', 'name' => 'blue-message', 'identifyColor' => '#3399ff', 'css' => 'background: none repeat scroll 0 0 #3399ff; color: #ffffff; text-shadow: none; font-size: 16px; line-height: 24px; padding: 10px;' ), 1 => array( 'id' => 2, 'title' => 'Green message', 'name' => 'green-message', 'identifyColor' => '#8cc14c', 'css' => 'background: none repeat scroll 0 0 #8cc14c; color: #ffffff; text-shadow: none; font-size: 16px; line-height: 24px; padding: 10px;' ), 2 => array( 'id' => 3, 'title' => 'Orange message', 'name' => 'orange-message', 'identifyColor' => '#faa732', 'css' => 'background: none repeat scroll 0 0 #faa732; color: #ffffff; text-shadow: none; font-size: 16px; line-height: 24px; padding: 10px;' ), 3 => array( 'id' => 4, 'title' => 'Red message', 'name' => 'red-message', 'identifyColor' => '#da4d31', 'css' => 'background: none repeat scroll 0 0 #da4d31; color: #ffffff; text-shadow: none; font-size: 16px; line-height: 24px; padding: 10px;' ), 4 => array( 'id' => 5, 'title' => 'Grey message', 'name' => 'grey-message', 'identifyColor' => '#53555c', 'css' => 'background: none repeat scroll 0 0 #53555c; color: #ffffff; text-shadow: none; font-size: 16px; line-height: 24px; padding: 10px;' ), 5 => array( 'id' => 6, 'title' => 'Left block', 'name' => 'left-block', 'identifyColor' => '#ff00ff', 'css' => 'background: none repeat scroll 0 0px, radial-gradient(ellipse at center center, #ffffff 0%, #f2f2f2 100%) repeat scroll 0 0 rgba(0, 0, 0, 0); color: #8b8e97; padding: 10px; margin: 10px; float: left;' ), 6 => array( 'id' => 7, 'title' => 'Right block', 'name' => 'right-block', 'identifyColor' => '#00ddff', 'css' => 'background: none repeat scroll 0 0px, radial-gradient(ellipse at center center, #ffffff 0%, #f2f2f2 100%) repeat scroll 0 0 rgba(0, 0, 0, 0); color: #8b8e97; padding: 10px; margin: 10px; float: right;' ), 7 => array( 'id' => 8, 'title' => 'Blockquotes', 'name' => 'blockquotes', 'identifyColor' => '#cccccc', 'css' => 'background: none; border-left: 5px solid #f1f1f1; color: #8B8E97; font-size: 16px; font-style: italic; line-height: 22px; padding-left: 15px; padding: 10px; width: 60%; float: left;' ) ); /** * Store original editor settings value, before we modify it to allow/hide blocks based on user roles * * @var string Original settings */ protected static $original_block_editor_settings; /** * AdvancedGutenbergMain constructor. */ public function __construct() { global $wp_version; add_action( 'init', array( $this, 'registerPostMeta' ) ); add_action( 'admin_init', array( $this, 'registerStylesScripts' ) ); add_action( 'wp_loaded', [ 'PublishPress\Blocks\Controls', 'addAttributes' ], 999 ); add_filter( 'rest_pre_dispatch', [ 'PublishPress\Blocks\Controls', 'removeAttributes' ], 10, 3 ); add_action( 'wp_enqueue_scripts', array( $this, 'registerStylesScriptsFrontend' ) ); add_action( 'enqueue_block_assets', array( $this, 'addEditorAndFrontendStyles' ), 9999 ); add_action( 'plugins_loaded', array( $this, 'advgbBlockLoader' ), 10 ); add_action( 'rest_api_init', array( $this, 'registerRestAPI' ) ); add_action( 'admin_print_scripts', array( $this, 'disableAllAdminNotices' ) ); // Disable all admin notice for page belong to plugin add_action( 'wp_login_failed', array( $this, 'handleLoginFailed' ) ); add_filter( 'safe_style_css', array( $this, 'addAllowedInlineStyles' ), 10, 1 ); add_filter( 'wp_kses_allowed_html', array( $this, 'addAllowedTags' ), 1 ); // Front-end ajax add_action( 'wp_ajax_advgb_contact_form_save', array( $this, 'saveContactFormData' ) ); add_action( 'wp_ajax_nopriv_advgb_contact_form_save', array( $this, 'saveContactFormData' ) ); add_action( 'wp_ajax_advgb_newsletter_save', array( $this, 'saveNewsletterData' ) ); add_action( 'wp_ajax_nopriv_advgb_newsletter_save', array( $this, 'saveNewsletterData' ) ); add_action( 'wp_ajax_advgb_lores_validate', array( $this, 'validateLoresForm' ) ); add_action( 'wp_ajax_nopriv_advgb_lores_validate', array( $this, 'validateLoresForm' ) ); if ( is_admin() ) { add_action( 'admin_footer', array( $this, 'initBlocksList' ) ); add_action( 'admin_menu', array( $this, 'registerMainMenu' ) ); add_action( 'admin_menu', array( $this, 'registerBlockConfigPage' ) ); add_action( 'plugins_loaded', [ $this, 'upgradeProNotices' ], 10 ); add_action( 'enqueue_block_editor_assets', array( $this, 'addEditorAssets' ), 9999 ); add_filter( 'mce_external_plugins', array( $this, 'addTinyMceExternal' ) ); add_filter( 'mce_buttons_2', array( $this, 'addTinyMceButtons' ) ); add_filter( 'admin_body_class', array( $this, 'setAdvgEditorBodyClassses' ) ); add_filter( 'admin_footer_text', [ $this, 'adminFooter' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'adminMenuStyles' ] ); add_action( 'activated_plugin', [ $this, 'maybeNewBlocks' ], 9999, 2 ); if ( $wp_version >= 5.8 ) { add_action( 'admin_enqueue_scripts', array( $this, 'addEditorAssetsWidgets' ), 9999 ); add_filter( 'block_editor_settings_all', array( $this, 'replaceEditorSettings' ), 9999 ); if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { add_filter( 'block_categories_all', array( $this, 'addAdvBlocksCategory' ) ); } } else { add_filter( 'block_editor_settings', array( $this, 'replaceEditorSettings' ), 9999 ); if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { add_filter( 'block_categories', array( $this, 'addAdvBlocksCategory' ) ); } } if ( $wp_version >= 5.9 ) { add_action( 'admin_init', array( $this, 'addEditorAssetsSiteEditor' ) ); } // Ajax add_action( 'wp_ajax_advgb_update_blocks_list', array( $this, 'updateBlocksList' ) ); add_action( 'wp_ajax_advgb_custom_styles_ajax', array( $this, 'customStylesAjax' ) ); add_action( 'wp_ajax_advgb_block_config_save', array( $this, 'saveBlockConfig' ) ); add_action( 'wp_ajax_advgb_feature_save', [ $this, 'saveFeature' ] ); } else { // Front-end add_filter( 'render_block_data', array( $this, 'contentPreRender' ) ); add_filter( 'render_block', array( $this, 'addNonceToFormBlocks' ) ); add_filter( 'render_block', [ 'PublishPress\Blocks\Controls', 'checkBlockControls' ], 10, 2 ); add_filter( 'widget_display_callback', [ 'PublishPress\Blocks\Controls', 'checkBlockControlsWidget' ] ); add_filter( 'the_content', array( $this, 'addFrontendContentAssets' ), 9 ); if ( $wp_version >= 5.8 ) { add_filter( 'widget_block_content', array( $this, 'addFrontendWidgetAssets' ), 9 ); } } } /** * Disable all admin notices in our page * * @return void */ public function disableAllAdminNotices() { global $wp_filter; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No action, nonce is not required if ( ( ! empty( $_GET['page'] ) && in_array( $_GET['page'], array( 'advgb_main' ) ) ) ) { if ( is_user_admin() ) { if ( isset( $wp_filter['user_admin_notices'] ) ) { unset( $wp_filter['user_admin_notices'] ); } } elseif ( isset( $wp_filter['admin_notices'] ) ) { unset( $wp_filter['admin_notices'] ); } if ( isset( $wp_filter['all_admin_notices'] ) ) { unset( $wp_filter['all_admin_notices'] ); } } } /** * Add blocks category * * @param array $categories List of current blocks categories * * @return array New array include our category */ public function addAdvBlocksCategory( $categories ) { return in_array( 'advgb-category', wp_list_pluck( $categories, 'slug' ), true ) ? $categories : array_merge( array( array( 'slug' => 'advgb-category', 'title' => __( 'PublishPress Blocks', 'advanced-gutenberg' ), ), ), $categories ); } /** * Add inline styles allowed for user without unfiltered_html capability * * @param array $styles List of current allowed styles * * @return array New list of allowed styles */ public function addAllowedInlineStyles( $styles ) { return array_merge( $styles, array( 'justify-content', 'align-items', 'border-radius' ) ); } /** * Add allowed tags for user without unfiltered_html capability * * @param array $tags List of current allowed tags * * @return array New list of allowed tags */ public function addAllowedTags( $tags ) { $tags['svg'] = array( 'width' => true, 'height' => true, 'viewbox' => true, 'xmlns' => true, 'fill' => true, 'styles' => true, 'preserveAspectRatio' => true, ); $tags['g'] = array( 'fill' => true, 'fill-rule' => true, 'fill-opacity' => true, 'stroke' => true, 'stroke-width' => true, ); $tags['path'] = array( 'd' => true, 'fill' => true, 'fill-opacity' => true, ); return $tags; } /** * Replaces if needed editor settings to allow/hide blocks * * @param array $settings Editor settings * * @return array */ public function replaceEditorSettings( $settings ) { self::$original_block_editor_settings = $settings; $advgb_blocks_vars = array(); if ( Utilities::settingIsEnabled( 'enable_block_access' ) ) { $advgb_blocks_vars['blocks'] = $this->getUserBlocksForGutenberg(); } // No Block Access defined for this role, so we define empty arrays if ( ! isset( $advgb_blocks_vars['blocks']['active_blocks'] ) && empty( $advgb_blocks_vars['blocks']['active_blocks'] ) ) { $advgb_blocks_vars['blocks']['active_blocks'] = array(); $advgb_blocks_vars['blocks']['inactive_blocks'] = array(); } if ( is_array( $settings['allowedBlockTypes'] ) ) { // Remove blocks from the list that are not allowed // Note that we do not add missing blocks, because another plugin may have used the hook to remove some of them foreach ( $settings['allowedBlockTypes'] as $key => $type ) { if ( in_array( $type, $advgb_blocks_vars['blocks']['inactive_blocks'] ) ) { unset( $settings['allowedBlockTypes'][ $key ] ); } } } elseif ( $settings['allowedBlockTypes'] === true ) { // All was allowed, only return what the block access by user role allows if ( count( $advgb_blocks_vars['blocks']['active_blocks'] ) || count( $advgb_blocks_vars['blocks']['inactive_blocks'] ) ) { $settings['allowedBlockTypes'] = $advgb_blocks_vars['blocks']['active_blocks']; } } $current_screen = get_current_screen(); if ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() && ( ! defined( 'GUTENBERG_VERSION' ) || ( defined( 'GUTENBERG_VERSION' ) && version_compare( GUTENBERG_VERSION, '5.3.0', '>=' ) ) ) ) { // WP 5 and Gutenberg 5.3.0 fires enqueue_block_editor_assets before block_editor_settings, Gutenberg plugin do the contrary // Gutenberg WP5 core feature is used and we are in the block editor page, we must enqueue our assets after retrieving editor settings $this->addEditorAssets( true ); } return $settings; } /** * Enqueue styles and scripts for gutenberg * * @param boolean $force_loading Should force loading assets * * @return void */ public function addEditorAssets( $force_loading = false ) { $current_screen = get_current_screen(); if ( ! $force_loading && method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() && ( ! defined( 'GUTENBERG_VERSION' ) || ( defined( 'GUTENBERG_VERSION' ) && version_compare( GUTENBERG_VERSION, '5.3.0', '>=' ) ) ) ) { // This function will be called manually in the block_editor_settings filter // WP 5 and Gutenberg 5.3.0 fires enqueue_block_editor_assets before block_editor_settings, Gutenberg plugin do the contrary return; } $this->enqueueEditorAssets(); $this->advgbBlocksVariables(); } /** * Add styles for Site Editor * Note: these assets loads inline inside the Site Editor iframe * * @return void */ public function addEditorAssetsSiteEditor() { global $pagenow; if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) && $pagenow === 'site-editor.php' ) { add_editor_style( site_url( '/wp-includes/css/dashicons.css' ) ); // 'dashicons' add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/blocks.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/columns-editor.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/recent-posts.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/editor.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/site-editor.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/fonts/material-icons.min.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/fonts/material-icons-custom.min.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/slick.css' ); add_editor_style( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/slick-theme.css'); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_main_styles_inline' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_main_styles_inline(); } } $this->advgbDisableBlocks(); } } /** * Enqueue styles and scripts for gutenberg in widgets.php * * @param int $hook Hook suffix for the current admin page * * @return void */ public function addEditorAssetsWidgets( $hook ) { if ( 'widgets.php' != $hook ) { return; } $this->enqueueEditorAssets(); $this->advgbBlocksVariables( false ); $this->advgbDisableBlocks(); } /** * Enqueue styles and scripts for gutenberg * * @return void */ public function enqueueEditorAssets() { $currentScreen = get_current_screen(); if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) || Utilities::settingIsEnabled( 'enable_block_access' ) || Utilities::settingIsEnabled( 'block_controls' ) ) { // Define the dependency for the editor based on current screen if ( $currentScreen->id === 'customize' ) { // Customizer > Widgets $wp_editor_dep = 'wp-customize-widgets'; } elseif ( $currentScreen->id === 'widgets' ) { // Appearance > Widgets $wp_editor_dep = 'wp-edit-widgets'; } else { // Post edit and Site Editor $wp_editor_dep = 'wp-editor'; } PublishPress\Blocks\Controls::editorAssets( $wp_editor_dep ); if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { wp_enqueue_script( 'advgb_blocks', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/blocks.js', array( 'lodash', 'wp-blocks', 'wp-i18n', 'wp-element', 'wp-data', $wp_editor_dep, 'wp-plugins', 'wp-compose' ), ADVANCED_GUTENBERG_VERSION, true ); // Pro Ads in some blocks for free version if ( ! defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { wp_enqueue_script( 'advgb_pro_ad_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/pro-ad.js', [ 'advgb_blocks' ], ADVANCED_GUTENBERG_VERSION, true ); wp_enqueue_style( 'advgb_pro_ad_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/pro-ad.css', [], ADVANCED_GUTENBERG_VERSION ); } } if ( Utilities::settingIsEnabled( 'enable_block_access' ) ) { wp_enqueue_script( 'advgb_blocks_editor', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/editor.js', array( 'wp-blocks', 'wp-i18n', 'wp-element', 'wp-data', $wp_editor_dep, 'wp-plugins', 'wp-compose' ), ADVANCED_GUTENBERG_VERSION, true ); } } // Don't load custom-styles.js in widgets.php, Theme Customizer > Widgets and Site Editor if ( Utilities::settingIsEnabled( 'enable_custom_styles' ) && $currentScreen->id !== 'widgets' && is_customize_preview() === false && $currentScreen->id !== 'site-editor' ) { wp_enqueue_script( 'advgb_custom_styles_script', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/custom-styles.js', array( 'wp-blocks' ), ADVANCED_GUTENBERG_VERSION, true ); } // Only load post-sidebar.js in post type 'post' and 'page' if ( $currentScreen->base === 'post' && ( $currentScreen->id == 'post' || $currentScreen->id == 'page' ) ) { // Get global settings $saved_settings = get_option( 'advgb_settings' ); // Get post settings $editorWidthGlobal = isset( $saved_settings['editor_width'] ) && ! empty( $saved_settings['editor_width'] ) ? $this->getAdvgbEditorWidth( $saved_settings['editor_width'] ) : 'default'; $editorColsVGGlobal = $this->colsVisualGuideGlobal(); // Settings as javascript variables wp_localize_script( 'wp-blocks', 'advg_settings', [ 'editor_width_global' => $editorWidthGlobal, 'enable_columns_visual_guide_global' => $editorColsVGGlobal, ] ); wp_enqueue_script( 'advgb_post_sidebar', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/post-sidebar.js', array( 'wp-blocks' ), ADVANCED_GUTENBERG_VERSION, true ); } // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_scripts_editor' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_scripts_editor(); } if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_scripts_editor_conditional' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_scripts_editor_conditional(); } } // Include needed JS libraries wp_enqueue_script( 'jquery-ui-tabs' ); wp_enqueue_script( 'jquery-ui-sortable' ); wp_enqueue_script( 'slick_js' ); wp_enqueue_script( 'advgb_masonry_js' ); // Include needed CSS styles wp_enqueue_style( 'material_icon_font' ); wp_enqueue_style( 'material_icon_font_custom' ); wp_enqueue_style( 'slick_style' ); wp_enqueue_style( 'slick_theme_style' ); } /** * Output blocks data and settings as javascript objects (advgb_blocks_var, advgbBlocks and advgbDefaultConfig) * * @param boolean $post When the blocks load in post edit screen * * @return void */ public function advgbBlocksVariables( $post = true ) { $advgb_blocks_vars = array(); if ( Utilities::settingIsEnabled( 'enable_block_access' ) ) { $advgb_blocks_vars['blocks'] = $this->getUserBlocksForGutenberg(); } // No Block Access defined for this role, so we define empty arrays if ( ! isset( $advgb_blocks_vars['blocks']['active_blocks'] ) && empty( $advgb_blocks_vars['blocks']['active_blocks'] ) ) { $advgb_blocks_vars['blocks']['active_blocks'] = array(); $advgb_blocks_vars['blocks']['inactive_blocks'] = array(); } global $post; if ( $post ) { $advgb_blocks_vars['post_id'] = $post->ID; $advgb_blocks_vars['post_type'] = $post->post_type; } $advgb_blocks_vars['original_settings'] = self::$original_block_editor_settings; $advgb_blocks_vars['ajaxurl'] = admin_url( 'admin-ajax.php' ); $advgb_blocks_vars['nonce'] = wp_create_nonce( 'advgb_update_blocks_list' ); wp_localize_script( 'wp-blocks', 'advgb_blocks_vars', $advgb_blocks_vars ); // Set variable needed by blocks editor $avatarHolder = ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/testimonial/avatar-placeholder.png'; $default_thumb = ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/recent-posts/recent-post-default.png'; $image_holder = ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/advimage/imageholder.svg'; $login_logo = ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/login-form/login.svg'; $reg_logo = ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/login-form/reg.svg'; $saved_settings = get_option( 'advgb_settings' ); $custom_styles_data = get_option( 'advgb_custom_styles' ); $recaptcha_config = get_option( 'advgb_recaptcha_config' ); $recaptcha_config = $recaptcha_config !== false ? $recaptcha_config : array( 'recaptcha_enable' => 0 ); $blocks_icon_color = isset( $saved_settings['blocks_icon_color'] ) ? $saved_settings['blocks_icon_color'] : '#655997'; $rp_default_thumb = isset( $saved_settings['rp_default_thumb'] ) ? $saved_settings['rp_default_thumb'] : array( 'url' => $default_thumb, 'id' => 0 ); $icons = array(); $icons['material'] = file_get_contents( plugin_dir_path( __DIR__ ) . 'assets/css/fonts/codepoints.json' ); $icons['material'] = json_decode( $icons['material'], true ); $enable_advgb_blocks = ! isset( $saved_settings['enable_advgb_blocks'] ) || $saved_settings['enable_advgb_blocks'] ? 1 : 0; $pp_series_active = is_plugin_active( 'organize-series/orgSeries.php' ) || is_plugin_active( 'publishpress-series-pro/publishpress-series-pro.php' ) ? 1 : 0; $pp_series_options = get_option( 'org_series_options' ); $pp_series_slug = isset( $pp_series_options['series_taxonomy_slug'] ) && ! empty( $pp_series_options['series_taxonomy_slug'] ) ? $pp_series_options['series_taxonomy_slug'] : 'series'; $pp_series_post_types = isset( $pp_series_options['post_types_for_series'] ) && ! empty( $pp_series_options['post_types_for_series'] ) ? $pp_series_options['post_types_for_series'] : [ 'post' ]; $block_controls = Utilities::settingIsEnabled( 'block_controls' ) ? 1 : 0; $block_extend = Utilities::settingIsEnabled( 'block_extend' ) ? 1 : 0; $timezone = function_exists( 'wp_timezone_string' ) ? wp_timezone_string() : 'UTC'; $timezones = []; $reusable_blocks = Utilities::settingIsEnabled( 'reusable_blocks' ) ? 1 : 0; global $wp_version; $blocks_widget_support = ( $wp_version >= 5.8 ) ? 1 : 0; // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_timezones_list' ) ) { $timezones = PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_timezones_list(); } } wp_localize_script( 'wp-blocks', 'advgbBlocks', array( 'color' => $blocks_icon_color, 'post_thumb' => $rp_default_thumb['url'], 'default_thumb' => $default_thumb, 'image_holder' => $image_holder, 'avatarHolder' => $avatarHolder, 'login_logo' => $login_logo, 'reg_logo' => $reg_logo, 'home_url' => home_url(), 'config_url' => admin_url( 'admin.php?page=advgb_settings' ), 'customStyles' => ! $custom_styles_data ? array() : $custom_styles_data, 'captchaEnabled' => $recaptcha_config['recaptcha_enable'], 'pluginUrl' => ADVANCED_GUTENBERG_PLUGIN_DIR_URL, 'iconList' => $icons, 'registerEnabled' => get_option( 'users_can_register' ), 'blocks_widget_support' => $blocks_widget_support, 'enable_advgb_blocks' => $enable_advgb_blocks, 'advgb_pro' => defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ? 1 : 0, 'pp_series_active' => $pp_series_active, 'pp_series_slug' => $pp_series_slug, 'pp_series_post_types' => $pp_series_post_types, 'block_controls' => $block_controls, 'reusable_blocks' => $reusable_blocks, 'block_extend' => $block_extend, 'timezone' => $timezone, 'timezones' => $timezones ) ); // Setup default config data for blocks $blocks_config_saved = get_option( 'advgb_blocks_default_config' ); $blocks_config_saved = $blocks_config_saved !== false ? $blocks_config_saved : array(); wp_localize_script( 'wp-blocks', 'advgbDefaultConfig', $blocks_config_saved ); // Block controls if ( Utilities::settingIsEnabled( 'block_controls' ) ) { PublishPress\Blocks\Controls::editorData(); } // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_fonts_list' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_fonts_list(); } } } /** * Enqueue styles for gutenberg editor and front-end * * @return mixed */ public function addEditorAndFrontendStyles() { // Load custom styles in the <head> if ( Utilities::settingIsEnabled( 'enable_custom_styles' ) ) { add_action( 'wp_head', array( $this, 'loadCustomStylesFrontend' ) ); add_action( 'admin_head', array( $this, 'loadCustomStylesAdmin' ) ); } add_action( 'admin_head', array( $this, 'setBlocksSpacingAdmin' ) ); global $pagenow; if ( is_admin() && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) && $pagenow !== 'site-editor.php' ) { wp_enqueue_style( 'dashicons' ); wp_enqueue_style( 'advgb_recent_posts_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/recent-posts.css', array(), ADVANCED_GUTENBERG_VERSION ); } if ( is_admin() && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { wp_enqueue_style( 'advgb_blocks_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/blocks.css', [], ADVANCED_GUTENBERG_VERSION ); wp_enqueue_style( 'advgb_columns_editor_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/columns-editor.css', [ 'advgb_blocks_styles' ], ADVANCED_GUTENBERG_VERSION ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_main_styles' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_main_styles(); } } } if ( is_admin() ) { wp_enqueue_style( 'advgb_editor_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/editor.css', array(), ADVANCED_GUTENBERG_VERSION ); } if ( ! function_exists( 'advgbAddScriptAttributes' ) ) { /** * Add attributes to script tag * * @param string $tag Script tag * @param string $handle Handle name * * @return mixed */ function advgbAddScriptAttributes( $tag, $handle ) { if ( 'advgb_map_api' === $handle ) { return str_replace( ' src', ' defer src', $tag ); } elseif ( 'advgb_recaptcha_js' === $handle ) { return str_replace( ' src', ' async defer src', $tag ); } return $tag; } } add_filter( 'script_loader_tag', 'advgbAddScriptAttributes', 10, 2 ); if ( is_admin() ) { $this->loadGoogleMapApi(); $this->loadRecaptchaApi(); } } /** * Update the blocks list for first time install or when a new block is installed * * @TODO - Blocks with block.json metadata are not detected in this trigger * https://github.com/publishpress/PublishPress-Blocks/issues/1266 * * @return void */ public function initBlocksList() { if ( get_option( 'advgb_blocks_list' ) === false || (bool) get_option( 'advgb_maybe_new_blocks' ) || ( defined( 'GUTENBERG_VERSION' ) && version_compare( get_option( 'advgb_gutenberg_version' ), GUTENBERG_VERSION, '<' ) ) ) { $advgb_nonce = wp_create_nonce( 'advgb_update_blocks_list' ); wp_enqueue_script( 'wp-blocks' ); wp_enqueue_script( 'wp-element' ); wp_enqueue_script( 'wp-data' ); wp_enqueue_script( 'wp-components' ); wp_enqueue_script( 'wp-block-library' ); wp_enqueue_script( 'wp-editor' ); do_action( 'enqueue_block_editor_assets' ); wp_enqueue_script( 'advgb_update_list', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/update-block-list.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); $blockCategories = array(); if ( function_exists( 'gutenberg_get_block_categories' ) ) { $blockCategories = gutenberg_get_block_categories( get_post() ); } elseif ( function_exists( 'get_block_categories' ) ) { $blockCategories = get_block_categories( get_post() ); } wp_add_inline_script( 'wp-blocks', sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( $blockCategories ) ), 'after' ); // Block types scripts $block_type_registry = \WP_Block_Type_Registry::get_instance(); foreach ( $block_type_registry->get_all_registered() as $block_name => $block_type ) { if ( ! empty( $block_type->editor_script ) ) { wp_enqueue_script( $block_type->editor_script ); } } wp_localize_script( 'advgb_update_list', 'updateListNonce', array( 'nonce' => $advgb_nonce ) ); // Disable trigger update_option( 'advgb_maybe_new_blocks', intval( false ), false ); } } /** * Unregister Table of Contents block in Widgets and Site Editor * * @return void */ public function advgbDisableBlocks() { if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { wp_enqueue_script( 'advgb_disable_blocks_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/disable-blocks.js', array( 'advgb_blocks' ), ADVANCED_GUTENBERG_VERSION ); } } /** * Load block that required server side render * * @return void */ public function advgbBlockLoader() { // Block Content Display require_once( plugin_dir_path( dirname( __FILE__ ) ) . 'assets/blocks/recent-posts/block.php' ); } /** * Add "Upgrade to Pro" notices * * @return void */ public function upgradeProNotices() { if ( current_user_can( 'install_plugins' ) && ! defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && class_exists( 'PPVersionNotices\Module\TopNotice\Module' ) && class_exists( 'PPVersionNotices\Module\MenuLink\Module' ) ) { // Top notice add_filter( \PPVersionNotices\Module\TopNotice\Module::SETTINGS_FILTER, function ( $settings ) { $settings['advanced-gutenberg'] = [ 'message' => __( 'You\'re using PublishPress Blocks Free. The Pro version has more features and support. %sUpgrade to Pro%s', 'advanced-gutenberg' ), 'link' => 'https://publishpress.com/links/blocks-banner', 'screens' => [ [ 'base' => 'toplevel_page_advgb_main' ], [ 'base' => 'blocks_page_advgb_block_access' ], [ 'base' => 'blocks_page_advgb_block_settings' ], [ 'base' => 'blocks_page_advgb_custom_styles' ], [ 'base' => 'blocks_page_advgb_settings' ], [ 'base' => 'blocks_page_advgb_block_controls' ], ] ]; return $settings; } ); // Menu link add_filter( \PPVersionNotices\Module\MenuLink\Module::SETTINGS_FILTER, function ( $settings ) { $settings['advanced-gutenberg'] = [ 'parent' => 'advgb_main', 'label' => __( 'Upgrade to Pro', 'advanced-gutenberg' ), 'link' => 'https://publishpress.com/links/blocks-menu', ]; return $settings; } ); } } /** * Register REST API * * @return void */ public function registerRestAPI() { // Add author info register_rest_field( 'post', 'author_meta', array( 'get_callback' => array( $this, 'getAuthorInfo' ), 'update_callback' => null, 'schema' => null, ) ); // Add post featured img register_rest_field( 'post', 'featured_img', array( 'get_callback' => array( $this, 'getFeaturedImg' ), 'update_callback' => null, 'schema' => null, ) ); // Register router to get data for Woo Products block if ( class_exists( 'WC_REST_Products_Controller' ) ) { include_once( plugin_dir_path( dirname( __FILE__ ) ) . 'assets/blocks/woo-products/controller.php' ); $controller = new AdvgbProductsController(); $controller->register_routes(); } // Register custom routes for Block controls if ( Utilities::settingIsEnabled( 'block_controls' ) && method_exists( 'PublishPress\Blocks\Controls', 'registerCustomRoutes' ) ) { PublishPress\Blocks\Controls::registerCustomRoutes(); } } /** * Get post author info for REST API * * @param array $object API Object * * @return mixed */ public function getAuthorInfo( $object ) { // Get the author name $author['display_name'] = get_the_author_meta( 'display_name', $object['author'] ); // Get the author link $author['author_link'] = get_author_posts_url( $object['author'] ); // Return the author data return $author; } /** * Get featured image link for REST API * * @param array $object API Object * * @return mixed */ public function getFeaturedImg( $object ) { $featured_img = wp_get_attachment_image_src( $object['featured_media'], 'medium', false ); if ( $featured_img ) { return $featured_img[0]; } } /** * Ajax to update blocks list * * @return mixed */ public function updateBlocksList() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json( '', 400 ); } if ( ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'advgb_update_blocks_list' ) && ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'advgb_nonce' ) ) { wp_send_json( '', 400 ); } /** * Cleanup block list * * @param array $block Block * * @return mixed */ function cleanupBlockList( array $block ) { $block['icon'] = htmlentities( stripslashes( $block['icon'] ), ENT_QUOTES ); $block['name'] = sanitize_text_field( $block['name'] ); $block['title'] = sanitize_text_field( $block['title'] ); $block['category'] = sanitize_text_field( $block['category'] ); return $block; } if ( is_array( $_POST['blocksList'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $blocksList = array_map( 'cleanupBlockList', $_POST['blocksList'] ); } else { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $blocksList = json_decode( stripslashes( $_POST['blocksList'] ) ); } $savedBlocksList = get_option( 'advgb_blocks_list' ); if ( ! is_array( $savedBlocksList ) ) { $savedBlocksList = array(); } $blocksListName = array(); $savedBlocksListName = array(); // Blocks coming from Block Access admin screen form foreach ( $blocksList as &$block ) { // Convert object to array $block = (array) $block; $blocksListName[] = $block['name']; } // Blocks saved in advgb_blocks_list option foreach ( $savedBlocksList as $block ) { // Convert object to array $block = (array) $block; $savedBlocksListName[] = $block['name']; } // Check if we have new blocks installed $newBlocks = array_diff( $blocksListName, $savedBlocksListName ); if ( count( $newBlocks ) ) { update_option( 'advgb_blocks_list', $blocksList, false ); } // Check that advgb_blocks_user_roles is up to date - The result of this check is not saved $advgb_blocks_user_roles = get_option( 'advgb_blocks_user_roles' ); $advgb_blocks_user_roles_updated = array(); if ( $advgb_blocks_user_roles ) { foreach ( $advgb_blocks_user_roles as $role => $blocks ) { if ( is_array( $blocks ) && is_array( $blocks['active_blocks'] ) && is_array( $blocks['inactive_blocks'] ) ) { $allAccessBlocks = array_merge( $blocks['active_blocks'], $blocks['inactive_blocks'] ); $newAllowedBlocks = array_diff( $blocksListName, $allAccessBlocks ); $newAllowedBlocks = array_unique( $newAllowedBlocks ); if ( $newAllowedBlocks ) { $advgb_blocks_user_roles_updated[ $role ]['active_blocks'] = array_merge( $blocks['active_blocks'], $newAllowedBlocks ); $advgb_blocks_user_roles_updated[ $role ]['inactive_blocks'] = $blocks['inactive_blocks']; } } } } if ( ( defined( 'GUTENBERG_VERSION' ) && version_compare( get_option( 'advgb_gutenberg_version' ), GUTENBERG_VERSION, '<' ) ) ) { update_option( 'advgb_gutenberg_version', GUTENBERG_VERSION ); } wp_send_json( [ 'blocks_list' => $blocksList ], 200 ); } /** * Ajax for custom styles * * @return boolean,void Return false if failure, echo json on success */ public function customStylesAjax() { // Check users permissions if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json( __( 'No permission!', 'advanced-gutenberg' ), 403 ); return false; } $regex = '/^[a-zA-Z0-9_\-]+$/'; if ( ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'advgb_cstyles_nonce' ) ) { wp_send_json( __( 'Invalid nonce token!', 'advanced-gutenberg' ), 400 ); } $check_exist = get_option( 'advgb_custom_styles' ); if ( $check_exist === false ) { update_option( 'advgb_custom_styles', $this::$default_custom_styles, false ); } $custom_style_data = get_option( 'advgb_custom_styles' ); $task = isset( $_POST['task'] ) ? sanitize_text_field( $_POST['task'] ) : ''; if ( $task === '' ) { return false; } elseif ( $task === 'new' ) { $new_style_id = end( $custom_style_data ); $new_style_id = $new_style_id['id'] + 1; $new_style_array = array( 'id' => $new_style_id, 'title' => __( 'Style title', 'advanced-gutenberg' ) . ' ' . $new_style_id, 'name' => 'new-class-' . rand( 0, 99 ) . $new_style_id . rand( 0, 99 ), 'css' => '', 'identifyColor' => '#000000' ); array_push( $custom_style_data, $new_style_array ); update_option( 'advgb_custom_styles', $custom_style_data, false ); wp_send_json( $new_style_array ); } elseif ( $task === 'delete' ) { $custom_style_data_delete = get_option( 'advgb_custom_styles' ); $style_id = (int) $_POST['id']; $new_style_deleted_array = array(); $done = false; foreach ( $custom_style_data_delete as $data ) { if ( $data['id'] === $style_id ) { $done = true; continue; } array_push( $new_style_deleted_array, $data ); } update_option( 'advgb_custom_styles', $new_style_deleted_array, false ); if ( $done ) { wp_send_json( array( 'id' => $style_id ), 200 ); } } elseif ( $task === 'copy' ) { $data_saved = get_option( 'advgb_custom_styles' ); $style_id = (int) $_POST['id']; $new_style_copied_array = get_option( 'advgb_custom_styles' ); $copied_styles = array(); $new_id = end( $new_style_copied_array ); foreach ( $data_saved as $data ) { if ( $data['id'] === $style_id ) { $copied_styles = array( 'id' => $new_id['id'] + 1, 'title' => sanitize_text_field( $data['title'] ) . ' ' . __( 'copy', 'advanced-gutenberg' ), 'name' => sanitize_text_field( $data['name'] ) . '-' . rand( 0, 999 ), 'css' => wp_strip_all_tags( $data['css'] ), 'identifyColor' => sanitize_hex_color( $data['identifyColor'] ), ); array_push( $new_style_copied_array, $copied_styles ); } } update_option( 'advgb_custom_styles', $new_style_copied_array, false ); wp_send_json( $copied_styles ); } elseif ( $task === 'preview' ) { $style_id = (int) $_POST['id']; $data_saved = get_option( 'advgb_custom_styles' ); $get_style_array = array(); foreach ( $data_saved as $data ) { if ( $data['id'] === $style_id ) { foreach ( $data as $key => $value ) { $data[ $key ] = esc_html( $value ); } $get_style_array = $data; } } if ( ! empty( $get_style_array ) ) { wp_send_json( $get_style_array ); } else { wp_send_json( false, 404 ); } } elseif ( $task === 'style_save' ) { $style_id = (int) $_POST['id']; $new_styletitle = sanitize_text_field( $_POST['title'] ); $new_classname = sanitize_text_field( $_POST['name'] ); $new_identify_color = sanitize_hex_color( $_POST['mycolor'] ); $new_css = wp_strip_all_tags( $_POST['mycss'] ); // Validate new name if ( ! preg_match( $regex, $new_classname ) ) { wp_send_json( 'Please use valid characters for a CSS classname! As example: hyphen or underscore instead of empty spaces.', 403 ); return false; } $data_saved = get_option( 'advgb_custom_styles' ); $new_data_array = array(); foreach ( $data_saved as $data ) { if ( $data['id'] === $style_id ) { $data['title'] = $new_styletitle; $data['name'] = $new_classname; $data['css'] = $new_css; $data['identifyColor'] = $new_identify_color; } array_push( $new_data_array, $data ); } update_option( 'advgb_custom_styles', $new_data_array, false ); } else { wp_send_json( null, 404 ); } } /** * Ajax for saving a feature from main page * * @return boolean,void Return false if failure, echo json on success */ public function saveFeature() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json( __( 'No permission!', 'advanced-gutenberg' ), 403 ); return false; } if ( ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'advgb_main_features_nonce' ) ) { wp_send_json( __( 'Invalid nonce token!', 'advanced-gutenberg' ), 400 ); } if ( empty( $_POST['feature'] ) || ! $_POST['feature'] ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized wp_send_json( __( 'Error: wrong data', 'advanced-gutenberg' ), 400 ); return false; } $feature = sanitize_text_field( $_POST['feature'] ); $all_features = [ 'block_controls', 'enable_block_access', 'block_extend', 'enable_custom_styles', 'enable_advgb_blocks', 'reusable_blocks' ]; // Pro features if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { array_push( $all_features, 'enable_core_blocks_features' ); } if ( in_array( $feature, $all_features ) ) { $advgb_settings = get_option( 'advgb_settings' ); $advgb_settings[ $feature ] = (bool) $_POST['new_state'] ? 1 : 0; update_option( 'advgb_settings', $advgb_settings ); wp_send_json( true, 200 ); } else { wp_send_json( __( 'Error: can\'t edit this feature', 'advanced-gutenberg' ), 400 ); return false; } } /** * Ajax for saving block default config * * @return boolean,void Return false if failure, echo json on success */ public function saveBlockConfig() { // Check users permissions if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json( __( 'No permission!', 'advanced-gutenberg' ), 403 ); return false; } if ( ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'advgb_block_config_nonce' ) ) { wp_send_json( __( 'Invalid nonce token!', 'advanced-gutenberg' ), 400 ); } $blocks_config_saved = get_option( 'advgb_blocks_default_config' ); if ( $blocks_config_saved === false ) { $blocks_config_saved = array(); } $blockType = sanitize_text_field( $_POST['blockType'] ); $settings = $_POST['settings']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized foreach ( $settings as $key => $setting ) { foreach ( $setting as $k => $option ) { $option = sanitize_text_field( $option ); if ( is_numeric( $option ) ) { if ( $k !== 'lat' && $k !== 'lng' ) { $option = floatval( $option ); } } $settings[ $key ][ $k ] = $option; } } // Modify settings for social links blocks config if ( $blockType === 'advgb-social-links' ) { $items = array(); $settings[ $blockType ]['items'] = array(); foreach ( $settings[ $blockType ] as $k => $option ) { if ( strpos( $k, '.' ) ) { $item = explode( '.', $k ); $items[ $item[0] ][ $item[1] ] = $option; } } foreach ( $items as $item ) { array_push( $settings[ $blockType ]['items'], $item ); } } $blocks_config_saved[ $blockType ] = $settings[ $blockType ]; update_option( 'advgb_blocks_default_config', $blocks_config_saved, false ); wp_send_json( true, 200 ); } /** * Ajax for saving contact form data * * @return boolean,void Return false if failure, echo json on success */ public function saveContactFormData() { // Don't save if Settings > PublishPress Blocks are disabled if ( ! Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { return false; } if ( ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'advgb_blockform_nonce_field' ) ) { wp_send_json( __( 'Invalid nonce token!', 'advanced-gutenberg' ), 400 ); } // phpcs:disable -- WordPress.Security.NonceVerification.Recommended - frontend form, no nonce if ( ! isset( $_POST['action'] ) ) { wp_send_json( __( 'Bad Request!', 'advanced-gutenberg' ), 400 ); return false; } if ( isset( $_POST['captcha'] ) ) { $recaptcha_config = get_option( 'advgb_recaptcha_config' ); if ( ! isset( $recaptcha_config['recaptcha_secret_key'] ) || ! isset( $recaptcha_config['recaptcha_site_key'] ) ) { wp_send_json( __( 'Server error. Try again later!', 'advanced-gutenberg' ), 500 ); } $captcha = $_POST['captcha']; $secret_key = $recaptcha_config['recaptcha_secret_key']; $verify = wp_remote_get( "https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$captcha}" ); if ( ! is_array( $verify ) || ! isset( $verify['body'] ) ) { wp_send_json( __( 'Cannot validate captcha', 'advanced-gutenberg' ), 400 ); } $verified = json_decode( $verify['body'] ); if ( ! $verified->success ) { wp_send_json( __( 'Captcha validation error', 'advanced-gutenberg' ), 400 ); } } $contacts_saved = get_option( 'advgb_contacts_saved' ); if ( ! $contacts_saved ) { $contacts_saved = array(); } $contact_data = array( 'date' => sanitize_text_field( $_POST['submit_date'] ), 'name' => sanitize_text_field( $_POST['contact_name'] ), 'email' => sanitize_email( $_POST['contact_email'] ), 'msg' => sanitize_textarea_field( $_POST['contact_msg'] ), ); array_push( $contacts_saved, $contact_data ); $saved = update_option( 'advgb_contacts_saved', $contacts_saved, false ); if ( $saved ) { $saved_settings = get_option( 'advgb_email_sender' ); $website_title = get_option( 'blogname' ); $admin_email = get_option( 'admin_email' ); $sender_name = isset( $saved_settings['contact_form_sender_name'] ) && $saved_settings['contact_form_sender_name'] ? $saved_settings['contact_form_sender_name'] : $website_title; $sender_email = isset( $saved_settings['contact_form_sender_email'] ) && $saved_settings['contact_form_sender_email'] ? $saved_settings['contact_form_sender_email'] : $admin_email; $email_title = isset( $saved_settings['contact_form_email_title'] ) && $saved_settings['contact_form_email_title'] ? $saved_settings['contact_form_email_title'] : __( 'Website Contact', 'advanced-gutenberg' ); $email_receiver = isset( $saved_settings['contact_form_email_receiver'] ) && $saved_settings['contact_form_email_receiver'] ? $saved_settings['contact_form_email_receiver'] : $admin_email; $email_header[] = 'Content-Type: text/html; charset=UTF-8'; $email_header[] = 'From: ' . $sender_name . ' <' . $sender_email . '>'; $msg = '<html><body>'; $msg .= '<h2>' . __( 'You have received a contact from your website.', 'advanced-gutenberg' ) . '</h2>'; $msg .= '<ul>'; $msg .= '<li><strong>' . __( 'Name', 'advanced-gutenberg' ) . ': </strong>' . $contact_data['name'] . '</li>'; $msg .= '<li><strong>' . __( 'Email', 'advanced-gutenberg' ) . ': </strong>' . $contact_data['email'] . '</li>'; $msg .= '<li><strong>' . __( 'Date', 'advanced-gutenberg' ) . ': </strong>' . $contact_data['date'] . '</li>'; $msg .= '<li><strong>' . __( 'Message', 'advanced-gutenberg' ) . ': </strong>' . $contact_data['msg'] . '</li>'; $msg .= '</ul>'; $msg .= '</body></html>'; wp_mail( $email_receiver, $email_title, $msg, $email_header ); wp_send_json( $contact_data, 200 ); } else { wp_send_json( __( 'Error while sending the form. Please try again.', 'advanced-gutenberg' ), 500 ); } // phpcs:enable } /** * Ajax for saving newsletter form data * * @return boolean,void Return false if failure, echo json on success */ public function saveNewsletterData() { // Don't save if Settings > PublishPress Blocks are disabled if ( ! Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { return false; } if ( ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'advgb_blockform_nonce_field' ) ) { wp_send_json( __( 'Invalid nonce token!', 'advanced-gutenberg' ), 400 ); } // phpcs:disable -- WordPress.Security.NonceVerification.Recommended - frontend form, no nonce if ( ! isset( $_POST['action'] ) ) { wp_send_json( __( 'Bad Request!', 'advanced-gutenberg' ), 400 ); return false; } if ( isset( $_POST['captcha'] ) ) { $recaptcha_config = get_option( 'advgb_recaptcha_config' ); if ( ! isset( $recaptcha_config['recaptcha_secret_key'] ) || ! isset( $recaptcha_config['recaptcha_site_key'] ) ) { wp_send_json( __( 'Server error. Try again later!', 'advanced-gutenberg' ), 500 ); } $captcha = $_POST['captcha']; $secret_key = $recaptcha_config['recaptcha_secret_key']; $verify = wp_remote_get( "https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$captcha}" ); if ( ! is_array( $verify ) || ! isset( $verify['body'] ) ) { wp_send_json( __( 'Cannot validate captcha', 'advanced-gutenberg' ), 400 ); } $verified = json_decode( $verify['body'] ); if ( ! $verified->success ) { wp_send_json( __( 'Captcha validation error', 'advanced-gutenberg' ), 400 ); } } $newsletter_saved = get_option( 'advgb_newsletter_saved' ); if ( ! $newsletter_saved ) { $newsletter_saved = array(); } $newsletter_data = array( 'date' => sanitize_text_field( $_POST['submit_date'] ), 'fname' => sanitize_text_field( $_POST['f_name'] ), 'lname' => sanitize_text_field( $_POST['l_name'] ), 'email' => sanitize_email( $_POST['email'] ), ); array_push( $newsletter_saved, $newsletter_data ); update_option( 'advgb_newsletter_saved', $newsletter_saved, false ); wp_send_json( $newsletter_data, 200 ); // phpcs:enable } /** * Ajax for validating login/register form captcha * * @return boolean,void Return false if failure, echo json on success */ public function validateLoresForm() { // phpcs:disable -- WordPress.Security.NonceVerification.Recommended - frontend form, no nonce if ( ! isset( $_POST['action'] ) ) { wp_send_json( __( 'Bad Request!', 'advanced-gutenberg' ), 400 ); return false; } if ( isset( $_POST['captcha'] ) ) { $recaptcha_config = get_option( 'advgb_recaptcha_config' ); if ( ! isset( $recaptcha_config['recaptcha_secret_key'] ) || ! isset( $recaptcha_config['recaptcha_site_key'] ) ) { wp_send_json( __( 'Server error. Try again later!', 'advanced-gutenberg' ), 500 ); } $captcha = $_POST['captcha']; $secret_key = $recaptcha_config['recaptcha_secret_key']; $verify = wp_remote_get( "https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$captcha}" ); if ( ! is_array( $verify ) || ! isset( $verify['body'] ) ) { wp_send_json( __( 'Cannot validate captcha', 'advanced-gutenberg' ), 400 ); } $verified = json_decode( $verify['body'] ); if ( ! $verified->success ) { wp_send_json( __( 'Captcha validation error', 'advanced-gutenberg' ), 400 ); } wp_send_json( __( 'Captcha validated', 'advanced-gutenberg' ), 200 ); } wp_send_json( __( 'Captcha is empty', 'advanced-gutenberg' ), 400 ); // phpcs:enable } /** * Handle failed login from our login form and redirect to that login page * * @return void */ public function handleLoginFailed() { $from_advgb = isset( $_POST['advgb_login_form'] ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- redirect if ( ! empty( $_SERVER['HTTP_REFERER'] ) && $from_advgb ) { $redirect = add_query_arg( 'login', 'failed', $_SERVER['HTTP_REFERER'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized wp_safe_redirect( $redirect ); exit; } } /** * Register back-end styles and script for later use * * @return void */ public function registerStylesScripts() { if ( ! wp_doing_ajax() ) { // Register CSS wp_register_style( 'advgb_admin_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/style.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'advgb_admin_menu_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/admin-menu.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'advgb_qtip_style', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/jquery.qtip.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'codemirror_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/codemirror/lib/codemirror.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'codemirror_hint_style', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/codemirror/addon/hint/show-hint.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'minicolors_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/jquery.minicolors.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'material_icon_font', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/fonts/material-icons.min.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'material_icon_font_custom', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/fonts/material-icons-custom.min.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'slick_style', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/slick.css', [], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'slick_theme_style', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/slick-theme.css', [], ADVANCED_GUTENBERG_VERSION ); // Register JS // @TODO - Check if we really need all the dependencies from 'advgb_main_js' wp_register_script( 'advgb_main_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/main.min.js', array( 'jquery', 'wp-block-editor', 'wp-blocks', 'wp-element', 'wp-data', 'wp-components', 'wp-core-data', 'wp-block-library', 'wp-editor', 'wp-edit-post', 'wp-plugins' ), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'advgb_update_list', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/update-block-list.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'advgb_settings_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/settings.min.js', array( 'wp-i18n' ), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'advgb_custom_styles_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/custom-styles.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'qtip_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/jquery.qtip.min.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'advgb_codemirror_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/codemirror/lib/codemirror.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'codemirror_hint', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/codemirror/addon/hint/show-hint.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'codemirror_mode_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/codemirror/mode/css/css.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'codemirror_hint_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/codemirror/addon/hint/css-hint.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'less_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/less.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'minicolors_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/jquery.minicolors.min.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'slick_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/slick.min.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'advgb_masonry_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/isotope.pkgd.min.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); $saved_settings = get_option( 'advgb_settings' ); if ( isset( $saved_settings['editor_width'] ) && $saved_settings['editor_width'] ) { wp_add_inline_style( 'dashicons', 'body:not(.advgb-editor-width-default) #editor .edit-post-visual-editor__post-title-wrapper > .wp-block,body:not(.advgb-editor-width-default) #editor .block-editor-writing-flow > .block-editor-block-list__layout > .wp-block{max-width:' . $saved_settings['editor_width'] . '%;width:' . $saved_settings['editor_width'] . '%;margin-left:auto;margin-right:auto}' ); } } } /** * Register front-end styles and script for later use * * @return void */ public function registerStylesScriptsFrontend() { if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { wp_register_script( 'advgb_blocks_frontend_scripts', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/frontend.js', array(), ADVANCED_GUTENBERG_VERSION ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_register_scripts_frontend' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_register_scripts_frontend(); } } } wp_register_style( 'colorbox_style', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/colorbox.css', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'slick_style', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/slick.css' ); wp_register_style( 'slick_theme_style', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/slick-theme.css', [ 'dashicons' ], ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'material_icon_font', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/fonts/material-icons.min.css' ); wp_register_style( 'material_icon_font_custom', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/fonts/material-icons-custom.min.css' ); if ( Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { wp_register_style( 'advgb_columns_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/columns.css', array(), ADVANCED_GUTENBERG_VERSION ); wp_register_style( 'advgb_recent_posts_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/recent-posts.css', array(), ADVANCED_GUTENBERG_VERSION ); } wp_register_script( 'colorbox_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/jquery.colorbox.min.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'slick_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/slick.min.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); wp_register_script( 'advgb_masonry_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/isotope.pkgd.min.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); $saved_settings = get_option( 'advgb_settings' ); if ( isset( $saved_settings['enable_blocks_spacing'] ) && $saved_settings['enable_blocks_spacing'] ) { $blocks_spacing = isset( $saved_settings['blocks_spacing'] ) ? $saved_settings['blocks_spacing'] : 0; wp_add_inline_style( 'dashicons', '.entry-content > * {margin-bottom: ' . $blocks_spacing . 'px !important}' ); } } /** * Get list of submenu pages * * @return array * @since 3.0.0 */ public function subAdminPages() { /* Duplicate first submenu from parent to generate a different menu title. * 'Blocks' -> 'Dashboard' */ $submenu_pages = [ [ 'slug' => 'advgb_main', 'title' => esc_html__( 'Dashboard', 'advanced-gutenberg' ), 'callback' => 'loadMainPage', 'order' => 1, 'enabled' => true ], [ 'slug' => 'advgb_block_access', 'title' => esc_html__( 'Block Permissions', 'advanced-gutenberg' ), 'callback' => 'loadBlockAccessPage', 'order' => 2, 'enabled' => Utilities::settingIsEnabled( 'enable_block_access' ) ], [ 'slug' => 'advgb_block_settings', 'title' => esc_html__( 'PublishPress Blocks', 'advanced-gutenberg' ), 'callback' => 'loadBlockSettingsPage', 'order' => 3, 'enabled' => Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ], [ 'slug' => 'advgb_custom_styles', 'title' => esc_html__( 'Block Styles', 'advanced-gutenberg' ), 'callback' => 'loadCustomStylesPage', 'order' => 5, 'enabled' => Utilities::settingIsEnabled( 'enable_custom_styles' ) ], [ 'slug' => 'advgb_block_controls', 'title' => esc_html__( 'Block Controls', 'advanced-gutenberg' ), 'callback' => 'loadBlockControlsPage', 'order' => 6, 'enabled' => Utilities::settingIsEnabled( 'block_controls' ) ], [ 'slug' => 'edit.php?post_type=wp_block', 'title' => esc_html__( 'Synced Patterns', 'advanced-gutenberg' ), 'callback' => '', 'order' => 7, 'enabled' => Utilities::settingIsEnabled( 'reusable_blocks' ) ], [ 'slug' => 'advgb_settings', 'title' => esc_html__( 'Settings', 'advanced-gutenberg' ), 'callback' => 'loadSettingsPage', 'order' => 8, 'enabled' => true ] ]; return $submenu_pages; } /** * Register admin menu pages * * @return void */ public function registerMainMenu() { if ( ! current_user_can( 'manage_options' ) ) { return false; } global $submenu; if ( empty( $GLOBALS['admin_page_hooks']['advgb_main'] ) ) { add_menu_page( 'Blocks', 'Blocks', 'manage_options', 'advgb_main', [ $this, 'loadMainPage' ], 'dashicons-layout', 20 ); $submenu_pages = $this->subAdminPages(); foreach ( $submenu_pages as $page ) { $hook = add_submenu_page( 'advgb_main', $page['title'], $page['title'], 'manage_options', $page['slug'], // slug should use underscores, not hyphen due we generate automatic function names based on it ! empty( $page['callback'] ) ? [ $this, $page['callback'] ] : '', $page['order'] ); /* Hooks to generate function names for each page and call them to save data. * e.g. advgb_block_access_save_page */ $function_name = $page['slug'] . '_save_page'; if ( ! empty( $hook ) && method_exists( $this, $function_name ) ) { // e.g. 'load-blocks_page_advgb_block_access' add_action( 'load-' . $hook, [ $this, $function_name ] ); } } /* Add CSS classes to these submenus to dynamically show/hide them * through main page enable/disable features * e.g. <li class="advgb_custom_styles-menu-item"><a href="admin.php?page=advgb_custom_styles" class="advgb_custom_styles-menu-item">Block Styles</a></li> */ $submenu_slugs = []; $submenu_slugs_conditions = []; foreach ( $submenu_pages as $page ) { $submenu_slugs[] = $page['slug']; $submenu_slugs_conditions[] = [ $page['slug'], $page['enabled'] ]; } foreach ( $submenu['advgb_main'] as $key => $value ) { if ( in_array( $submenu['advgb_main'][ $key ][2], $submenu_slugs ) ) { $slug_ = $submenu['advgb_main'][ $key ][2]; // Add a class to hide menu if feature is disabled on Dashboard foreach ( $submenu_slugs_conditions as $item ) { if ( $item[0] === $slug_ ) { $showHide = $item[1] === false ? ' advgb-hide-menu-item' : ''; break; } } $submenu['advgb_main'][ $key ][4] = $slug_ . '-menu-item' . $showHide; } } } } /** * Output feature boxes in main admin page * * @param array $features List of features * * @return void * @since 3.0.0 */ public function featuresBoxes( $features ) { ?> <div class="advgb-features-boxes advgb-features-boxes--<?php echo( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ? 'ispro' : 'isfree' ) ?>"> <?php foreach ( $features as $feature ) : ?> <div class="advgb-feature-box<?php echo( ! $feature['access'] ? ' advgb-feature-box--disabled' : '' ); ?>"> <h3> <?php echo $feature['title']; echo ! $feature['access'] ? ' <span>Pro</span>' : ''; ?> </h3> <div class="advgb-feature-description"> <?php echo $feature['description'] ?> </div> <div class="advgb-feature-setting"> <div class="advgb-switch-button"> <label class="switch"> <input type="checkbox" name="" value="1" <?php if ( $feature['access'] ) { echo $this->getOptionSetting( 'advgb_settings', $feature['name'], 'checkbox', $feature['default'] ) . ' data-feature="' . $feature['name']; } else { echo ' disabled'; } ?>"> <span class="slider<?php echo( ! $feature['access'] ? ' slider--disabled' : '' ); ?>"></span> </label> </div> </div> </div> <?php endforeach; ?> </div> <?php } /** * Load common JS and CSS for admin pages * * @return void * @since 3.0.0 */ public function commonAdminPagesAssets() { wp_enqueue_script( 'advgb_main_js' ); wp_enqueue_script( 'advgb_settings_js' ); wp_enqueue_script( 'minicolors_js' ); wp_enqueue_script( 'qtip_js' ); wp_enqueue_style( 'advgb_admin_styles' ); wp_enqueue_style( 'advgb_qtip_style' ); wp_enqueue_style( 'minicolors_css' ); } /** * Main page * * @return void * @since 3.0.0 */ public function loadMainPage() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } $this->commonAdminPagesAssets(); wp_localize_script( 'advgb_main_js', 'advgb_main_dashboard', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'advgb_main_features_nonce' ) ] ); $this->loadPage( 'main' ); } /** * Settings page * * @return void * @since 3.0.0 */ public function loadSettingsPage() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } $this->commonAdminPagesAssets(); $this->loadPage( 'settings' ); } /** * Block access page * * @return void * @since 3.0.0 */ public function loadBlockAccessPage() { // Check users permissions if ( ! current_user_can( 'administrator' ) ) { return false; } // Block access is disabled if ( ! Utilities::settingIsEnabled( 'enable_block_access' ) ) { wp_die( sprintf( esc_html__( 'This feature is disabled. In order to use, please enable back through %sDashboard%s.', 'advanced-gutenberg' ), '<a href="' . admin_url( 'admin.php?page=advgb_main' ) . '">', '</a>' ) ); } $this->commonAdminPagesAssets(); /* Access current user blocks and saved blocks to build 2 javascript objects. * 'advgbCUserRole' object for current user role from form dropdown * 'advgb_blocks_list' object with all the saved blocks in 'advgb_blocks_list' option */ $this->blocksFeatureData( 'access', // The object name to store the active/inactive blocks. To see it in browser console: advgbCUserRole.access 'advgb_blocks_user_roles' // Database option to check current user role's active/inactive blocks ); // Render form $this->blocksFeatureForm( 'access', // Feature name in lowercase __( 'Block Permissions', 'advanced-gutenberg' ) // Name of the feature ); } /** * Block controls page * * @return void * @since 3.1.0 */ public function loadBlockControlsPage() { // Check users permissions if ( ! current_user_can( 'administrator' ) ) { return false; } // Block controls is disabled if ( ! Utilities::settingIsEnabled( 'block_controls' ) ) { wp_die( sprintf( esc_html__( 'This feature is disabled. In order to use, please enable back through %sDashboard%s.', 'advanced-gutenberg' ), '<a href="' . admin_url( 'admin.php?page=advgb_main' ) . '">', '</a>' ) ); } $this->commonAdminPagesAssets(); // Output blocks through javascript PublishPress\Blocks\Controls::adminData(); $this->loadPage( 'block-controls' ); } /** * Block settings page * * @return void * @since 3.0.0 */ public function loadBlockSettingsPage() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } // PublishPress blocks is disabled if ( ! Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { wp_die( sprintf( esc_html__( 'This feature is disabled. In order to use, please enable back through %sDashboard%s.', 'advanced-gutenberg' ), '<a href="' . admin_url( 'admin.php?page=advgb_main' ) . '">', '</a>' ) ); } $this->commonAdminPagesAssets(); $this->loadPage( 'block-settings' ); } /** * Email & form page * * @return void * @since 3.0.0 */ public function loadEmailFormPage() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } $this->commonAdminPagesAssets(); $this->loadPage( 'email-form' ); } /** * Custom styles page * * @return void * @since 3.0.0 */ public function loadCustomStylesPage() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } // Custom styles is disabled if ( ! Utilities::settingIsEnabled( 'enable_custom_styles' ) ) { wp_die( sprintf( esc_html__( 'This feature is disabled. In order to use, please enable back through %sDashboard%s.', 'advanced-gutenberg' ), '<a href="' . admin_url( 'admin.php?page=advgb_main' ) . '">', '</a>' ) ); } wp_enqueue_script( 'less_js' ); wp_enqueue_script( 'advgb_codemirror_js' ); wp_enqueue_script( 'codemirror_hint' ); wp_enqueue_script( 'codemirror_mode_css' ); wp_enqueue_script( 'codemirror_hint_css' ); wp_enqueue_script( 'advgb_custom_styles_js' ); wp_enqueue_style( 'codemirror_css' ); wp_enqueue_style( 'codemirror_hint_style' ); $this->commonAdminPagesAssets(); $this->loadPage( 'custom-styles' ); } /** * PublishPress admin footer * * @return void * @since 3.0.0 */ public function adminFooter( $footer ) { global $current_screen; // When free and pro are active, avoid displaying our footer twice if ( defined( 'ADVANCED_GUTENBERG_FOOTER_DISPLAYED' ) ) { return $footer; } // Only display in PublishPress Blocks admin pages $pages = [ 'toplevel_page_advgb_main', 'blocks_page_advgb_block_access', 'blocks_page_advgb_block_settings', 'blocks_page_advgb_custom_styles', 'blocks_page_advgb_settings', 'blocks_page_advgb_block_controls' ]; if ( ! in_array( $current_screen->base, $pages ) ) { return $footer; } $html = ''; if ( ! defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) || Utilities::settingIsEnabled( 'enable_pp_branding' ) ) { $html .= '<div class="advgb-footer"> <footer> <div class="advgb-rating"> <a href="https://wordpress.org/support/plugin/advanced-gutenberg/reviews/#new-post" target="_blank" rel="noopener noreferrer" class="ag-footer-link" >' . sprintf( __( 'If you like %sPublishPress Blocks%s please leave us a %s rating. Thank you!', 'advanced-gutenberg' ), '<strong>', '</strong>', str_repeat( '<span class="dashicons dashicons-star-filled"></span>', 5 ) ) . '</a> </div> <hr> <nav> <ul> <li> <a href="https://publishpress.com" target="_blank" rel="noopener noreferrer" title="' . esc_attr__( 'About PublishPress Blocks', 'advanced-gutenberg' ) . '" class="ag-footer-link" >' . __( 'About', 'advanced-gutenberg' ) . '</a> </li> <li> <a href="https://publishpress.com/knowledge-base/installation/" target="_blank" rel="noopener noreferrer" title="' . esc_attr__( 'Documentation', 'advanced-gutenberg' ) . '" class="ag-footer-link" >' . __( 'Documentation', 'advanced-gutenberg' ) . ' </a> </li> <li> <a href="https://publishpress.com/contact" target="_blank" rel="noopener noreferrer" title="' . esc_attr__( 'Contact the PublishPress team', 'advanced-gutenberg' ) . '" class="ag-footer-link" >' . __( 'Contact', 'advanced-gutenberg' ) . '</a> </li> <li> <a href="https://twitter.com/publishpresscom" target="_blank" rel="noopener noreferrer" class="ag-footer-link" > <span class="dashicons dashicons-twitter"></span> </a> </li> <li> <a href="https://facebook.com/publishpress" target="_blank" rel="noopener noreferrer" class="ag-footer-link" > <span class="dashicons dashicons-facebook"></span> </a> </li> </ul> </nav> <div class="advgb-pressshack-logo"> <a href="https://publishpress.com" target="_blank" rel="noopener noreferrer"> <img src="' . esc_url( ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/images/publishpress-logo.png' ) . '" alt="' . esc_attr__( 'PublishPress Blocks logo', 'advanced-gutenberg' ) . '"> </a> </div> </footer> </div>'; } // $footer is the "Thank you for creating with WordPress" text $footer = $html . $footer; if ( ! defined( 'ADVANCED_GUTENBERG_FOOTER_DISPLAYED' ) ) { define( 'ADVANCED_GUTENBERG_FOOTER_DISPLAYED', true ); } return $footer; } /** * Admin menu styles * * @return void * @since 3.1.0 */ public function adminMenuStyles() { wp_enqueue_style( 'advgb_admin_menu_styles' ); } /** * Let's save a trigger option when a new plugin has been activated * We use the boolean value of advgb_maybe_new_blocks option * to trigger an update for advgb_blocks_list option through initBlocksList() * * @return void * @since 3.1.4.2 * */ public function maybeNewBlocks( $plugin, $network_activation ) { update_option( 'advgb_maybe_new_blocks', intval( true ), false ); } /** * Register meta data to use on editor sidebar * * @return void */ public function registerPostMeta() { register_post_meta( '', 'advgb_blocks_editor_width', array( 'show_in_rest' => true, 'single' => true, 'type' => 'string', ) ); register_post_meta( '', 'advgb_blocks_columns_visual_guide', array( 'show_in_rest' => true, 'single' => true, 'type' => 'string', ) ); } /** * Get a setting from a database option and return a working value * to output in an HTML form * * @param string $option Database option name. e.g. 'advgb_settings' * @param mixed $name Setting name - e.g. 'lorem' from advgb_settings option * @param string $type $setting field type. 'checkbox' or 'text' * @param mixed $default Default value when $setting doesn't exist in $option * * @return mixed * @since 3.0.0 */ public function getOptionSetting( $option, $name, $type, $default ) { $settings = get_option( $option ); switch ( $type ) { case 'checkbox': $result = isset( $settings[ $name ] ) && $settings[ $name ] ? 'checked' : ''; if ( ! isset( $settings[ $name ] ) && $default === 1 ) { $result = 'checked'; } break; case 'text': // For input types: text, number and textarea $result = isset( $settings[ $name ] ) && ! empty( $settings[ $name ] ) ? $settings[ $name ] : $default; break; } return $result; } /** * Convert Editor Width value into a string * * @param int $value Editor width number * * @return string */ public function getAdvgbEditorWidth( $value ) { $result = ''; switch ( $value ) { default: $result = 'default'; break; case '75': $result = 'large'; break; case '95': $result = 'full'; break; } return $result; } /** * Get Global Columns Visual Guide * * @deprecated 3.2.0 - Use colsVisualGuideGlobal() instead * * @param int $value Columns Visual Guide check * * @return string */ public function getAdvgbColsVisualGuideGlobal( $value ) { return ( isset( $value ) && ( $value == 0 ) ) ? 'disable' : 'enable'; } /** * Get Global Columns Visual Guide (new method) * * @since 3.2.0 * * @return string */ public function colsVisualGuideGlobal() { $saved_settings = get_option( 'advgb_settings' ); return isset( $saved_settings['enable_columns_visual_guide'] ) && ! (bool) $saved_settings['enable_columns_visual_guide'] ? 'disable' : 'enable'; } /** * Set body classes for Editor width and Columns visual guide * * @param string $classes CSS class from body */ public function setAdvgEditorBodyClassses( $classes ) { $saved_settings = get_option( 'advgb_settings' ); if ( 'post' === get_current_screen()->base ) { $saved_settings = get_option( 'advgb_settings' ); global $post; $editorWidth = get_post_meta( $post->ID, 'advgb_blocks_editor_width', true ); $editorColsVG = get_post_meta( $post->ID, 'advgb_blocks_columns_visual_guide', true ); $editorWidthGlobal = isset( $saved_settings['editor_width'] ) && ! empty( $saved_settings['editor_width'] ) ? $this->getAdvgbEditorWidth( $saved_settings['editor_width'] ) : 'default'; $editorColsVGGlobal = $this->colsVisualGuideGlobal(); // Editor width if ( isset( $editorWidth ) && ! empty( $editorWidth ) ) { // Editor width - Post meta $classes .= ' advgb-editor-width-' . $editorWidth . ' '; } else { // Editor width - Global configuration $classes .= ' advgb-editor-width-' . $editorWidthGlobal . ' '; } // Columns visual guide if ( isset( $editorColsVG ) && ! empty( $editorColsVG ) ) { // Columns visual guide - Post meta $classes .= ' advgb-editor-col-guide-' . $editorColsVG . ' '; } else { // Columns visual guide - Global configuration $classes .= ' advgb-editor-col-guide-' . $editorColsVGGlobal . ' '; } return $classes; } elseif ( 'widgets' === get_current_screen()->id ) { // Use global Columns Visual Guide in Appearance > Widgets $editorColsVGGlobal = $this->colsVisualGuideGlobal(); $classes .= ' advgb-editor-col-guide-' . $editorColsVGGlobal; } return $classes; } /** * Save settings page data * * @return mixed * @since 3.0.0 */ public function advgb_settings_save_page() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } // General settings if ( isset( $_POST['save_settings_general'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- we check nonce below { if ( ! wp_verify_nonce( sanitize_key( $_POST['advgb_settings_general_nonce_field'] ), 'advgb_settings_general_nonce' ) ) { return false; } $advgb_settings = get_option( 'advgb_settings' ); $advgb_settings['enable_blocks_spacing'] = isset( $_POST['enable_blocks_spacing'] ) ? 1 : 0; $advgb_settings['disable_wpautop'] = isset( $_POST['disable_wpautop'] ) ? 1 : 0; // @TODO Remove later $advgb_settings['enable_columns_visual_guide'] = isset( $_POST['enable_columns_visual_guide'] ) ? 1 : 0; $advgb_settings['blocks_spacing'] = (int) $_POST['blocks_spacing']; $advgb_settings['blocks_icon_color'] = sanitize_hex_color( $_POST['blocks_icon_color'] ); $advgb_settings['editor_width'] = sanitize_text_field( $_POST['editor_width'] ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_setting_set_value' ) ) { $advgb_settings['enable_pp_branding'] = PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_setting_set_value( 'enable_pp_branding' ); } } update_option( 'advgb_settings', $advgb_settings ); if ( isset( $_REQUEST['_wp_http_referer'] ) ) { wp_safe_redirect( admin_url( 'admin.php?page=advgb_settings&tab=general&save=success' ) ); exit; } } // Images settings elseif ( isset( $_POST['save_settings_images'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- we check nonce below { if ( ! wp_verify_nonce( sanitize_key( $_POST['advgb_settings_images_nonce_field'] ), 'advgb_settings_images_nonce' ) ) { return false; } $advgb_settings = get_option( 'advgb_settings' ); $advgb_settings['gallery_lightbox'] = isset( $_POST['gallery_lightbox'] ) ? 1 : 0; $advgb_settings['gallery_lightbox_caption'] = (int) $_POST['gallery_lightbox_caption']; $advgb_settings['rp_default_thumb'] = [ 'url' => esc_url_raw( $_POST['post_default_thumb'] ), 'id' => (int) $_POST['post_default_thumb_id'] ]; update_option( 'advgb_settings', $advgb_settings ); if ( isset( $_REQUEST['_wp_http_referer'] ) ) { wp_safe_redirect( admin_url( 'admin.php?page=advgb_settings&tab=images&save=success' ) ); exit; } } // Maps settings elseif ( isset( $_POST['save_settings_maps'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- we check nonce below { if ( ! wp_verify_nonce( sanitize_key( $_POST['advgb_settings_maps_nonce_field'] ), 'advgb_settings_maps_nonce' ) ) { return false; } $advgb_settings = get_option( 'advgb_settings' ); $advgb_settings['google_api_key'] = sanitize_text_field( $_POST['google_api_key'] ); update_option( 'advgb_settings', $advgb_settings ); if ( isset( $_REQUEST['_wp_http_referer'] ) ) { wp_safe_redirect( admin_url( 'admin.php?page=advgb_settings&tab=maps&save=success' ) ); exit; } } // Email & forms settings elseif ( isset( $_POST['save_email_config'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- we check nonce below { if ( ! isset( $_POST['advgb_email_config_nonce_field'] ) ) { return false; } if ( ! wp_verify_nonce( sanitize_key( $_POST['advgb_email_config_nonce_field'] ), 'advgb_email_config_nonce' ) ) { return false; } $save_config = []; $save_config['contact_form_sender_name'] = sanitize_text_field( $_POST['contact_form_sender_name'] ); $save_config['contact_form_sender_email'] = sanitize_email( $_POST['contact_form_sender_email'] ); $save_config['contact_form_email_title'] = sanitize_text_field( $_POST['contact_form_email_title'] ); $save_config['contact_form_email_receiver'] = sanitize_email( $_POST['contact_form_email_receiver'] ); update_option( 'advgb_email_sender', $save_config ); if ( isset( $_REQUEST['_wp_http_referer'] ) ) { wp_safe_redirect( admin_url( 'admin.php?page=advgb_settings&tab=forms&save=success' ) ); exit; // @TODO - Do we really need this? } } // reCAPTCHA settings elseif ( isset( $_POST['save_recaptcha_config'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- we check nonce below { if ( ! isset( $_POST['advgb_captcha_nonce_field'] ) ) { return false; } if ( ! wp_verify_nonce( sanitize_key( $_POST['advgb_captcha_nonce_field'] ), 'advgb_captcha_nonce' ) ) { return false; } $save_config = []; if ( isset( $_POST['recaptcha_enable'] ) ) { $save_config['recaptcha_enable'] = 1; } else { $save_config['recaptcha_enable'] = 0; } $save_config['recaptcha_site_key'] = sanitize_text_field( $_POST['recaptcha_site_key'] ); $save_config['recaptcha_secret_key'] = sanitize_text_field( $_POST['recaptcha_secret_key'] ); $save_config['recaptcha_language'] = sanitize_text_field( $_POST['recaptcha_language'] ); $save_config['recaptcha_theme'] = sanitize_text_field( $_POST['recaptcha_theme'] ); update_option( 'advgb_recaptcha_config', $save_config ); if ( isset( $_REQUEST['_wp_http_referer'] ) ) { wp_safe_redirect( admin_url( 'admin.php?page=advgb_settings&tab=recaptcha&save=success' ) ); exit; } } // Data export elseif ( isset( $_POST['block_data_export'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- we check nonce below { if ( ! wp_verify_nonce( sanitize_key( $_POST['advgb_export_data_nonce_field'] ), 'advgb_export_data_nonce' ) ) { return false; } $postValue = sanitize_text_field( $_POST['block_data_export'] ); $postValue = explode( '.', $postValue ); $dataExport = $postValue[0]; $dataType = $postValue[1]; $data = ''; if ( $dataExport === 'contact_form' ) { $dataSaved = get_option( 'advgb_contacts_saved' ); if ( ! $dataSaved ) { return false; } switch ( $dataType ) { case 'csv': $data .= '"#","Date","Name","Email","Message"' . PHP_EOL; $tab = ','; $int = 1; foreach ( $dataSaved as $dataVal ) { $data .= '"' . $int . '"' . $tab; $data .= '"' . $dataVal['date'] . '"' . $tab; $data .= '"' . $dataVal['name'] . '"' . $tab; $data .= '"' . $dataVal['email'] . '"' . $tab; $data .= '"' . $dataVal['msg'] . '"'; $data .= PHP_EOL; $int ++; } $data = trim( $data ); header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_contact_form-' . date( 'm-d-Y' ) . '.csv' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo $data; // phpcs:ignore -- WordPress.Security.EscapeOutput.OutputNotEscaped exit; case 'json': header( 'Content-Type: application/json; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_contact_form-' . date( 'm-d-Y' ) . '.json' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo json_encode( $dataSaved ); exit; } } elseif ( $dataExport === 'newsletter' ) { $dataSaved = get_option( 'advgb_newsletter_saved' ); if ( ! $dataSaved ) { return false; } switch ( $dataType ) { case 'csv': $data .= '"#","Date","First Name","Last Name","Email",' . PHP_EOL; $tab = ','; $int = 1; foreach ( $dataSaved as $dataVal ) { $data .= '"' . $int . '"' . $tab; $data .= '"' . $dataVal['date'] . '"' . $tab; $data .= '"' . $dataVal['fname'] . '"' . $tab; $data .= '"' . $dataVal['lname'] . '"' . $tab; $data .= '"' . $dataVal['email'] . '"'; $data .= PHP_EOL; $int ++; } $data = trim( $data ); header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_newsletter-' . date( 'm-d-Y' ) . '.csv' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo $data; // phpcs:ignore -- WordPress.Security.EscapeOutput.OutputNotEscaped exit; case 'json': header( 'Content-Type: application/json; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_newsletter-' . date( 'm-d-Y' ) . '.json' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo json_encode( $dataSaved ); exit; } } return false; } return false; } /** * Save block access page data * Name is build in registerMainMenu() > $function_name * * @return boolean true on success, false on failure * @since 3.0.0 */ public function advgb_block_access_save_page() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } if ( isset( $_POST['advgb_block_access_save'] ) ) { // Save Block Access $this->blocksFeatureSave( 'access', // Feature in lowercase 'advgb_blocks_user_roles' // Database option to update ); return true; } return false; } /** * Save block controls page data * Name is build in registerMainMenu() > $function_name * * @return boolean true on success, false on failure * @since 3.1.0 */ public function advgb_block_controls_save_page() { PublishPress\Blocks\Controls::save(); } /** * Redirect after saving custom styles page data * Name is build in registerMainMenu() > $function_name * * @return boolean true on success, false on failure * @since 3.0.0 */ public function advgb_custom_styles_save_page() { if ( ! current_user_can( 'activate_plugins' ) ) { return false; } if ( isset( $_POST['save_custom_styles'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- we check nonce below { if ( ! wp_verify_nonce( sanitize_key( $_POST['advgb_cstyles_nonce_field'] ), 'advgb_cstyles_nonce' ) ) { return false; } if ( isset( $_REQUEST['_wp_http_referer'] ) ) { wp_safe_redirect( admin_url( 'admin.php?page=advgb_custom_styles&save=success' ) ); exit; } } return true; } /** * Load Block Styles in <head> in frontend * * @return void */ public function loadCustomStylesFrontend() { $post_content = get_the_content(); $this->getCustomStylesContent( $post_content ); // @TODO Check for Custom styles in use in Widgets } /** * Get Block Styles in use in Contennt * * @return string */ public function getCustomStylesContent( $content ) { $custom_styles = get_option( 'advgb_custom_styles' ); if ( is_array( $custom_styles ) ) { $css = ''; foreach ( $custom_styles as $styles ) { // @TODO Check if the class is in use in the post and widgets //if (strpos($content, $styles['name']) !== false) { $css .= '.' . $styles['name'] . " {\n"; $css .= $styles['css'] . "\n} \n"; //} } if ( ! empty( $css ) ) { echo '<style type="text/css">' . strip_tags( $css ) . '</style>'; } } } /** * Load Block Styles in <head> in admin * * @return void */ public function loadCustomStylesAdmin() { $custom_styles = get_option( 'advgb_custom_styles' ); if ( is_array( $custom_styles ) ) { $content = ''; foreach ( $custom_styles as $styles ) { $content .= '.block-editor-writing-flow .' . esc_html( $styles['name'] ) . " {\n"; $content .= $styles['css'] . "\n} \n"; } echo '<style type="text/css">' . strip_tags( $content ) . '</style>'; } } /** * Set blocks spacing in editor * * @return void */ public function setBlocksSpacingAdmin() { $saved_settings = get_option( 'advgb_settings' ); if ( isset( $saved_settings['enable_blocks_spacing'] ) && $saved_settings['enable_blocks_spacing'] ) { $blocks_spacing = isset( $saved_settings['blocks_spacing'] ) ? $saved_settings['blocks_spacing'] : 0; echo '<style type="text/css">.editor-styles-wrapper [data-block] { margin-bottom: ' . esc_html( $blocks_spacing ) . 'px !important; }</style>'; } } /** * Save block [feature] by user role - e.g. access feature means enable/disable blocks in editor * * @param string $feature Feature name in lowercase - e.g. 'access' * @param string $option Database option to update - e.g. 'advgb_blocks_user_roles' * * @return void * @since 3.0.0 */ public function blocksFeatureSave( $feature, $option ) { // Check nonce field exist if ( ! isset( $_POST[ 'advgb_block_' . $feature . '_nonce_field' ] ) ) { return false; } // Verify nonce if ( ! wp_verify_nonce( sanitize_key( $_POST[ 'advgb_block_' . $feature . '_nonce_field' ] ), 'advgb_nonce' ) ) { return false; } if ( ! current_user_can( 'administrator' ) ) { return false; } if ( isset( $_POST['blocks_list'] ) && isset( $_POST['active_blocks'] ) && is_array( $_POST['active_blocks'] ) && isset( $_POST['user_role'] ) && ! empty( $_POST['user_role'] ) ) { // @TODO - Check if user role exists - https://gist.github.com/hlashbrooke/8f901da7c6f0d107add7 $user_role = sanitize_text_field( $_POST['user_role'] ); $blocks_list = array_map( 'sanitize_text_field', json_decode( stripslashes( $_POST['blocks_list'] ) ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ); $active_blocks = array_map( 'sanitize_text_field', $_POST['active_blocks'] ); $inactive_blocks = array_values( array_diff( $blocks_list, $active_blocks ) ); // Save feature by role $block_feature_by_role = get_option( $option ); $block_feature_by_role[ $user_role ]['active_blocks'] = isset( $active_blocks ) ? $active_blocks : ''; $block_feature_by_role[ $user_role ]['inactive_blocks'] = isset( $inactive_blocks ) ? $inactive_blocks : ''; update_option( $option, $block_feature_by_role, false ); // Redirect with success message wp_safe_redirect( add_query_arg( [ 'user_role' => $user_role, 'save' => 'success' ], wp_get_referer() ) ); } else { // Redirect with error message / Nothing was saved wp_safe_redirect( add_query_arg( [ 'user_role' => $user_role, 'save' => 'error' ], wp_get_referer() ) ); } } /** * Return current select user role * * @return string * @since 2.14.1 * */ public function advgbBlocksFeatureCUserRole() { if ( isset( $_REQUEST['user_role'] ) && ! empty( $_REQUEST['user_role'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- advgb_nonce in place return sanitize_text_field( $_REQUEST['user_role'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- advgb_nonce in place } else { return 'administrator'; } } /** * Access current user blocks and saved blocks to build 2 javascript objects. * 'advgbCUserRole' object for current user role from form dropdown * 'advgb_blocks_list' object with all the saved blocks in 'advgb_blocks_list' option * * @param string $feature The object name to store the active/inactive blocks - e.g. 'access' => advgbCUserRole.access * @param string $option Database option to check current user role's active/inactive blocks - e.g. 'advgb_blocks_user_roles' * @param array $exclude Blocks to exclude from appearing in the feature form (is different to inactive_blocks!). e.g. ['core/paragraph','core/list'] * * @return void * @since 3.0.0 */ public function blocksFeatureData( $feature, $option, $exclude = [] ) { // Build blocks form and add filters functions wp_add_inline_script( 'advgb_main_js', "window.addEventListener('load', function () { advgbGetBlocksFeature( advgbCUserRole.{$feature}.inactive_blocks, '#advgb_block_{$feature}_nonce_field', 'advgb_block_{$feature}', " . wp_json_encode( $exclude ) . " ); });" ); do_action( 'enqueue_block_editor_assets' ); // Block categories $blockCategories = array(); if ( function_exists( 'get_block_categories' ) ) { $blockCategories = get_block_categories( get_post() ); } elseif ( function_exists( 'gutenberg_get_block_categories' ) ) { $blockCategories = gutenberg_get_block_categories( get_post() ); } wp_add_inline_script( 'wp-blocks', sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( $blockCategories ) ), 'after' ); // Block types $block_type_registry = \WP_Block_Type_Registry::get_instance(); foreach ( $block_type_registry->get_all_registered() as $block_name => $block_type ) { if ( ! empty( $block_type->editor_script ) ) { wp_enqueue_script( $block_type->editor_script ); } } /* Get blocks saved in advgb_blocks_list option to include the ones that are missing * as result of javascript method wp.blocks.getBlockTypes() * e.g. blocks registered only via PHP */ if ( Utilities::settingIsEnabled( 'block_extend' ) ) { $advgb_blocks_list = get_option( 'advgb_blocks_list' ); if ( $advgb_blocks_list && is_array( $advgb_blocks_list ) ) { $saved_blocks = $advgb_blocks_list; } else { $saved_blocks = []; } wp_localize_script( 'advgb_main_js', 'advgb_blocks_list', $saved_blocks ); } // Current role $current_user_role = $this->advgbBlocksFeatureCUserRole(); // Active and inactive blocks for current user role $block_feature_by_role = get_option( $option ); if ( ! empty( $block_feature_by_role[ $current_user_role ] ) && is_array( $block_feature_by_role[ $current_user_role ] ) ) { wp_localize_script( 'wp-blocks', 'advgbCUserRole', [ 'user_role' => $current_user_role, $feature => [ 'active_blocks' => $block_feature_by_role[ $current_user_role ]['active_blocks'], 'inactive_blocks' => $block_feature_by_role[ $current_user_role ]['inactive_blocks'] ] ] ); } else { // Nothing saved in database for current user role. Set empty (access to all blocks) wp_localize_script( 'wp-blocks', 'advgbCUserRole', [ 'user_role' => $current_user_role, $feature => [ 'active_blocks' => [], 'inactive_blocks' => [] ] ] ); } } /** * Get the blocks feature form - e.g. Block Access * * @param string $feature Feature name in lowercase - e.g. 'access' * @param string $label Name of the feature with text-domain - e.g. __('Block Permissions', 'advanced-gutenberg') * * @return void * @since 3.0.0 */ public function blocksFeatureForm( $feature, $label ) { // Current role $current_user_role = $this->advgbBlocksFeatureCUserRole(); ?> <div class="publishpress-admin wrap"> <?php if ( isset( $_GET['save'] ) && $_GET['save'] === 'success' ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- display message, no action ?> <div id="message" class="updated fade"> <p> <?php printf( __( '%s saved successfully!', 'advanced-gutenberg' ), $label ); ?> </p> </div> <?php } elseif ( isset( $_GET['save'] ) && $_GET['save'] === 'error' ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- advgb_nonce in place ?> <div class="error"> <p> <?php printf( __( '%s can\'t be saved. Please try again.', 'advanced-gutenberg' ), $label ); ?> </p> </div> <?php } else { // Nothing to do here } ?> <header> <h1 class="wp-heading-inline"> <?php echo $label; ?> </h1> </header> <div class="wrap"> <form method="post"> <?php wp_nonce_field( 'advgb_nonce', 'advgb_block_' . $feature . '_nonce_field' ); ?> <div class="advgb-roles-wrapper"> <?php // Get current page slug if ( isset( $_GET['page'] ) && $_GET['page'] ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $page_ = sanitize_text_field( $_GET['page'] ); ?> <input type="hidden" name="advgb_page_slug" id="advgb_page_slug" value="<?php esc_attr_e( $page_ ) ?>"/> <?php } ?> <input type="hidden" name="advgb_feature" id="advgb_feature" value="<?php echo $feature ?>"/> <div> <select name="user_role" id="user_role"> <?php global $wp_roles; $roles_list = $wp_roles->get_names(); foreach ( $roles_list as $roles => $role_name ) : $role_name = translate_user_role( $role_name ); ?> <option value="<?php echo esc_attr( $roles ); ?>" <?php selected( $current_user_role, $roles ); ?>> <?php echo esc_html( $role_name ); ?> </option> <?php endforeach; ?> </select> </div> <div class="advgb-search-wrapper"> <input type="text" class="blocks-search-input advgb-search-input" placeholder="<?php esc_attr_e( 'Search blocks', 'advanced-gutenberg' ) ?>" > </div> <div class="advgb-toggle-wrapper"> <?php _e( 'Enable or disable all blocks', 'advanced-gutenberg' ) ?> <div class="advgb-switch-button"> <label class="switch"> <input type="checkbox" name="toggle_all_blocks" id="toggle_all_blocks"> <span class="slider"></span> </label> </div> </div> <div class="inline-button-wrapper"> <span class="advgb-enable-one-block-msg" style="display: none;"> <span> <span> <?php esc_attr_e( 'To save this configuration, enable at least one block.', 'advanced-gutenberg' ) ?> </span> <span class="dashicons dashicons-warning"></span> </span> </span> <button class="button button-primary save-profile-button" type="submit" name="advgb_block_<?php echo $feature ?>_save" > <span> <?php printf( __( 'Save %s', 'advanced-gutenberg' ), $label ); ?> </span> </button> </div> </div> <!-- Blocks list --> <div class="tab-content block-list-tab"> <div class="advgb-block-feature-loading-msg" style="display: block;"> <?php _e( 'Loading...', 'advanced-gutenberg' ) ?> </div> <div class="blocks-section"> <input type="hidden" name="blocks_list" id="blocks_list"/> </div> </div> <!-- Save button --> <div class="advgb-form-buttons-bottom"> <button class="button button-primary save-profile-button" type="submit" name="advgb_block_<?php echo $feature ?>_save" > <span> <?php printf( __( 'Save %s', 'advanced-gutenberg' ), $label ); ?> </span> </button> <span class="advgb-enable-one-block-msg" style="display: none;"> <span> <span class="dashicons dashicons-warning"></span> <span> <?php esc_attr_e( 'To save this configuration, enable at least one block.', 'advanced-gutenberg' ) ?> </span> </span> </span> </div> </form> </div> </div> <?php } /** * Download block form data * * @return mixed */ private function downloadBlockFormData() { // Verify nonce if ( ! wp_verify_nonce( sanitize_text_field( $_POST['advgb_export_data_nonce_field'] ), 'advgb_export_data_nonce' ) ) { return false; } $postValue = sanitize_text_field( $_POST['block_data_export'] ); $postValue = explode( '.', $postValue ); $dataExport = $postValue[0]; $dataType = $postValue[1]; $data = ''; if ( $dataExport === 'contact_form' ) { $dataSaved = get_option( 'advgb_contacts_saved' ); if ( ! $dataSaved ) { return false; } switch ( $dataType ) { case 'csv': $data .= '"#","Date","Name","Email","Message"' . PHP_EOL; $tab = ','; $int = 1; foreach ( $dataSaved as $dataVal ) { $data .= '"' . $int . '"' . $tab; $data .= '"' . $dataVal['date'] . '"' . $tab; $data .= '"' . $dataVal['name'] . '"' . $tab; $data .= '"' . $dataVal['email'] . '"' . $tab; $data .= '"' . $dataVal['msg'] . '"'; $data .= PHP_EOL; $int ++; } $data = trim( $data ); header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_contact_form-' . date( 'm-d-Y' ) . '.csv' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo $data; // phpcs:ignore -- WordPress.Security.EscapeOutput.OutputNotEscaped exit; case 'json': header( 'Content-Type: application/json; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_contact_form-' . date( 'm-d-Y' ) . '.json' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo json_encode( $dataSaved ); exit; } } elseif ( $dataExport === 'newsletter' ) { $dataSaved = get_option( 'advgb_newsletter_saved' ); if ( ! $dataSaved ) { return false; } switch ( $dataType ) { case 'csv': $data .= '"#","Date","First Name","Last Name","Email",' . PHP_EOL; $tab = ','; $int = 1; foreach ( $dataSaved as $dataVal ) { $data .= '"' . $int . '"' . $tab; $data .= '"' . $dataVal['date'] . '"' . $tab; $data .= '"' . $dataVal['fname'] . '"' . $tab; $data .= '"' . $dataVal['lname'] . '"' . $tab; $data .= '"' . $dataVal['email'] . '"'; $data .= PHP_EOL; $int ++; } $data = trim( $data ); header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_newsletter-' . date( 'm-d-Y' ) . '.csv' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo $data; // phpcs:ignore -- WordPress.Security.EscapeOutput.OutputNotEscaped exit; case 'json': header( 'Content-Type: application/json; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=advgb_newsletter-' . date( 'm-d-Y' ) . '.json' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); echo json_encode( $dataSaved ); exit; } } return false; } /** * Retrieve the active and inactive blocks for users regard to PublishPress Blocks access * * @return array */ public function getUserBlocksForGutenberg() { // Get user role if ( is_multisite() && is_super_admin() ) { /* Since a super admin in a child site from a multiste network doesn't have roles * so we set 'administrator' as role */ $current_user_role = 'administrator'; } else { $current_user = wp_get_current_user(); if ( count( $current_user->roles ) === 1 ) { // User has 1 user role $current_user_role = $current_user->roles[0]; // string } elseif ( count( $current_user->roles ) > 1 ) { // User has 2 roles or more $current_user_role = $current_user->roles; // array } else { // Nothing to do here - no user roles return false; } } // All saved blocks (even the ones possibly not detected by Block Permissions) $all_blocks = get_option( 'advgb_blocks_list' ); // Get the array from advgb_blocks_user_roles with all the Block permissions roles $advgb_blocks_user_roles = ! empty( get_option( 'advgb_blocks_user_roles' ) ) ? get_option( 'advgb_blocks_user_roles' ) : []; // User has 1 user role - string if ( gettype( $current_user_role ) === 'string' ) { // Get the array from advgb_blocks_user_roles option that match current user role $advgb_blocks_user_roles = array_key_exists( $current_user_role, $advgb_blocks_user_roles ) ? (array) $advgb_blocks_user_roles[ $current_user_role ] : []; } else { // User has 2 roles or more - array $active_r_ = $inactive_r_ = []; foreach ( $current_user_role as $cur_ ) { // Get the array from advgb_blocks_user_roles option that match current user role if ( array_key_exists( $cur_, $advgb_blocks_user_roles ) ) { $active_r_ = array_merge( $active_r_, (array) $advgb_blocks_user_roles[ $cur_ ]['active_blocks'] ); $inactive_r_ = array_merge( $inactive_r_, (array) $advgb_blocks_user_roles[ $cur_ ]['inactive_blocks'] ); } } // Remove duplicates $active_r_ = array_unique( $active_r_ ); $inactive_r_ = array_unique( $inactive_r_ ); /* Remove active blocks if also exists as inactive in any of the assigned roles; * only blocks activated in all the assigned roles will remain as active. * * Example: * * User has "Lorem" and "Ipsum" roles assigned * * "Dolor block" is enabled for "Lorem" role but disabled for "Ipsum" role, * then "Dolor block" is set as inactive [X]. * * "Dolor block" is enabled for "Lorem" and also for "Ipsum" role, * then "Dolor block" is set as active [✓]. * */ $active_r_ = array_diff( $active_r_, $inactive_r_ ); $advgb_blocks_user_roles = [ 'active_blocks' => array_values( $active_r_ ), 'inactive_blocks' => array_values( $inactive_r_ ) ]; } if ( is_array( $advgb_blocks_user_roles ) && count( $advgb_blocks_user_roles ) > 0 ) { if ( is_array( $advgb_blocks_user_roles['active_blocks'] ) && is_array( $advgb_blocks_user_roles['inactive_blocks'] ) ) { // Include the blocks stored in advgb_blocks_list option but not detected by Block Access foreach ( $all_blocks as $one_block ) { if ( ! in_array( $one_block['name'], $advgb_blocks_user_roles['active_blocks'] ) && ! in_array( $one_block['name'], $advgb_blocks_user_roles['inactive_blocks'] ) ) { array_push( $advgb_blocks_user_roles['active_blocks'], $one_block['name'] ); } } } return $advgb_blocks_user_roles; } // If advgb_blocks_user_roles option doesn't exists, then allow all blocks if ( ! is_array( $all_blocks ) ) { $all_blocks = array(); } else { // Extract block name only and skip the other properties (title, icon, category) foreach ( $all_blocks as $block_key => $block_value ) { $all_blocks[ $block_key ] = $all_blocks[ $block_key ]['name']; } // Include Legacy Widget for execution; this is not saved in db array_push( $all_blocks, 'core/legacy-widget' ); // Remove duplicated just in case $all_blocks = array_unique( $all_blocks ); } /* Make sure specific blocks are included as active - Since 2.11.6 * core/widget-group added since 3.1.4.2 * core/legacy-widget removed since 3.1.5 */ $include_blocks = [ 'core/widget-group' ]; foreach ( $include_blocks as $item ) { if ( ! in_array( $item, $all_blocks ) ) { array_push( $all_blocks, $item ); } } return array( 'active_blocks' => $all_blocks, 'inactive_blocks' => array() ); } /** * Register block config page * * @return void */ public function registerBlockConfigPage() { $advgb_block = array( 'accordions', 'button', 'image', 'list', 'table', 'video', 'contact-form', 'container', 'count-up', 'images-slider', 'map', 'newsletter', 'recent-posts', 'social-links', 'summary', 'adv-tabs', 'testimonial', 'woo-products', 'columns', 'column', 'login-form', 'search-bar', 'icon', 'infobox' ); foreach ( $advgb_block as $block ) { add_submenu_page( 'admin.php?', __( 'Block Config', 'advanced-gutenberg' ), __( 'Block Config', 'advanced-gutenberg' ), 'manage_options', 'advgb-' . $block, array( $this, 'loadBlockConfigView' ) ); } } /** * Function to get and load the block config view * * @param string $block View to load * * @return void */ public function loadBlockConfigView( $block = '' ) { if ( ! $block ) { $block = sanitize_text_field( $_GET['page'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- view only } $core_styles = [ 'common', 'buttons', 'forms', 'edit' ]; foreach ( $core_styles as $style ) { wp_enqueue_style( $style ); } wp_enqueue_style( 'minicolors_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/jquery.minicolors.css' ); wp_enqueue_style( 'block_config_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/block-config.css' ); $loadingImage = ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/images/loading.gif'; wp_add_inline_style( 'block_config_css', '#advgb-loading-screen-image {background-image: url(' . $loadingImage . ')}' ); wp_enqueue_script( 'minicolors_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/jquery.minicolors.min.js', array(), ADVANCED_GUTENBERG_VERSION ); wp_enqueue_script( 'block_config_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/block-config.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); $blocks_settings_list = PublishPress\Blocks\Configuration::defaultConfig(); $advgb_blocks_default_config = get_option( 'advgb_blocks_default_config' ); $current_block = $block; if ( ! isset( $blocks_settings_list[ $current_block ] ) ) { wp_die( esc_html( __( 'Default configuration for this block is not available.', 'advanced-gutenberg' ) ) ); return; } $current_block_settings = $blocks_settings_list[ $current_block ]; $current_block_settings_value = array(); if ( $advgb_blocks_default_config !== false ) { if ( isset( $advgb_blocks_default_config[ $current_block ] ) ) { $current_block_settings_value = $advgb_blocks_default_config[ $current_block ]; } } require_once( plugin_dir_path( __FILE__ ) . 'pages/block-settings/block-config.php' ); } /** * Function to get and load the page * * @param string $page Page to load * * @return void * @since 3.0.0 */ public function loadPage( $page ) { if ( file_exists( plugin_dir_path( __FILE__ ) . 'pages/' . $page . '.php' ) ) { include_once( plugin_dir_path( __FILE__ ) . 'pages/' . $page . '.php' ); } } /** * Function to get and load a tab inside a page * * @param string $page Page folder where tab files are stored * @param string $tab Tab to load * * @return void * @since 3.0.0 */ public function loadPageTab( $page, $tab, $default = 'general' ) { if ( file_exists( plugin_dir_path( __FILE__ ) . 'pages/' . $page . '/' . $tab . '.php' ) ) { include_once( plugin_dir_path( __FILE__ ) . 'pages/' . $page . '/' . $tab . '.php' ); } else if( defined( 'ADVANCED_GUTENBERG_BASE_PRO_PATH' ) && file_exists( ADVANCED_GUTENBERG_BASE_PRO_PATH . '/incl/pages/' . $page . '/' . $tab . '.php' ) ) { // Maybe is a pro page? Look in another location include_once( ADVANCED_GUTENBERG_BASE_PRO_PATH . '/incl/pages/' . $page . '/' . $tab . '.php' ); } else { wp_add_inline_style( 'advgb_admin_styles', '.publishpress-admin .nav-tab-wrapper { display: none !important; }' ); printf( __( 'Page not found. Go to %sDashboard%s', 'advanced-gutenberg' ), '<a href="' . admin_url( 'admin.php?page=advgb_main' ) . '">', '</a>' ); } } /** * Function to build tabs menu * * @param string $page Page slug. e.g. 'advgb_settings' * @param string $active Active tab slug. e.g. 'recaptcha' * @param array $tabs Tabs list * * @return string * @since 3.0.0 */ public function buildTabs( $page, $active, $tabs ) { if ( ! is_array( $tabs ) || empty( $tabs ) ) { return ''; } $html = '<ul class="nav-tab-wrapper">'; foreach ( $tabs as $tab ) { $html .= '<li class="nav-tab' . ( $tab['slug'] === $active ? ' nav-tab-active' : '' ) . '"> <a href="' . admin_url( 'admin.php?page=' . $page . '&tab=' . $tab['slug'] ) . '"> ' . $tab['title'] . ' </a> </li>'; } $html .= '</ul>'; return $html; } /** * Function to load assets for post/page on front-end before gutenberg rendering * * @param array $block Block data * * @return array New block data */ public function contentPreRender( $block ) { // Search for needed blocks then add styles to it $style = $this->addBlocksStyles( $block ); /* Content Display block doesn't render styles * as the rest of blocks as first level block (not as a child), * so we add the inline CSS in head */ if ( $block['blockName'] === 'advgb/recent-posts' && ! empty( $style ) ) { wp_add_inline_style( 'advgb_recent_posts_styles', strip_tags( $style ) ); } else { // Rest of the blocks array_push( $block['innerContent'], $style ); } return $block; } /** * Recursive loop to find nested blocks and load their blocks's CSS and media files * * @param object $block Nested block * @param string $style_html CSS Styles * @param integer $level Nested block level * * @return string CSS Styles * @since 2.6.1 */ public function advgb_getNestedBlocksStyles( $block, $level = 2, &$style_html = array() ) { if ( isset( $block['innerBlocks'] ) ) { foreach ( $block['innerBlocks'] as $key => $inner_block ) { // Get styles $new_style_html = $this->advgb_SetStylesForBlocks( $inner_block['attrs'], $inner_block['blockName'] ); // Add the styles to the array $style_html[] = $new_style_html; //echo str_repeat("--", $level) . $inner_block['blockName'] . ' [ ' . $level . ' ]<br>'; self::advgb_getNestedBlocksStyles( $inner_block, $level + 1, $style_html ); } } $final_styles = $style_html; if ( ! is_string( $final_styles ) ) { // Convert array to string $final_styles = implode( '', array_unique( $style_html ) ); } //echo '<code>' . $final_styles . '</code>'; // This output is correct! return $final_styles; } /** * @TODO Remove later * Check to disable autop used to prevent unwanted paragraphs to blocks * * @param string $filter_name filter name; 'the_content' or 'widget_block_content' * * @return void */ public function checkToDisableWpautop( $filter_name ) { $saved_settings = false; if ( has_filter( $filter_name, 'wpautop' ) ) { if ( ! $saved_settings ) { $saved_settings = get_option( 'advgb_settings' ); } if ( ! empty( $saved_settings['disable_wpautop'] ) ) { remove_filter( $filter_name, 'wpautop' ); } } } /** * Add nonce to blocks with form tag * * @param string $content Post content * * @return string */ public function addNonceToFormBlocks( $block ) { $block = str_replace( '<div class="advgb-form-submit-wrapper"', '<input type="hidden" name="advgb_blockform_nonce_field" value="' . wp_create_nonce( 'advgb_blockform_nonce_field' ) . '"><div class="advgb-form-submit-wrapper"', $block ); return $block; } /** * Load assets for post/page on front-end after gutenberg rendering * * @param string $content Post content * * @return string */ public function addFrontendContentAssets( $content ) { $this->checkToDisableWpautop( 'the_content' ); $this->setFrontendAssets( $content ); $content = $this->groupStylesTag( $content ); return $content; } /** * Load assets for widgets on front-end after gutenberg rendering * * @param string $text Widget content * * @return string */ public function addFrontendWidgetAssets( $text ) { $this->checkToDisableWpautop( 'widget_block_content' ); $this->setFrontendAssets( $text ); $text = $this->groupStylesTag( $text, false ); return $text; } /** * Set frontend assets and styles for posts * * @param string $content Post content * * @return string */ public function setFrontendAssets( $content ) { wp_enqueue_script( 'jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js' ); // @TODO - Load locally // Preview in Customizer > Widgets if ( isset( $_GET['customize_theme'] ) ) { wp_enqueue_style( 'colorbox_style' ); wp_enqueue_style( 'slick_style' ); wp_enqueue_style( 'slick_theme_style' ); wp_enqueue_script( 'colorbox_js' ); wp_enqueue_script( 'slick_js' ); wp_enqueue_script( 'advgb_masonry_js' ); wp_enqueue_script( 'advgb_widgets_customizer_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/widgets-customizer.js', array( 'colorbox_js', 'slick_js', 'advgb_masonry_js' ), ADVANCED_GUTENBERG_VERSION ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_widgets_customizer_frontend' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_widgets_customizer_frontend(); } } // Patch for Twenty Twenty-One $this->fixCssGridFooterWidgets(); } // @TODO Support for Site Editor generated pages if ( strpos( $content, 'wp-block-advgb-count-up' ) !== false ) { $content = preg_replace_callback( '@<div[^>]*?advgb\-count\-up\-columns.*?(</p></div>)@s', array( $this, 'decodeHtmlEntity' ), $content ); } // @TODO Support for Site Editor generated pages if ( strpos( $content, 'advgb-accordion-wrapper' ) !== false ) { $content = preg_replace_callback( '@<div[^>]*?advgb\-accordion\-wrapper.*?(</div></div>.?</div>)@s', array( $this, 'decodeHtmlEntity' ), $content ); } // @TODO Support for Site Editor generated pages if ( strpos( $content, 'advgb-tabs-wrapper' ) !== false ) { // Fix broken tags: <strong> and <em> $content = preg_replace_callback( array( '@<ul class="advgb-tabs-panel">(.*?)<(?:strong|em)>(.*?)</(?:strong|em)>(.*?)</ul>@s', '@<div class="advgb-tab-body-header">(.*?)<(?:strong|em)>(.*?)</(?:strong|em)>(.*?)</div>@s' ), array( $this, 'decodeHtmlEntity' ), $content ); } // @TODO Support for Site Editor generated pages if ( strpos( $content, 'advgb-testimonial' ) !== false ) { $content = preg_replace_callback( '@<div[^>]*?advgb\-testimonial.*?(</p></div></div>)@s', array( $this, 'decodeHtmlEntity' ), $content ); } return $content; } /** * Add styles for Adv Button and Adv List * * @param array $block Block data * * @return string HTML style */ public function addBlocksStyles( $block ) { $style_html = ''; $blockName = $block['blockName']; $blockAttrs = $block['attrs']; if ( $blockName ) { // Get styles for parent blocks $style_html .= $this->advgb_SetStylesForBlocks( $blockAttrs, $blockName ); // Parse styles for nested blocks in WP 5.5+ global $wp_version; if ( $wp_version >= 5.5 ) { // Check blocks in 2nd level and beyond $style_html .= $this->advgb_getNestedBlocksStyles( $block ); } } $style_html = $style_html ? '<style type="text/css" class="advgb-blocks-styles-renderer">' . $style_html . '</style>' : ''; return preg_replace( '/\s\s+/', '', $style_html ); } /** * Find all style tag and append them in the end of content * * @param string $content Content to be prettify * @param boolean $is_post if the content is false, is a widget * * @return string New prettified string */ public function groupStylesTag( $content, $is_post = true ) { // Group styles tag in the end of the content preg_match_all( '/(<style.*?>)(.*?)(<\/style>)/mis', $content, $styles_html ); $styles_tag = ''; if ( count( $styles_html[0] ) ) { foreach ( $styles_html[0] as $key => $style_html ) { $content = str_replace( $style_html, '', $content ); $styles_tag .= $styles_html[2][ $key ]; } } if ( $styles_tag ) { $content .= '<style class="advgb-styles-renderer' . ( $is_post === false ? '-widget' : '' ) . '">' . $styles_tag . '</style>'; } return $content; } /** * Convert html entity to real character * * @param string $match Matched string * * @return mixed */ public function decodeHtmlEntity( $match ) { return str_replace( '<', '<', $match[0] ); } /** * Function to load external plugins for tinyMCE * * @param array $plgs External plugins * * @return array */ public function addTinyMceExternal( array $plgs ) { $plgs['customstyles'] = ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/customstyles/plugin.js'; return $plgs; } /** * Function to add buttons for tinyMCE toolbars * * @param array $buttons TinyMCE buttons * * @return array */ public function addTinyMceButtons( array $buttons ) { array_push( $buttons, 'customstyles' ); return $buttons; } /** * Render html for block config settings fields * * @param array $fieldset Array of field to render * @param array $data Data will load as value to field * * @return boolean Echo html content */ public function renderBlockConfigFields( $fieldset, $data ) { $html = ''; foreach ( $fieldset as $category ) { $html .= '<div class="block-config-category">'; $html .= '<h3 class="block-config-category-title">' . esc_html( $category['label'] ) . '</h3>'; $html .= '<table class="form-table">'; foreach ( $category['settings'] as $setting ) { $settingValue = $this->setConfigValue( $data, $setting['name'] ); if ( $setting['type'] === 'hidden' ) { $html .= '<input type="hidden" class="block-config-input" name="' . esc_attr( $setting['name'] ) . '" value="' . esc_attr( $setting['value'] ) . '" />'; continue; } $html .= '<tr>'; $html .= '<th scope="row">'; $html .= '<label for="setting-' . esc_attr( $setting['name'] ) . '" class="advgb-setting-label">' . esc_html( $setting['title'] ) . '</label>'; $html .= '</th>'; $html .= '<td>'; switch ( $setting['type'] ) { case 'text': case 'number': $html .= '<input type="' . esc_attr( $setting['type'] ) . '" class="block-config-input" id="setting-' . esc_attr( $setting['name'] ) . '" name="' . esc_attr( $setting['name'] ) . '" '; if ( $setting['type'] === 'number' && ( isset( $setting['min'] ) || isset( $setting['max'] ) ) ) { $html .= ' min="' . esc_attr( $setting['min'] ) . '" max="' . esc_attr( $setting['max'] ) . '" '; } $html .= ' value="' . esc_attr( $settingValue ) . '" />'; break; case 'color': $html .= '<input type="text" class="minicolors minicolors-input block-config-input" id="setting-' . esc_attr( $setting['name'] ) . '" name="' . esc_attr( $setting['name'] ) . '" value="' . esc_attr( $settingValue ) . '" />'; break; case 'select': $html .= '<select class="block-config-input" id="setting-' . esc_attr( $setting['name'] ) . '" name="' . esc_attr( $setting['name'] ) . '">'; $html .= '<option value="">' . __( 'Default', 'advanced-gutenberg' ) . '</option>'; foreach ( $setting['options'] as $option ) { $selected = $option['value'] === $settingValue ? 'selected' : ''; $html .= '<option value="' . esc_attr( $option['value'] ) . '" ' . $selected . '>' . esc_html( $option['label'] ) . '</option>'; } $html .= '</select>'; break; case 'checkbox': $checked = (int) $settingValue === 1 ? 'checked' : ''; $html .= '<input type="checkbox" value="1" class="block-config-input" id="setting-' . esc_attr( $setting['name'] ) . '" name="' . esc_attr( $setting['name'] ) . '" ' . $checked . '/>'; break; default: $html .= '<div>' . __( 'Type field not defined', 'advanced-gutenberg' ) . '</div>'; break; } $html .= '</td>'; $html .= '</tr>'; } $html .= '</table>'; $html .= '</div>'; } echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- already escaped return true; } /** * Load reCaptcha v2 scripts * * @return void */ public function loadRecaptchaApi() { $recaptcha_config = get_option( 'advgb_recaptcha_config' ); if ( ! is_admin() && isset( $recaptcha_config['recaptcha_enable'] ) && $recaptcha_config['recaptcha_enable'] ) { $lang = $recaptcha_config['recaptcha_language'] ? '&hl=' . $recaptcha_config['recaptcha_language'] : ''; wp_enqueue_script( 'advgb_recaptcha_js', 'https://www.google.com/recaptcha/api.js?onload=advgbRecaptchaInit&render=explicit' . $lang ); if ( isset( $recaptcha_config['recaptcha_site_key'] ) && $recaptcha_config['recaptcha_site_key'] ) { wp_enqueue_script( 'advgb_recaptcha_init_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/recaptcha.js' ); wp_localize_script( 'advgb_recaptcha_init_js', 'advgbGRC', array( 'site_key' => $recaptcha_config['recaptcha_site_key'], 'theme' => $recaptcha_config['recaptcha_theme'], ) ); } } } /** * Load Google Maps script * * @return void */ public function loadGoogleMapApi() { $saved_settings = get_option( 'advgb_settings' ); if ( isset( $saved_settings['google_api_key'] ) && ! empty( $saved_settings['google_api_key'] ) ) { wp_enqueue_script( 'advgb_map_api', 'https://maps.googleapis.com/maps/api/js?key=' . $saved_settings['google_api_key'] ); } } /** * Add CSS patch when using Twenty Twenty-One in footer with Slick slideshow * https://core.trac.wordpress.org/ticket/53649 * https://github.com/kenwheeler/slick/issues/3415 * * @return void */ public function fixCssGridFooterWidgets() { $ctheme = wp_get_theme(); if ( 'Twenty Twenty-One' == $ctheme->name || 'Twenty Twenty-One' == $ctheme->parent_theme ) { wp_add_inline_style( 'advgb_blocks_styles', '@media only screen and (min-width: 652px) { .widget-area { grid-template-columns: repeat(2, minmax( 0, 1fr )); } } @media only screen and (min-width: 1024px) { .widget-area { grid-template-columns: repeat(3, minmax( 0, 1fr )); } }' ); } } /** * Check if a setting is enabled * * @param string $setting The setting from advgb_settings option field * @deprecated 3.2.0 Use Utilities::settingIsEnabled() instead * * @return boolean */ public function settingIsEnabled( $setting ) { return Utilities::settingIsEnabled( $setting ); } /** * Set value to config field * * @param array $valueList Array of values to set * @param string $valueToGet Value field to set * @param mixed $default Default value if value field from list not set * * @return string Value after check */ private function setConfigValue( $valueList, $valueToGet, $default = '' ) { $valueReturn = $default; if ( gettype( $valueList ) === 'array' ) { if ( isset( $valueList[ $valueToGet ] ) ) { $valueReturn = $valueList[ $valueToGet ]; } } return $valueReturn; } /** * Dynamically load the blocks's CSS and media files * * @param $blockName * @param $blockAttrs * * @return string CSS Styles * @since 2.4.2 */ public function advgb_SetStylesForBlocks( $blockAttrs, $blockName ) { $availableBlocks = array( 'advgb/adv-tabs', 'advgb/adv-tab', 'advgb/columns', 'advgb/column', 'advgb/image', 'advgb/icon', 'advgb/accordions', 'advgb/accordion-item', 'advgb/table', 'advgb/infobox', 'advgb/button', 'advgb/login-form', 'advgb/count-up', 'advgb/summary', 'advgb/contact-form', 'advgb/images-slider', 'advgb/map', 'advgb/newsletter', 'advgb/testimonial', 'advgb/list', 'advgb/video', 'advgb/recent-posts', 'advgb/search-bar', 'advgb/social-links', 'advgb/woo-products', 'advgb/tabs', 'core/gallery' // Core block ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_get_blocks' ) ) { $availableProBlocks = PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_get_blocks(); foreach ( $availableProBlocks as $availableProBlock ) { array_push( $availableBlocks, $availableProBlock ); } } } // Load common CSS if ( in_array( $blockName, $availableBlocks ) && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { wp_enqueue_style( 'advgb_blocks_styles', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/blocks.css', array(), ADVANCED_GUTENBERG_VERSION ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_main_styles' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_main_styles(); } } } $html_style = ''; switch ( $blockName ) { case 'advgb/list': // Styles $html_style = $this->advgb_AdvancedListStyles( $blockAttrs ); // Assets wp_enqueue_style( 'dashicons' ); break; case 'advgb/button': // Styles $html_style = $this->advgb_AdvancedButtonStyles( $blockAttrs ); // Pro - Assets if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { if ( isset( $blockAttrs['iconDisplay'] ) && method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_styles_frontend_advbutton' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_styles_frontend_advbutton(); } if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_font_styles_frontend' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_font_styles_frontend( 'advgb/button', $blockAttrs ); } } break; case 'advgb/column': case 'advgb/columns': // Styles $html_style = $this->advgb_AdvancedColumnsStyles( $blockAttrs, $blockName ); // Assets wp_enqueue_style( 'advgb_columns_styles' ); break; case 'advgb/login-form': // Assets $html_style = $this->advgb_AdvancedLoginRegisterStyles( $blockAttrs ); // Assets wp_enqueue_style( 'dashicons' ); wp_enqueue_script( 'jquery-effects-slide' ); wp_enqueue_script( 'advgb_lores_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/login-form/frontend.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); wp_localize_script( 'advgb_lores_js', 'advgbLoresForm', [ 'ajax_url' => admin_url( 'admin-ajax.php' ), 'login_url' => wp_login_url(), 'register_url' => wp_registration_url(), 'lostpwd_url' => wp_lostpassword_url(), 'home_url' => home_url(), 'admin_url' => admin_url(), 'register_enabled' => get_option( 'users_can_register' ), 'unregistrable_notice' => __( 'User registration is currently not allowed.', 'advanced-gutenberg' ), 'captcha_empty_warning' => __( 'Captcha must be checked!', 'advanced-gutenberg' ), 'login_failed_notice' => __( 'Username or password is incorrect!', 'advanced-gutenberg' ), ] ); $this->loadRecaptchaApi(); break; case 'advgb/search-bar': // Styles $html_style = $this->advgb_AdvancedSearchBarStyles( $blockAttrs ); break; case 'advgb/image': // Styles $html_style = $this->advgb_AdvancedImageStyles( $blockAttrs ); // Assets if ( array_key_exists( 'openOnClick', $blockAttrs ) ) { if ( $blockAttrs['openOnClick'] == 'lightbox' ) { // Lightbox wp_enqueue_style( 'colorbox_style' ); wp_enqueue_script( 'colorbox_js' ); wp_enqueue_script( 'advgbImageLightbox_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/advimage/lightbox.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); } elseif ( $blockAttrs['openOnClick'] == 'url' ) { // Custom URL wp_enqueue_script( 'advgbImageCustomURL_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/advimage/url.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); } else { // Nothing to do here } } break; case 'advgb/testimonial': // Styles $html_style = $this->advgb_AdvancedTestimonialStyles( $blockAttrs ); // Assets wp_enqueue_style( 'dashicons' ); // When sliderView exists... if ( array_key_exists( 'sliderView', $blockAttrs ) ) { wp_enqueue_style( 'slick_style' ); wp_enqueue_style( 'slick_theme_style' ); wp_enqueue_script( 'slick_js' ); wp_enqueue_script( 'advgb_testimonial_frontend', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/testimonial/frontend.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); // Patch for Twenty Twenty-One $this->fixCssGridFooterWidgets(); } break; case 'advgb/adv-tabs': // Styles $html_style = $this->advgb_AdvancedTabsStyles( $blockAttrs ); // Assets wp_enqueue_script( 'jquery-ui-tabs' ); wp_enqueue_script( 'advgb_tabs_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/advtabs/frontend.js', array( 'jquery' ), ADVANCED_GUTENBERG_VERSION ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_inline_scripts_frontend' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_inline_scripts_frontend( 'advgb/adv-tabs' ); } break; case 'advgb/icon': // Styles $html_style = $this->advgb_AdvancedIconStyles( $blockAttrs ); // Assets wp_enqueue_style( 'material_icon_font' ); break; case 'advgb/infobox': // Styles $html_style = $this->advgb_AdvancedInfoBoxStyles( $blockAttrs ); // Assets wp_enqueue_style( 'material_icon_font' ); break; case 'advgb/count-up': // Assets wp_enqueue_script( 'advgb_blocks_frontend_scripts' ); break; case 'advgb/video': // Assets - When openInLightbox doesn't exist means lightbox is enabled if ( ! array_key_exists( 'openInLightbox', $blockAttrs ) ) { wp_enqueue_style( 'colorbox_style' ); wp_enqueue_script( 'colorbox_js' ); wp_enqueue_script( 'advgbVideoLightbox_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/advvideo/lightbox.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); } break; case 'advgb/map': // Assets wp_enqueue_script( 'advgb_gmap_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/map/frontend.js', [], ADVANCED_GUTENBERG_VERSION ); $this->loadGoogleMapApi(); break; case 'advgb/summary': // Assets wp_enqueue_script( 'summary_minimized', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/summary/summaryMinimized.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); break; case 'advgb/accordions': // Assets wp_enqueue_script( 'jquery-ui-accordion' ); wp_enqueue_script( 'adv_accordion_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/advaccordion/frontend.js', [ 'jquery', 'jquery-ui-accordion' ], ADVANCED_GUTENBERG_VERSION ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_inline_scripts_frontend' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_inline_scripts_frontend( 'advgb/accordion-item' ); } break; case 'advgb/woo-products': // Assets - When viewType is slider if ( array_key_exists( 'viewType', $blockAttrs ) && $blockAttrs['viewType'] == 'slider' ) { wp_enqueue_style( 'slick_style' ); wp_enqueue_style( 'slick_theme_style' ); wp_enqueue_script( 'slick_js' ); wp_enqueue_script( 'advgb_woo_products_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/woo-products/slider.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); // Patch for Twenty Twenty-One $this->fixCssGridFooterWidgets(); } break; case 'advgb/images-slider': // Assets wp_enqueue_style( 'slick_style' ); wp_enqueue_style( 'slick_theme_style' ); wp_enqueue_script( 'slick_js' ); wp_enqueue_script( 'advgbImageSliderLightbox_frontent_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/images-slider/frontend.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_inline_scripts_frontend' ) ) { $script = PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_inline_scripts_frontend( 'advgb/images-slider', $blockAttrs ); if ( ! empty( $script ) ) { wp_add_inline_script( 'advgbImageSliderLightbox_frontent_js', $script ); } } // When lightbox is enabled if ( array_key_exists( 'actionOnClick', $blockAttrs ) && $blockAttrs['actionOnClick'] == 'lightbox' ) { wp_enqueue_style( 'colorbox_style' ); wp_enqueue_script( 'colorbox_js' ); wp_enqueue_script( 'advgbImageSliderLightbox_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/images-slider/lightbox.js', [], ADVANCED_GUTENBERG_VERSION ); } // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_font_styles_frontend' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_font_styles_frontend( 'advgb/images-slider', $blockAttrs ); } } // Patch for Twenty Twenty-One $this->fixCssGridFooterWidgets(); break; case 'advgb/contact-form': // Assets wp_enqueue_script( 'advgbContactForm_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/contact-form/frontend.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); wp_localize_script( 'advgbContactForm_js', 'advgbContactForm', [ 'ajax_url' => admin_url( 'admin-ajax.php' ) ] ); $this->loadRecaptchaApi(); break; case 'advgb/newsletter': // Assets wp_enqueue_script( 'advgbNewsletter_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/newsletter/frontend.js', [ 'jquery', 'wp-i18n' ], ADVANCED_GUTENBERG_VERSION ); wp_localize_script( 'advgbNewsletter_js', 'advgbNewsletter', [ 'ajax_url' => admin_url( 'admin-ajax.php' ) ] ); $this->loadRecaptchaApi(); break; case 'advgb/recent-posts': // Styles $html_style = $this->advgb_AdvancedRecentPostsStyles( $blockAttrs ); // Assets wp_enqueue_style( 'dashicons' ); wp_enqueue_style( 'advgb_recent_posts_styles' ); if ( array_key_exists( 'postView', $blockAttrs ) && $blockAttrs['postView'] == 'slider' ) { // Slider view wp_enqueue_style( 'slick_style' ); wp_enqueue_style( 'slick_theme_style' ); wp_enqueue_script( 'slick_js' ); wp_enqueue_script( 'advgb_recent_posts_slider_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/recent-posts/slider.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_inline_scripts_frontend' ) ) { $script = PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_inline_scripts_frontend( 'advgb/recent-posts', $blockAttrs ); if ( ! empty( $script ) ) { wp_add_inline_script( 'advgb_recent_posts_slider_js', $script ); } } // Patch for Twenty Twenty-One $this->fixCssGridFooterWidgets(); } elseif ( array_key_exists( 'postView', $blockAttrs ) && $blockAttrs['postView'] == 'masonry' ) { // Masonry view wp_enqueue_script( 'advgb_masonry_js' ); wp_enqueue_script( 'advgb_recent_posts_masonry_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/blocks/recent-posts/masonry.js', [ 'jquery', 'advgb_masonry_js' ], ADVANCED_GUTENBERG_VERSION ); } // Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_font_styles_frontend' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_font_styles_frontend( 'advgb/recent-posts', $blockAttrs ); } } break; case 'advgb/countdown': // Assets - Pro if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) && Utilities::settingIsEnabled( 'enable_advgb_blocks' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_enqueue_scripts_frontend_countdown' ) ) { PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_enqueue_scripts_frontend_countdown(); } } break; case 'core/gallery': // Assets $saved_settings = get_option( 'advgb_settings' ); if ( $saved_settings['gallery_lightbox'] ) { wp_enqueue_style( 'colorbox_style' ); wp_enqueue_script( 'colorbox_js' ); wp_enqueue_script( 'gallery_lightbox_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/gallery.colorbox.init.js', [ 'jquery' ], ADVANCED_GUTENBERG_VERSION ); wp_localize_script( 'gallery_lightbox_js', 'advgb', [ 'imageCaption' => $saved_settings['gallery_lightbox_caption'] ] ); } break; default: // Nothing to do here break; } // Styles and assets from Pro blocks if ( defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { if ( method_exists( 'PPB_AdvancedGutenbergPro\Utils\Definitions', 'advgb_pro_set_styles_for_blocks' ) ) { $html_style .= PPB_AdvancedGutenbergPro\Utils\Definitions::advgb_pro_set_styles_for_blocks( $blockAttrs, $blockName ); } } return $html_style; } /** * Styles for Adv. Lists Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedListStyles( $blockAttrs ) { $block_class = $blockAttrs['id']; $font_size = isset( $blockAttrs['fontSize'] ) ? esc_html( intval( $blockAttrs['fontSize'] ) ) : 16; $icon_size = isset( $blockAttrs['iconSize'] ) ? esc_html( intval( $blockAttrs['iconSize'] ) ) : 16; $icon_color = isset( $blockAttrs['iconColor'] ) ? esc_html( $blockAttrs['iconColor'] ) : '#000'; $margin = isset( $blockAttrs['margin'] ) ? esc_html( intval( $blockAttrs['margin'] ) ) : 2; $padding = isset( $blockAttrs['padding'] ) ? esc_html( intval( $blockAttrs['padding'] ) ) : 2; $line_height = isset( $blockAttrs['lineHeight'] ) ? esc_html( intval( $blockAttrs['lineHeight'] ) ) : 18; $style_html = '.wp-block-advgb-list ul.' . $block_class . ' > li{'; $style_html .= 'font-size:' . $font_size . 'px;'; $style_html .= '}'; if ( isset( $blockAttrs['icon'] ) && ! empty( $blockAttrs['icon'] ) ) { $style_html .= '.wp-block-advgb-list ul.' . $block_class . ' > li{'; $style_html .= 'padding-left:' . ( $icon_size + $padding ) . 'px;margin-left:0;'; $style_html .= '}'; $style_html .= '.wp-block-advgb-list ul.' . $block_class . ' > li:before{'; $style_html .= 'font-size:' . $icon_size . 'px;'; $style_html .= 'color:' . $icon_color . ';'; $style_html .= 'line-height:' . $line_height . 'px;'; $style_html .= 'margin:' . $margin . 'px;'; $style_html .= 'padding:' . $padding . 'px;'; $style_html .= 'margin-left:-' . ( $icon_size + $padding + $margin ) . 'px'; $style_html .= '}'; } return $style_html; } /** * Styles for Adv. Button Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedButtonStyles( $blockAttrs ) { // Decide to include or not CSS color property for outlined styles if ( ! isset( $blockAttrs['textColor'] ) && isset( $blockAttrs['className'] ) && ( strpos( $blockAttrs['className'], 'is-style-squared-outline' ) !== false || strpos( $blockAttrs['className'], 'is-style-outlined' ) !== false ) ) { $enable_text_color = false; } else { $enable_text_color = true; } $block_class = esc_html( $blockAttrs['id'] ); $font_size = isset( $blockAttrs['textSize'] ) ? esc_html( intval( $blockAttrs['textSize'] ) ) : 18; $color = isset( $blockAttrs['textColor'] ) ? esc_html( $blockAttrs['textColor'] ) : '#fff'; $bg_color = isset( $blockAttrs['bgColor'] ) ? esc_html( $blockAttrs['bgColor'] ) : '#2196f3'; $mg_top = isset( $blockAttrs['marginTop'] ) ? esc_html( intval( $blockAttrs['marginTop'] ) ) : 0; $mg_right = isset( $blockAttrs['marginRight'] ) ? esc_html( intval( $blockAttrs['marginRight'] ) ) : 0; $mg_bottom = isset( $blockAttrs['marginBottom'] ) ? esc_html( intval( $blockAttrs['marginBottom'] ) ) : 0; $mg_left = isset( $blockAttrs['marginLeft'] ) ? esc_html( intval( $blockAttrs['marginLeft'] ) ) : 0; $pd_top = isset( $blockAttrs['paddingTop'] ) ? esc_html( intval( $blockAttrs['paddingTop'] ) ) : 10; $pd_right = isset( $blockAttrs['paddingRight'] ) ? esc_html( intval( $blockAttrs['paddingRight'] ) ) : 30; $pd_bottom = isset( $blockAttrs['paddingBottom'] ) ? esc_html( intval( $blockAttrs['paddingBottom'] ) ) : 10; $pd_left = isset( $blockAttrs['paddingLeft'] ) ? esc_html( intval( $blockAttrs['paddingLeft'] ) ) : 30; $border_width = isset( $blockAttrs['borderWidth'] ) ? esc_html( intval( $blockAttrs['borderWidth'] ) ) : 1; $border_color = isset( $blockAttrs['borderColor'] ) ? esc_html( $blockAttrs['borderColor'] ) : ''; $border_style = isset( $blockAttrs['borderStyle'] ) ? esc_html( $blockAttrs['borderStyle'] ) : 'none'; $border_radius = isset( $blockAttrs['borderRadius'] ) ? esc_html( intval( $blockAttrs['borderRadius'] ) ) : 50; $hover_t_color = isset( $blockAttrs['hoverTextColor'] ) ? esc_html( $blockAttrs['hoverTextColor'] ) : ''; $hover_bg_color = isset( $blockAttrs['hoverBgColor'] ) ? esc_html( $blockAttrs['hoverBgColor'] ) : ''; $hover_sh_color = isset( $blockAttrs['hoverShadowColor'] ) ? esc_html( $blockAttrs['hoverShadowColor'] ) : '#ccc'; $hover_sh_h = isset( $blockAttrs['hoverShadowH'] ) ? esc_html( intval( $blockAttrs['hoverShadowH'] ) ) : 1; $hover_sh_v = isset( $blockAttrs['hoverShadowV'] ) ? esc_html( intval( $blockAttrs['hoverShadowV'] ) ) : 1; $hover_sh_blur = isset( $blockAttrs['hoverShadowBlur'] ) ? esc_html( intval( $blockAttrs['hoverShadowBlur'] ) ) : 12; $hover_sh_sprd = isset( $blockAttrs['hoverShadowSpread'] ) ? esc_html( intval( $blockAttrs['hoverShadowSpread'] ) ) : 0; $hover_opacity = isset( $blockAttrs['hoverOpacity'] ) ? esc_html( intval( $blockAttrs['hoverOpacity'] ) / 100 ) : 1; $transition_spd = isset( $blockAttrs['transitionSpeed'] ) ? esc_html( floatval( $blockAttrs['transitionSpeed'] ) / 1000 ) : 0.2; $style_html = '.' . $block_class . '{'; $style_html .= 'font-size:' . $font_size . 'px;'; if ( $enable_text_color == true ) { $style_html .= 'color:' . $color . ' !important;'; } $style_html .= 'background-color:' . $bg_color . ' !important;'; $style_html .= 'margin:' . $mg_top . 'px ' . $mg_right . 'px ' . $mg_bottom . 'px ' . $mg_left . 'px !important;'; $style_html .= 'padding:' . $pd_top . 'px ' . $pd_right . 'px ' . $pd_bottom . 'px ' . $pd_left . 'px;'; $style_html .= 'border-width:' . $border_width . 'px !important;'; if ( ! empty( $border_color ) ) { $style_html .= 'border-color:' . $border_color . ' !important;'; } $style_html .= 'border-style:' . $border_style . ( $border_style === 'none' ? '' : ' !important' ) . ';'; $style_html .= 'border-radius:' . $border_radius . 'px !important;'; $style_html .= '}'; $style_html .= '.' . $block_class . ':hover{'; if ( ! empty( $hover_t_color ) ) { $style_html .= 'color:' . $hover_t_color . ' !important;'; } if ( ! empty( $hover_bg_color ) ) { $style_html .= 'background-color:' . $hover_bg_color . ' !important;'; } $style_html .= 'box-shadow:' . $hover_sh_h . 'px ' . $hover_sh_v . 'px ' . $hover_sh_blur . 'px ' . $hover_sh_sprd . 'px ' . $hover_sh_color . ';'; $style_html .= 'opacity:' . $hover_opacity . ';'; $style_html .= 'transition:all ' . $transition_spd . 's ease;'; $style_html .= '}'; if ( ! defined( 'ADVANCED_GUTENBERG_PRO_LOADED' ) ) { $style_html .= '.' . $block_class . ' > i {'; $style_html .= 'display: none !important;'; $style_html .= '}'; } return $style_html; } /** * Styles for Adv. Columns Block * * @param $blockAttrs The block attributes * @param $blockName The block name * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedColumnsStyles( $blockAttrs, $blockName ) { $colID = esc_html( $blockAttrs['colId'] ); $marginUnit = 'px'; $paddingUnit = 'px'; if ( $blockName === 'advgb/column' ) { $colID = $colID . '>.advgb-column-inner'; } if ( isset( $blockAttrs['marginUnit'] ) ) { $marginUnit = esc_html( $blockAttrs['marginUnit'] ); } if ( isset( $blockAttrs['paddingUnit'] ) ) { $paddingUnit = esc_html( $blockAttrs['paddingUnit'] ); } $style_html = '#' . $colID . '{'; $style_html .= isset( $blockAttrs['textAlign'] ) ? 'text-align:' . esc_html( $blockAttrs['textAlign'] ) . ';' : ''; $style_html .= isset( $blockAttrs['marginTop'] ) ? 'margin-top:' . esc_html( $blockAttrs['marginTop'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginRight'] ) ? 'margin-right:' . esc_html( $blockAttrs['marginRight'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginBottom'] ) ? 'margin-bottom:' . esc_html( $blockAttrs['marginBottom'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginLeft'] ) ? 'margin-left:' . esc_html( $blockAttrs['marginLeft'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingTop'] ) ? 'padding-top:' . esc_html( $blockAttrs['paddingTop'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingRight'] ) ? 'padding-right:' . esc_html( $blockAttrs['paddingRight'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingBottom'] ) ? 'padding-bottom:' . esc_html( $blockAttrs['paddingBottom'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingLeft'] ) ? 'padding-left:' . esc_html( $blockAttrs['paddingLeft'] ) . $paddingUnit . ';' : ''; $style_html .= '}'; if ( $blockName === 'advgb/column' ) { $childColID = esc_html( $blockAttrs['colId'] ); $childColWidth = isset( $blockAttrs['width'] ) ? intval( $blockAttrs['width'] ) : 0; if ( $childColWidth !== 0 ) { $style_html .= '#' . $childColID . '{width: ' . $childColWidth . '%;}'; } } // Styles for tablet $style_html .= '@media screen and (max-width: 1023px) {'; $style_html .= '#' . $colID . '{'; $style_html .= isset( $blockAttrs['marginTopT'] ) ? 'margin-top:' . esc_html( $blockAttrs['marginTopT'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginRightT'] ) ? 'margin-right:' . esc_html( $blockAttrs['marginRightT'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginBottomT'] ) ? 'margin-bottom:' . esc_html( $blockAttrs['marginBottomT'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginLeftT'] ) ? 'margin-left:' . esc_html( $blockAttrs['marginLeftT'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingTopT'] ) ? 'padding-top:' . esc_html( $blockAttrs['paddingTopT'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingRightT'] ) ? 'padding-right:' . esc_html( $blockAttrs['paddingRightT'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingBottomT'] ) ? 'padding-bottom:' . esc_html( $blockAttrs['paddingBottomT'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingLeftT'] ) ? 'padding-left:' . esc_html( $blockAttrs['paddingLeftT'] ) . $paddingUnit . ';' : ''; $style_html .= '}'; $style_html .= '}'; // Styles for mobile $style_html .= '@media screen and (max-width: 767px) {'; $style_html .= '#' . $colID . '{'; $style_html .= isset( $blockAttrs['textAlignM'] ) ? 'text-align:' . esc_html( $blockAttrs['textAlignM'] ) . ';' : ''; $style_html .= isset( $blockAttrs['marginTopM'] ) ? 'margin-top:' . esc_html( $blockAttrs['marginTopM'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginRightM'] ) ? 'margin-right:' . esc_html( $blockAttrs['marginRightM'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginBottomM'] ) ? 'margin-bottom:' . esc_html( $blockAttrs['marginBottomM'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['marginLeftM'] ) ? 'margin-left:' . esc_html( $blockAttrs['marginLeftM'] ) . $marginUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingTopM'] ) ? 'padding-top:' . esc_html( $blockAttrs['paddingTopM'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingRightM'] ) ? 'padding-right:' . esc_html( $blockAttrs['paddingRightM'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingBottomM'] ) ? 'padding-bottom:' . esc_html( $blockAttrs['paddingBottomM'] ) . $paddingUnit . ';' : ''; $style_html .= isset( $blockAttrs['paddingLeftM'] ) ? 'padding-left:' . esc_html( $blockAttrs['paddingLeftM'] ) . $paddingUnit . ';' : ''; $style_html .= '}'; $style_html .= '}'; return $style_html; } /** * Styles for Login / Register Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedLoginRegisterStyles( $blockAttrs ) { $block_class = esc_html( $blockAttrs['submitButtonId'] ); $hover_t_color = isset( $blockAttrs['submitHoverColor'] ) ? esc_html( $blockAttrs['submitHoverColor'] ) : ''; $hover_bg_color = isset( $blockAttrs['submitHoverBgColor'] ) ? esc_html( $blockAttrs['submitHoverBgColor'] ) : ''; $hover_sh_color = isset( $blockAttrs['submitHoverShadow'] ) ? esc_html( $blockAttrs['submitHoverShadow'] ) : '#ccc'; $hover_sh_h = isset( $blockAttrs['submitHoverShadowH'] ) ? esc_html( intval( $blockAttrs['submitHoverShadowH'] ) ) : 1; $hover_sh_v = isset( $blockAttrs['submitHoverShadowV'] ) ? esc_html( intval( $blockAttrs['submitHoverShadowV'] ) ) : 1; $hover_sh_blur = isset( $blockAttrs['submitHoverShadowBlur'] ) ? esc_html( intval( $blockAttrs['submitHoverShadowBlur'] ) ) : 12; $hover_sh_sprd = isset( $blockAttrs['submitHoverShadowSpread'] ) ? esc_html( intval( $blockAttrs['submitHoverShadowSpread'] ) ) : 0; $hover_opacity = isset( $blockAttrs['submitHoverOpacity'] ) ? esc_html( intval( $blockAttrs['submitHoverOpacity'] ) / 100 ) : 1; $transition_spd = isset( $blockAttrs['submitHoverTranSpeed'] ) ? esc_html( floatval( $blockAttrs['submitHoverTranSpeed'] ) / 1000 ) : 0.2; $style_html = '.' . $block_class . ':hover{'; if ( ! empty( $hover_t_color ) ) { $style_html .= 'color:' . $hover_t_color . ' !important;'; } if ( ! empty( $hover_bg_color ) ) { $style_html .= 'background-color:' . $hover_bg_color . ' !important;'; } $style_html .= 'box-shadow:' . $hover_sh_h . 'px ' . $hover_sh_v . 'px ' . $hover_sh_blur . 'px ' . $hover_sh_sprd . 'px ' . $hover_sh_color . ' !important;'; $style_html .= 'opacity:' . $hover_opacity . ';'; $style_html .= 'transition:all ' . $transition_spd . 's ease;'; $style_html .= '}'; return $style_html; } /** * Styles for Search Bar Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedSearchBarStyles( $blockAttrs ) { $block_class = esc_html( $blockAttrs['searchBtnId'] ); $hover_t_color = isset( $blockAttrs['searchBtnHoverColor'] ) ? esc_html( $blockAttrs['searchBtnHoverColor'] ) : ''; $hover_bg_color = isset( $blockAttrs['searchBtnHoverBgColor'] ) ? esc_html( $blockAttrs['searchBtnHoverBgColor'] ) : ''; $hover_sh_color = isset( $blockAttrs['searchBtnHoverShadow'] ) ? esc_html( $blockAttrs['searchBtnHoverShadow'] ) : '#ccc'; $hover_sh_h = isset( $blockAttrs['searchBtnHoverShadowH'] ) ? esc_html( intval( $blockAttrs['searchBtnHoverShadowH'] ) ) : 1; $hover_sh_v = isset( $blockAttrs['searchBtnHoverShadowV'] ) ? esc_html( intval( $blockAttrs['searchBtnHoverShadowV'] ) ) : 1; $hover_sh_blur = isset( $blockAttrs['searchBtnHoverShadowBlur'] ) ? esc_html( intval( $blockAttrs['searchBtnHoverShadowBlur'] ) ) : 12; $hover_sh_sprd = isset( $blockAttrs['searchBtnHoverShadowSpread'] ) ? esc_html( intval( $blockAttrs['searchBtnHoverShadowSpread'] ) ) : 0; $hover_opacity = isset( $blockAttrs['searchBtnHoverOpacity'] ) ? esc_html( intval( $blockAttrs['searchBtnHoverOpacity'] ) / 100 ) : 1; $transition_spd = isset( $blockAttrs['searchBtnHoverTranSpeed'] ) ? esc_html( floatval( $blockAttrs['searchBtnHoverTranSpeed'] ) / 1000 ) : 0.2; $style_html = '.' . $block_class . ':hover{'; if ( ! empty( $hover_t_color ) ) { $style_html .= 'color:' . $hover_t_color . ' !important;'; } if ( ! empty( $hover_bg_color ) ) { $style_html .= 'background-color:' . $hover_bg_color . ' !important;'; } $style_html .= 'box-shadow:' . $hover_sh_h . 'px ' . $hover_sh_v . 'px ' . $hover_sh_blur . 'px ' . $hover_sh_sprd . 'px ' . $hover_sh_color . ' !important;'; $style_html .= 'opacity:' . $hover_opacity . ';'; $style_html .= 'transition:all ' . $transition_spd . 's ease;'; $style_html .= '}'; return $style_html; } /** * Styles for Adv. Image Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedImageStyles( $blockAttrs ) { $style_html = ''; if ( array_key_exists( 'blockIDX', $blockAttrs ) ) { $block_class = esc_html( $blockAttrs['blockIDX'] ); $default_opacity = isset( $blockAttrs['defaultOpacity'] ) ? esc_html( $blockAttrs['defaultOpacity'] ) : 40; $hover_opacity = isset( $blockAttrs['overlayOpacity'] ) ? esc_html( $blockAttrs['overlayOpacity'] ) : 20; $style_html .= '.' . $block_class . '.advgb-image-block .advgb-image-overlay{'; $style_html .= 'opacity:' . ( $default_opacity / 100 ) . ' !important;'; $style_html .= '}'; $style_html .= '.' . $block_class . '.advgb-image-block:hover .advgb-image-overlay{'; $style_html .= 'opacity:' . ( $hover_opacity / 100 ) . ' !important;'; $style_html .= '}'; } return $style_html; } /** * Styles for Adv. Testimonial Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedTestimonialStyles( $blockAttrs ) { $style_html = ''; if ( array_key_exists( 'pid', $blockAttrs ) ) { $block_id = $blockAttrs['pid']; $dots_color = isset( $blockAttrs['sliderDotsColor'] ) ? $blockAttrs['sliderDotsColor'] : '#000'; $style_html .= '#' . $block_id . ' .slick-dots li button:before{'; $style_html .= 'color:' . $dots_color . ' !important;'; $style_html .= '}'; } return $style_html; } /** * Styles for Adv. Tabs Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedTabsStyles( $blockAttrs ) { $block_class = isset( $blockAttrs['pid'] ) ? esc_html( $blockAttrs['pid'] ) : 'wp-block-advgb-adv-tabs'; $active_tab_bg_color = isset( $blockAttrs['activeTabBgColor'] ) ? esc_html( $blockAttrs['activeTabBgColor'] ) : '#5954d6'; $active_tab_text_color = isset( $blockAttrs['activeTabTextColor'] ) ? esc_html( $blockAttrs['activeTabTextColor'] ) : '#fff'; $style_html = '.' . $block_class . ' ul.advgb-tabs-panel li.advgb-tab.advgb-tab-active {'; $style_html .= 'background-color:' . $active_tab_bg_color . ' !important;'; $style_html .= 'color:' . $active_tab_text_color . ' !important;'; $style_html .= '}'; $style_html .= '#' . $block_class . ' .advgb-tab-body-header.header-active, .' . $block_class . ' .advgb-tab-body-header.header-active{'; $style_html .= 'background-color:' . $active_tab_bg_color . ' !important;'; $style_html .= 'color:' . $active_tab_text_color . ' !important;'; $style_html .= '}'; return $style_html; } /** * Styles for Recent Posts Block * * @param $blockAttrs The block attributes * * @return void * @since 2.13.3 */ public function advgb_AdvancedRecentPostsStyles( $blockAttrs ) { if ( ! isset( $blockAttrs['id'] ) ) { return; } $block_class = esc_html( $blockAttrs['id'] ); $post_view = isset( $blockAttrs['postView'] ) && ! empty( $blockAttrs['postView'] ) ? esc_html( $blockAttrs['postView'] ) : 'grid'; $frontpage_style = isset( $blockAttrs['frontpageStyle'] ) && ! empty( $blockAttrs['frontpageStyle'] ) ? esc_html( $blockAttrs['frontpageStyle'] ) : 'default'; $slider_style = isset( $blockAttrs['sliderStyle'] ) && ! empty( $blockAttrs['sliderStyle'] ) ? esc_html( $blockAttrs['sliderStyle'] ) : 'default'; $image_overlay_color = isset( $blockAttrs['imageOverlayColor'] ) ? esc_html( $blockAttrs['imageOverlayColor'] ) : '#000'; $image_opacity = isset( $blockAttrs['imageOpacity'] ) ? esc_html( $blockAttrs['imageOpacity'] ) : 1; $style_html = ''; // Only for headline style, slider and frontpage view if ( ( $post_view === 'frontpage' && $frontpage_style === 'headline' ) || ( $post_view === 'slider' && $slider_style === 'headline' ) ) { $style_html .= '.' . $block_class . '.advgb-recent-posts-block.style-headline .advgb-recent-posts .advgb-recent-post .advgb-post-thumbnail {'; $style_html .= 'background:' . $image_overlay_color . ';'; $style_html .= '}'; $style_html .= '.' . $block_class . '.advgb-recent-posts-block.style-headline .advgb-recent-posts .advgb-recent-post .advgb-post-thumbnail a img {'; $style_html .= 'opacity:' . $image_opacity . ';'; $style_html .= '}'; } return $style_html; } /** * Styles for Adv. Icon Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedIconStyles( $blockAttrs ) { $block_id = esc_html( $blockAttrs['blockIDX'] ); $i = 0; $default_items = array(); $item = array( 'icon' => 'info', 'iconType' => 'material', 'size' => 120, 'color' => '#111111', 'style' => 'default', 'bgColor' => '', 'borderColor' => '#111', 'borderSize' => 2, 'borderRadius' => 0, 'paddingTop' => 20, 'paddingBottom' => 20, 'paddingLeft' => 20, 'paddingRight' => 20, 'marginTop' => 0, 'marginBottom' => 0, 'marginLeft' => 0, 'marginRight' => 0, 'paddingUnit' => 'px', 'marginUnit' => 'px', 'link' => '', 'linkTarget' => '_self', 'title' => '' ); while ( $i < 10 ) { array_push( $default_items, $item ); $i ++; } $items = ! isset( $blockAttrs['items'] ) ? $default_items : $blockAttrs['items']; // Escaped in the foreach loop $text_align = ! isset( $blockAttrs['tAlign'] ) ? 'center' : esc_html( $blockAttrs['tAlign'] ); $style_html = '#' . $block_id . ' .advgb-icons, .' . $block_id . ' .advgb-icons {'; $style_html .= 'text-align: ' . $text_align . ';'; $style_html .= '}'; foreach ( $items as $k => $item ) { $style_html .= '#' . $block_id . ' .advgb-item-' . $k . ' .advgb-icon, .' . $block_id . ' .advgb-item-' . $k . ' .advgb-icon {'; $style_html .= 'display: flex;'; $style_html .= 'align-items:center;'; $style_html .= 'margin-top: ' . esc_html( $item['marginTop'] ) . esc_html( $item['marginUnit'] ) . ';'; $style_html .= 'margin-bottom: ' . esc_html( $item['marginBottom'] ) . esc_html( $item['marginUnit'] ) . ';'; $style_html .= 'margin-left: ' . esc_html( $item['marginLeft'] ) . esc_html( $item['marginUnit'] ) . ';'; $style_html .= 'margin-right: ' . esc_html( $item['marginRight'] ) . esc_html( $item['marginUnit'] ) . ';'; $style_html .= $item['style'] === 'default' ? 'padding-top: 0;' : 'padding-top: ' . esc_html( $item['paddingTop'] ) . esc_html( $item['paddingUnit'] ) . ';'; $style_html .= $item['style'] === 'default' ? 'padding-bottom: 0;' : 'padding-bottom: ' . esc_html( $item['paddingBottom'] ) . esc_html( $item['paddingUnit'] ) . ';'; $style_html .= $item['style'] === 'default' ? 'padding-left: 0;' : 'padding-left: ' . esc_html( $item['paddingLeft'] ) . esc_html( $item['paddingUnit'] ) . ';'; $style_html .= $item['style'] === 'default' ? 'padding-right: 0;' : 'padding-right: ' . esc_html( $item['paddingRight'] ) . esc_html( $item['paddingUnit'] ) . ';'; $style_html .= $item['style'] === 'default' ? 'border-width: 0;' : 'border-width: ' . esc_html( $item['borderSize'] ) . 'px;'; $style_html .= 'border-style: solid;'; $style_html .= 'border-color: ' . esc_html( $item['borderColor'] ) . ';'; $style_html .= 'border-radius: ' . esc_html( $item['borderRadius'] ) . '%;'; $style_html .= isset( $item['bgColor'] ) ? 'background-color: ' . esc_html( $item['bgColor'] ) . ';' : 'background-color: transparent;'; $style_html .= '}'; $style_html .= '#' . $block_id . ' .advgb-item-' . $k . ' .advgb-icon > i, .' . $block_id . ' .advgb-item-' . $k . ' .advgb-icon > i{'; $style_html .= 'font-size: ' . $item['size'] . 'px;'; $style_html .= 'color: ' . $item['color'] . ';'; $style_html .= '}'; } return $style_html; } /** * Styles for Info Box Block * * @param $blockAttrs The block attributes * * @return string Inline CSS * @since 2.4.2 */ public function advgb_AdvancedInfoBoxStyles( $blockAttrs ) { $block_id = esc_html( $blockAttrs['blockIDX'] ); $container_bg = isset( $blockAttrs['containerBackground'] ) ? esc_html( $blockAttrs['containerBackground'] ) : '#f5f5f5'; $container_padding_unit = isset( $blockAttrs['containerPaddingUnit'] ) ? esc_html( $blockAttrs['containerPaddingUnit'] ) : 'px'; $container_padding = ''; $container_padding .= isset( $blockAttrs['containerPaddingTop'] ) ? esc_html( $blockAttrs['containerPaddingTop'] ) . $container_padding_unit . ' ' : '20' . $container_padding_unit . ' '; $container_padding .= isset( $blockAttrs['containerPaddingRight'] ) ? esc_html( $blockAttrs['containerPaddingRight'] ) . $container_padding_unit . ' ' : '20' . $container_padding_unit . ' '; $container_padding .= isset( $blockAttrs['containerPaddingBottom'] ) ? esc_html( $blockAttrs['containerPaddingBottom'] ) . $container_padding_unit . ' ' : '20' . $container_padding_unit . ' '; $container_padding .= isset( $blockAttrs['containerPaddingLeft'] ) ? esc_html( $blockAttrs['containerPaddingLeft'] ) . $container_padding_unit : '20' . $container_padding_unit; $container_border = ''; $container_border .= isset( $blockAttrs['containerBorderWidth'] ) ? esc_html( $blockAttrs['containerBorderWidth'] ) . 'px ' : '0px '; $container_border .= 'solid '; $container_border .= isset( $blockAttrs['containerBorderBackground'] ) ? esc_html( $blockAttrs['containerBorderBackground'] ) : '#e8e8e8 '; $container_border_radius = ''; $container_border_radius .= isset( $blockAttrs['containerBorderRadius'] ) ? esc_html( $blockAttrs['containerBorderRadius'] ) : 0; $style_html = '#' . $block_id . ', .' . $block_id . ' {'; $style_html .= 'background-color: ' . $container_bg . ';'; $style_html .= 'padding: ' . $container_padding . ';'; $style_html .= 'border: ' . $container_border . ';'; $style_html .= 'border-radius: ' . $container_border_radius . 'px;'; $style_html .= '}'; //end container css $icon_background_color = isset( $blockAttrs['iconBackground'] ) ? esc_html( $blockAttrs['iconBackground'] ) : '#f5f5f5'; $icon_padding = ''; $icon_padding_unit = isset( $blockAttrs['iconPaddingUnit'] ) ? esc_html( $blockAttrs['iconPaddingUnit'] ) : 'px'; $icon_padding .= isset( $blockAttrs['iconPaddingTop'] ) ? esc_html( $blockAttrs['iconPaddingTop'] ) . $icon_padding_unit . ' ' : '0 '; $icon_padding .= isset( $blockAttrs['iconPaddingRight'] ) ? esc_html( $blockAttrs['iconPaddingRight'] ) . $icon_padding_unit . ' ' : '0 '; $icon_padding .= isset( $blockAttrs['iconPaddingBottom'] ) ? esc_html( $blockAttrs['iconPaddingBottom'] ) . $icon_padding_unit . ' ' : '0 '; $icon_padding .= isset( $blockAttrs['iconPaddingLeft'] ) ? esc_html( $blockAttrs['iconPaddingLeft'] ) . $icon_padding_unit : '0'; if ( $icon_padding === '0 0 0 0' ) { $icon_padding = 0; } $icon_margin = ''; $icon_margin_unit = isset( $blockAttrs['iconMarginUnit'] ) ? esc_html( $blockAttrs['iconMarginUnit'] ) : 'px'; $icon_margin .= isset( $blockAttrs['iconMarginTop'] ) ? esc_html( $blockAttrs['iconMarginTop'] ) . $icon_margin_unit . ' ' : '0 '; $icon_margin .= isset( $blockAttrs['iconMarginRight'] ) ? esc_html( $blockAttrs['iconMarginRight'] ) . $icon_margin_unit . ' ' : '0 '; $icon_margin .= isset( $blockAttrs['iconMarginBottom'] ) ? esc_html( $blockAttrs['iconMarginBottom'] ) . $icon_margin_unit . ' ' : '0 '; $icon_margin .= isset( $blockAttrs['iconMarginLeft'] ) ? esc_html( $blockAttrs['iconMarginLeft'] ) . $icon_margin_unit : '0'; if ( $icon_margin === '0 0 0 0' ) { $icon_margin = 0; } $icon_border = ''; $icon_border .= isset( $blockAttrs['iconBorderWidth'] ) ? esc_html( $blockAttrs['iconBorderWidth'] ) . 'px ' : '0px '; $icon_border .= 'solid '; $icon_border .= isset( $blockAttrs['iconBorderBackground'] ) ? esc_html( $blockAttrs['iconBorderBackground'] ) : '#e8e8e8 '; $icon_border_radius = ''; $icon_border_radius .= isset( $blockAttrs['iconBorderRadius'] ) ? esc_html( $blockAttrs['iconBorderRadius'] ) : 0; $style_html .= '#' . $block_id . ' .advgb-infobox-icon-container, .' . $block_id . ' .advgb-infobox-icon-container {'; $style_html .= 'background-color: ' . $icon_background_color . ';'; $style_html .= 'padding: ' . $icon_padding . ';'; $style_html .= 'margin: ' . $icon_margin . ';'; $style_html .= 'border: ' . $icon_border . ';'; $style_html .= 'border-radius: ' . $icon_border_radius . 'px;'; $style_html .= '}'; $icon_color = isset( $blockAttrs['iconColor'] ) ? esc_html( $blockAttrs['iconColor'] ) : '#333'; $icon_size = isset( $blockAttrs['iconSize'] ) ? esc_html( $blockAttrs['iconSize'] ) : '70'; $icon_size_unit = isset( $blockAttrs['iconSizeUnit'] ) ? esc_html( $blockAttrs['iconSizeUnit'] ) : 'px'; $style_html .= '#' . $block_id . ' .advgb-infobox-icon-container i, .' . $block_id . ' .advgb-infobox-icon-container i {'; $style_html .= 'color: ' . $icon_color . ';'; $style_html .= 'font-size: ' . $icon_size . $icon_size_unit . ';'; $style_html .= 'display: block;'; $style_html .= '}'; //end icon style $title_color = isset( $blockAttrs['titleColor'] ) ? esc_html( $blockAttrs['titleColor'] ) : '#333'; $title_padding = ''; $title_padding_unit = isset( $blockAttrs['titlePaddingUnit'] ) ? esc_html( $blockAttrs['titlePaddingUnit'] ) : 'px'; $title_padding .= isset( $blockAttrs['titlePaddingTop'] ) ? esc_html( $blockAttrs['titlePaddingTop'] ) . $title_padding_unit . ' ' : '0 '; $title_padding .= isset( $blockAttrs['titlePaddingRight'] ) ? esc_html( $blockAttrs['titlePaddingRight'] ) . $title_padding_unit . ' ' : '0 '; $title_padding .= isset( $blockAttrs['titlePaddingBottom'] ) ? esc_html( $blockAttrs['titlePaddingBottom'] ) . $title_padding_unit . ' ' : '0 '; $title_padding .= isset( $blockAttrs['titlePaddingLeft'] ) ? esc_html( $blockAttrs['titlePaddingLeft'] ) . $title_padding_unit : '0'; if ( $title_padding === '0 0 0 0' ) { $title_padding = 0; } $title_margin = ''; $title_margin_unit = isset( $blockAttrs['titleMarginUnit'] ) ? esc_html( $blockAttrs['titleMarginUnit'] ) : 'px'; $title_margin .= isset( $blockAttrs['titleMarginTop'] ) ? esc_html( $blockAttrs['titleMarginTop'] ) . $title_margin_unit . ' ' : '5' . $title_margin_unit . ' '; $title_margin .= isset( $blockAttrs['titleMarginRight'] ) ? esc_html( $blockAttrs['titleMarginRight'] ) . $title_margin_unit . ' ' : '0 '; $title_margin .= isset( $blockAttrs['titleMarginBottom'] ) ? esc_html( $blockAttrs['titleMarginBottom'] ) . $title_margin_unit . ' ' : '10' . $title_margin_unit . ' '; $title_margin .= isset( $blockAttrs['titleMarginLeft'] ) ? esc_html( $blockAttrs['titleMarginLeft'] ) . $title_margin_unit : '0'; if ( $title_margin === '0 0 0 0' ) { $title_margin = 0; } $title_size_unit = isset( $blockAttrs['titleSizeUnit'] ) ? esc_html( $blockAttrs['titleSizeUnit'] ) : 'px'; $title_lh_unit = isset( $blockAttrs['titleLineHeightUnit'] ) ? esc_html( $blockAttrs['titleLineHeightUnit'] ) : 'px'; $style_html .= '#' . $block_id . ' .advgb-infobox-textcontent .advgb-infobox-title, .' . $block_id . ' .advgb-infobox-textcontent .advgb-infobox-title {'; $style_html .= 'color: ' . $title_color . ';'; $style_html .= 'padding: ' . $title_padding . ';'; $style_html .= 'margin: ' . $title_margin . ';'; if ( isset( $blockAttrs['titleSize'] ) ) { $style_html .= 'font-size: ' . esc_html( $blockAttrs['titleSize'] ) . $title_size_unit . ';'; } if ( isset( $blockAttrs['titleLineHeight'] ) ) { $style_html .= 'line-height: ' . esc_html( $blockAttrs['titleLineHeight'] ) . $title_lh_unit . ';'; } $style_html .= 'white-space: pre-wrap;'; $style_html .= '}'; //end title style $text_color = isset( $blockAttrs['textColor'] ) ? esc_html( $blockAttrs['textColor'] ) : '#333'; $text_padding = ''; $text_padding_unit = isset( $blockAttrs['textPaddingUnit'] ) ? esc_html( $blockAttrs['textPaddingUnit'] ) : 'px'; $text_padding .= isset( $blockAttrs['textPaddingTop'] ) ? esc_html( $blockAttrs['textPaddingTop'] ) . $text_padding_unit . ' ' : '0 '; $text_padding .= isset( $blockAttrs['textPaddingRight'] ) ? esc_html( $blockAttrs['textPaddingRight'] ) . $text_padding_unit . ' ' : '0 '; $text_padding .= isset( $blockAttrs['textPaddingBottom'] ) ? esc_html( $blockAttrs['textPaddingBottom'] ) . $text_padding_unit . ' ' : '0 '; $text_padding .= isset( $blockAttrs['textPaddingLeft'] ) ? esc_html( $blockAttrs['textPaddingLeft'] ) . $text_padding_unit : '0'; if ( $text_padding === '0 0 0 0' ) { $text_padding = 0; } $text_margin = ''; $text_margin_unit = isset( $blockAttrs['textMarginUnit'] ) ? esc_html( $blockAttrs['textMarginUnit'] ) : 'px'; $text_margin .= isset( $blockAttrs['textMarginTop'] ) ? esc_html( $blockAttrs['textMarginTop'] ) . $text_margin_unit . ' ' : '0 '; $text_margin .= isset( $blockAttrs['textMarginRight'] ) ? esc_html( $blockAttrs['textMarginRight'] ) . $text_margin_unit . ' ' : '0 '; $text_margin .= isset( $blockAttrs['textMarginBottom'] ) ? esc_html( $blockAttrs['textMarginBottom'] ) . $text_margin_unit . ' ' : '0 '; $text_margin .= isset( $blockAttrs['textMarginLeft'] ) ? esc_html( $blockAttrs['textMarginLeft'] ) . $text_margin_unit : '0'; if ( $text_margin === '0 0 0 0' ) { $text_margin = 0; } $text_size_unit = isset( $blockAttrs['textSizeUnit'] ) ? esc_html( $blockAttrs['textSizeUnit'] ) : 'px'; $text_lh_unit = isset( $blockAttrs['textLineHeightUnit'] ) ? esc_html( $blockAttrs['textLineHeightUnit'] ) : 'px'; $style_html .= '#' . $block_id . ' .advgb-infobox-textcontent .advgb-infobox-text, .' . $block_id . ' .advgb-infobox-textcontent .advgb-infobox-text {'; $style_html .= 'color: ' . $text_color . ';'; $style_html .= 'padding: ' . $text_padding . ';'; $style_html .= 'margin: ' . $text_margin . ';'; if ( isset( $blockAttrs['textSize'] ) ) { $style_html .= 'font-size: ' . esc_html( $blockAttrs['textSize'] ) . $text_size_unit . ';'; } if ( isset( $blockAttrs['textLineHeight'] ) ) { $style_html .= 'line-height: ' . esc_html( $blockAttrs['textLineHeight'] ) . $text_lh_unit . ';'; } $style_html .= 'white-space: pre-wrap;'; $style_html .= '}'; //end text style return $style_html; } } }
| ver. 1.4 |
Github
|
.
| PHP 5.4.45 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings