/** * The admin settings handler of the plugin. * * Handles saving and validating settings from the admin UI and network admin. * * @since 1.1.0 * @package LiteSpeed */ namespace LiteSpeed; defined( 'WPINC' ) || exit(); /** * Class Admin_Settings * * Saves, sanitizes, and validates LiteSpeed Cache settings. */ class Admin_Settings extends Base { const LOG_TAG = '[Settings]'; const ENROLL = '_settings-enroll'; /** * Save settings (single site). * * Accepts data from $_POST or WP-CLI. * Importers may call the Conf class directly. * * @since 3.0 * * @param array $raw_data Raw data from request/CLI. * @return void */ public function save( $raw_data ) { self::debug( 'saving' ); if ( empty( $raw_data[ self::ENROLL ] ) ) { wp_die( esc_html__( 'No fields', 'litespeed-cache' ) ); } $raw_data = Admin::cleanup_text( $raw_data ); // Convert data to config format. $the_matrix = []; foreach ( array_unique( $raw_data[ self::ENROLL ] ) as $id ) { $child = false; // Drop array format. if ( false !== strpos( $id, '[' ) ) { if ( 0 === strpos( $id, self::O_CDN_MAPPING ) || 0 === strpos( $id, self::O_CRAWLER_COOKIES ) ) { // CDN child | Cookie Crawler settings. $child = substr( $id, strpos( $id, '[' ) + 1, strpos( $id, ']' ) - strpos( $id, '[' ) - 1 ); // Drop ending []; Compatible with xx[0] way from CLI. $id = substr( $id, 0, strpos( $id, '[' ) ); } else { // Drop ending []. $id = substr( $id, 0, strpos( $id, '[' ) ); } } if ( ! array_key_exists( $id, self::$_default_options ) ) { continue; } // Validate $child. if ( self::O_CDN_MAPPING === $id ) { if ( ! in_array( $child, [ self::CDN_MAPPING_URL, self::CDN_MAPPING_INC_IMG, self::CDN_MAPPING_INC_CSS, self::CDN_MAPPING_INC_JS, self::CDN_MAPPING_FILETYPE ], true ) ) { continue; } } if ( self::O_CRAWLER_COOKIES === $id ) { if ( ! in_array( $child, [ self::CRWL_COOKIE_NAME, self::CRWL_COOKIE_VALS ], true ) ) { continue; } } // Pull value from request. if ( $child ) { // []=xxx or [0]=xxx $data = ! empty( $raw_data[ $id ][ $child ] ) ? $raw_data[ $id ][ $child ] : $this->type_casting(false, $id); } else { $data = ! empty( $raw_data[ $id ] ) ? $raw_data[ $id ] : $this->type_casting(false, $id); } // Sanitize/normalize complex fields. if ( self::O_CDN_MAPPING === $id || self::O_CRAWLER_COOKIES === $id ) { // Use existing queued data if available (only when $child != false). $data2 = array_key_exists( $id, $the_matrix ) ? $the_matrix[ $id ] : ( defined( 'WP_CLI' ) && WP_CLI ? $this->conf( $id ) : [] ); } switch ( $id ) { // Don't allow Editor/admin to be used in crawler role simulator. case self::O_CRAWLER_ROLES: $data = Utility::sanitize_lines( $data ); if ( $data ) { foreach ( $data as $k => $v ) { if ( user_can( $v, 'edit_posts' ) ) { /* translators: %s: user id in tags */ $msg = sprintf( esc_html__( 'The user with id %s has editor access, which is not allowed for the role simulator.', 'litespeed-cache' ), '' . esc_html( $v ) . '' ); Admin_Display::error( $msg ); unset( $data[ $k ] ); } } } break; case self::O_CDN_MAPPING: /** * CDN setting * * Raw data format: * cdn-mapping[url][] = 'xxx' * cdn-mapping[url][2] = 'xxx2' * cdn-mapping[inc_js][] = 1 * * Final format: * cdn-mapping[0][url] = 'xxx' * cdn-mapping[2][url] = 'xxx2' */ if ( $data ) { foreach ( $data as $k => $v ) { if ( self::CDN_MAPPING_FILETYPE === $child ) { $v = Utility::sanitize_lines( $v ); } if ( self::CDN_MAPPING_URL === $child ) { // If not a valid URL, turn off CDN. if ( 0 !== strpos( $v, 'https://' ) ) { self::debug( '❌ CDN mapping set to OFF due to invalid URL' ); $the_matrix[ self::O_CDN ] = false; } $v = trailingslashit( $v ); } if ( in_array( $child, [ self::CDN_MAPPING_INC_IMG, self::CDN_MAPPING_INC_CSS, self::CDN_MAPPING_INC_JS ], true ) ) { // Because these can't be auto detected in `config->update()`, need to format here. $v = 'false' === $v ? 0 : (bool) $v; } if ( empty( $data2[ $k ] ) ) { $data2[ $k ] = []; } $data2[ $k ][ $child ] = $v; } } $data = $data2; break; case self::O_CRAWLER_COOKIES: /** * Cookie Crawler setting * Raw Format: * crawler-cookies[name][] = xxx * crawler-cookies[name][2] = xxx2 * crawler-cookies[vals][] = xxx * * Final format: * crawler-cookie[0][name] = 'xxx' * crawler-cookie[0][vals] = 'xxx' * crawler-cookie[2][name] = 'xxx2' * * Empty line for `vals` uses literal `_null`. */ if ( $data ) { foreach ( $data as $k => $v ) { if ( self::CRWL_COOKIE_VALS === $child ) { $v = Utility::sanitize_lines( $v ); } if ( empty( $data2[ $k ] ) ) { $data2[ $k ] = []; } $data2[ $k ][ $child ] = $v; } } $data = $data2; break; // Cache exclude category. case self::O_CACHE_EXC_CAT: $data2 = []; $data = Utility::sanitize_lines( $data ); foreach ( $data as $v ) { $cat_id = get_cat_ID( $v ); if ( ! $cat_id ) { continue; } $data2[] = $cat_id; } $data = $data2; break; // Cache exclude tag. case self::O_CACHE_EXC_TAG: $data2 = []; $data = Utility::sanitize_lines( $data ); foreach ( $data as $v ) { $term = get_term_by( 'name', $v, 'post_tag' ); if ( ! $term ) { // Could surface an admin error here if desired. continue; } $data2[] = $term->term_id; } $data = $data2; break; case self::O_IMG_OPTM_SIZES_SKIPPED: // Skip image sizes $image_sizes = Utility::prepare_image_sizes_array(); $saved_sizes = isset( $raw_data[$id] ) ? $raw_data[$id] : []; $data = array_diff( $image_sizes, $saved_sizes ); break; default: break; } $the_matrix[ $id ] = $data; } // Special handler for CDN/Crawler 2d list to drop empty rows. foreach ( $the_matrix as $id => $data ) { /** * Format: * cdn-mapping[0][url] = 'xxx' * cdn-mapping[2][url] = 'xxx2' * crawler-cookie[0][name] = 'xxx' * crawler-cookie[0][vals] = 'xxx' * crawler-cookie[2][name] = 'xxx2' */ if ( self::O_CDN_MAPPING === $id || self::O_CRAWLER_COOKIES === $id ) { // Drop row if all children are empty. foreach ( $data as $k => $v ) { foreach ( $v as $v2 ) { if ( $v2 ) { continue 2; } } // All empty. unset( $the_matrix[ $id ][ $k ] ); } } // Don't allow repeated cookie names. if ( self::O_CRAWLER_COOKIES === $id ) { $existed = []; foreach ( $the_matrix[ $id ] as $k => $v ) { if ( empty( $v[ self::CRWL_COOKIE_NAME ] ) || in_array( $v[ self::CRWL_COOKIE_NAME ], $existed, true ) ) { // Filter repeated or empty name. unset( $the_matrix[ $id ][ $k ] ); continue; } $existed[] = $v[ self::CRWL_COOKIE_NAME ]; } } // tmp fix the 3rd part woo update hook issue when enabling vary cookie. if ( 'wc_cart_vary' === $id ) { if ( $data ) { add_filter( 'litespeed_vary_cookies', function ( $arr ) { $arr[] = 'woocommerce_cart_hash'; return array_unique( $arr ); } ); } else { add_filter( 'litespeed_vary_cookies', function ( $arr ) { $key = array_search( 'woocommerce_cart_hash', $arr, true ); if ( false !== $key ) { unset( $arr[ $key ] ); } return array_unique( $arr ); } ); } } } // id validation will be inside. $this->cls( 'Conf' )->update_confs( $the_matrix ); $msg = __( 'Options saved.', 'litespeed-cache' ); Admin_Display::success( $msg ); } /** * Parses any changes made by the network admin on the network settings. * * @since 3.0 * * @param array $raw_data Raw data from request/CLI. * @return void */ public function network_save( $raw_data ) { self::debug( 'network saving' ); if ( empty( $raw_data[ self::ENROLL ] ) ) { wp_die( esc_html__( 'No fields', 'litespeed-cache' ) ); } $raw_data = Admin::cleanup_text( $raw_data ); foreach ( array_unique( $raw_data[ self::ENROLL ] ) as $id ) { // Append current field to setting save. if ( ! array_key_exists( $id, self::$_default_site_options ) ) { continue; } $data = ! empty( $raw_data[ $id ] ) ? $raw_data[ $id ] : false; // id validation will be inside. $this->cls( 'Conf' )->network_update( $id, $data ); } // Update related files. Activation::cls()->update_files(); $msg = __( 'Options saved.', 'litespeed-cache' ); Admin_Display::success( $msg ); } /** * Hooked to the wp_redirect filter when saving widgets fails validation. * * @since 1.1.3 * * @param string $location The redirect location. * @return string Updated location string. */ public static function widget_save_err( $location ) { return str_replace( '?message=0', '?error=0', $location ); } /** * Validate the LiteSpeed Cache settings on widget save. * * @since 1.1.3 * * @param array $instance The new settings. * @param array $new_instance The raw submitted settings. * @param array $old_instance The original settings. * @param \WP_Widget $widget The widget instance. * @return array|false Updated settings on success, false on error. */ public static function validate_widget_save( $instance, $new_instance, $old_instance, $widget ) { if ( empty( $new_instance ) ) { return $instance; } if ( ! isset( $new_instance[ ESI::WIDGET_O_ESIENABLE ], $new_instance[ ESI::WIDGET_O_TTL ] ) ) { return $instance; } $esi = (int) $new_instance[ ESI::WIDGET_O_ESIENABLE ] % 3; $ttl = (int) $new_instance[ ESI::WIDGET_O_TTL ]; if ( 0 !== $ttl && $ttl < 30 ) { add_filter( 'wp_redirect', __CLASS__ . '::widget_save_err' ); return false; // Invalid ttl. } if ( empty( $instance[ Conf::OPTION_NAME ] ) ) { // @todo to be removed. $instance[ Conf::OPTION_NAME ] = []; } $instance[ Conf::OPTION_NAME ][ ESI::WIDGET_O_ESIENABLE ] = $esi; $instance[ Conf::OPTION_NAME ][ ESI::WIDGET_O_TTL ] = $ttl; $current = ! empty( $old_instance[ Conf::OPTION_NAME ] ) ? $old_instance[ Conf::OPTION_NAME ] : false; // Avoid unsanitized superglobal usage. $referrer = isset( $_SERVER['HTTP_REFERER'] ) ? esc_url_raw( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) : ''; // Only purge when not in the Customizer. if ( false === strpos( $referrer, '/wp-admin/customize.php' ) ) { if ( ! $current || $esi !== (int) $current[ ESI::WIDGET_O_ESIENABLE ] ) { Purge::purge_all( 'Widget ESI_enable changed' ); } elseif ( 0 !== $ttl && $ttl !== (int) $current[ ESI::WIDGET_O_TTL ] ) { Purge::add( Tag::TYPE_WIDGET . $widget->id ); } Purge::purge_all( 'Widget saved' ); } return $instance; } } { "translation-revision-date": "2026-05-28T20:57:38+00:00", "generator": "WP-CLI\/2.12.0", "source": "build\/3.1.0\/index.js", "domain": "messages", "locale_data": { "messages": { "": { "domain": "messages", "lang": "it_IT", "plural-forms": "nplurals=2; plural=(n != 1);" }, "HostGator": [ "" ], "Home": [ "" ], "Settings": [ "" ], "Not Live": [ "" ], "Live": [ "" ], "Your website is currently displaying a \"Coming Soon\" page.": [ "" ], "Editor": [ "" ], "Hosting Panel": [ "" ], "Oh No, An Error!": [ "" ], "You found an error, please refresh the page and try again!": [ "" ], "If the error persists, please contact support.": [ "" ], "Error code:": [ "" ], "HostGator WordPress Plugin": [ "" ], "Phone": [ "" ], "Give us a ring at (866) 96-GATOR": [ "" ], "Call Us": [ "" ], "Chat": [ "" ], "Have a question? We're here 24\/7\/365": [ "" ], "Live Chat": [ "" ], "Tweet": [ "" ], "Tweet us at @hgsupport for support": [ "" ], "Tweet Us": [ "" ], "Knowledge Base": [ "" ], "Know what the pros know.": [ "" ], "Find Answers": [ "" ], "Blog": [ "" ], "Get our tips and in-depth articles.": [ "" ], "Learn Stuff": [ "" ], "Video Tutorials": [ "" ], "Step-by-step tutorials and additional guides.": [ "" ], "Watch Now": [ "" ], "There's nothing here!": [ "" ], "Manage WordPress": [ "" ], "Staging": [ "" ], "Performance": [ "" ], "Commerce": [ "" ], "Marketplace": [ "" ], "Help": [ "" ], "Admin": [ "" ], "Secret page to manage admin features and settings.": [ "" ], "Premium tools available in eCommerce Add-Ons": [ "" ], "Discover exclusive features, designed to deliver unmatched value and elevate your online experience.": [ "" ], "We are available 24\/7 to help answer questions and solve your problems.": [ "" ], "Welcome to HostGator": [ "" ], "We're very excited to get started with you!": [ "" ], "Quick Links": [ "" ], "Settings and Performance": [ "" ], "Customize & fine-tune your site.": [ "" ], "Manage Settings": [ "" ], "Manage your site settings. You can adjust automatic updates, comments, revisions and more.": [ "" ], "Manage site performance and caching settings as well as clear the site cache.": [ "" ], "Visit Marketplace": [ "" ], "Add site services, themes or plugins from the marketplace.": [ "" ], "Website Content": [ "" ], "Create, manage & sort your story.": [ "" ], "New Post": [ "" ], "Write a new blog post.": [ "" ], "Pages": [ "" ], "New Page": [ "" ], "Add fresh pages to your website.": [ "" ], "Categories": [ "" ], "Manage Categories": [ "" ], "Organize existing content into categories.": [ "" ], "Web Hosting": [ "" ], "Access & manage your HostGator account.": [ "" ], "Manage Sites": [ "" ], "Manage your site from the control panel. You can create backups, set security, and improve performance.": [ "" ], "Email": [ "" ], "Manage Email": [ "" ], "Create email accounts, compose, send, and receive your email from the control panel.": [ "" ], "Domains": [ "" ], "Manage Domain": [ "" ], "Find a Domain": [ "" ], "Find a new domain and assign it to your site or start a new site with a fresh domain.": [ "" ], "Get Help": [ "" ], "24\/7\/365 support. We work when you work.": [ "" ], "Explore our featured collection of tools and services.": [ "" ], "Oops, there was an error loading the marketplace, please try again later.": [ "" ], "Sorry, no marketplace items. Please, try again later.": [ "" ], "Load More": [ "" ], "Oops! Something Went Wrong": [ "" ], "An error occurred while loading the content. Please try again later.": [ "" ], "Manage All Updates": [ "" ], "WordPress Core": [ "" ], "Plugins": [ "" ], "Themes": [ "" ], "Automatic Updates": [ "" ], "Keeping automatic updates on ensures timely security fixes and the latest features.": [ "" ], "Oops! Something went wrong. Please try again.": [ "" ], "Coming soon activated": [ "" ], "Coming soon deactivated": [ "" ], "Coming soon page is active. Site requires login.": [ "" ], "Coming soon page is not active. Site is live to visitors.": [ "" ], "Site Status": [ "" ], "Turn off your \"Coming Soon\" page when you are ready to launch your website.": [ "" ], "Turn on your \"Coming Soon\" page when you need to make major changes to your website.": [ "" ], "Coming Soon page": [ "" ], "Your Hostgator Coming Soon page lets you hide your site from visitors while you make the magic happen.": [ "" ], "Disabled old post comments": [ "" ], "Enabled old post comments": [ "" ], "Comments on old posts are disabled.": [ "" ], "Comments are allowed on old posts.": [ "" ], "Disable comments for older posts": [ "" ], "Comments setting saved": [ "" ], "Comments on posts are disabled after %s day.": [ "" ], "Close comments after %s day.": [ "" ], "Comments setting saved.": [ "" ], "Posts will display %s comment at a time.": [ "" ], "Display %s comments per page.": [ "" ], "Comments": [ "" ], "Comments allow visitors to provide feedback and respond to your posts or pages.": [ "" ], "Post revision setting saved": [ "" ], "Posts will save %s revision.": [ "" ], "Number of revisions posts can save": [ "" ], "Saving drafts and updating published content creates revisions. Make changes with confidence, knowing you can take %s step back.": [ "" ], "Trash setting saved": [ "" ], "The trash will automatically empty every %s week.": [ "" ], "Trash emptying frequency": [ "" ], "Content Options": [ "" ], "Controls for content revisions and how often to empty the trash.": [ "" ], "The Help Center provides guided, step-by-step assistance as you build your site.": [ "" ], "Sorry, that is not allowed.": [ "" ], "This feature cannot currently be modified.": [ "" ], "Optimize your website my managing cache, security and performance settings.": [ "" ], "Optimize your website by managing cache and performance settings": [ "" ], "General Settings": [ "" ], "This is where you can manage common settings for your website.": [ "" ], "Features": [ "" ], "Customize the available features as you manage your website.": [ "" ], "A staging site is a duplicate of your live site, offering a secure environment to experiment, test updates, and deploy when ready.": [ "" ], "The performance feature provides improvements to loads faster for visitors including cache settings.": [ "" ], "The staging feature provides a way to copy a site to test new updates, features or content.": [ "" ], "WonderBlocks provides a library of customizable block patterns and page templates.": [ "" ], "Site Editor": [ "" ], "Customizer": [ "" ] } } } /** * Inline On Mobile - Dynamic CSS. * * @package astra * @since 3.5.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } add_filter( 'astra_dynamic_theme_css', 'astra_inline_on_mobile_css' ); /** * Inline On Mobile - Dynamic CSS. * * @param string $dynamic_css Dynamic CSS. * @since 3.5.0 * @return string */ function astra_inline_on_mobile_css( $dynamic_css ) { $inline_on_mobile_enable = false; for ( $index = 1; $index <= Astra_Builder_Helper::$component_limit; $index++ ) { if ( false === astra_get_option( 'header-menu' . $index . '-menu-stack-on-mobile' ) ) { $inline_on_mobile_enable = true; break; } } if ( false === $inline_on_mobile_enable ) { return $dynamic_css; } $inline_on_mobile_css = ' .ast-header-break-point .ast-mobile-header-wrap .ast-above-header-wrap .main-header-bar-navigation .inline-on-mobile .menu-item .menu-link, .ast-header-break-point .ast-mobile-header-wrap .ast-main-header-wrap .main-header-bar-navigation .inline-on-mobile .menu-item .menu-link, .ast-header-break-point .ast-mobile-header-wrap .ast-below-header-wrap .main-header-bar-navigation .inline-on-mobile .menu-item .menu-link { border: none; } .ast-header-break-point .ast-mobile-header-wrap .ast-above-header-wrap .main-header-bar-navigation .inline-on-mobile .menu-item-has-children > .ast-menu-toggle::before, .ast-header-break-point .ast-mobile-header-wrap .ast-main-header-wrap .main-header-bar-navigation .inline-on-mobile .menu-item-has-children > .ast-menu-toggle::before, .ast-header-break-point .ast-mobile-header-wrap .ast-below-header-wrap .main-header-bar-navigation .inline-on-mobile .menu-item-has-children > .ast-menu-toggle::before { font-size: .6rem; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile { flex-wrap: unset; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu .menu-link { padding: .1em 1em; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item .ast-menu-toggle::before { transform: rotate(-90deg); } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item.ast-submenu-expanded .ast-menu-toggle::before { transform: rotate(-270deg); } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item > .sub-menu > .menu-item .menu-link:before { content: none; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile { flex-wrap: unset; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu .menu-link { padding: .1em 1em; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item .ast-menu-toggle::before { transform: rotate(-90deg); } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item.ast-submenu-expanded .ast-menu-toggle::before { transform: rotate(-270deg); } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item > .sub-menu > .menu-item .menu-link:before { content: none; } .ast-header-break-point .inline-on-mobile .sub-menu { width: 150px; }'; if ( is_rtl() ) { $inline_on_mobile_css .= ' .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.menu-item-has-children { margin-left: 10px; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu { display: block; position: absolute; left: auto; right: 0; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu .menu-item .ast-menu-toggle { padding: 0; left: 1em; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item > .sub-menu { right: 100%; left: auto; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .ast-menu-toggle { left: -15px; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.menu-item-has-children { margin-left: 10px; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu { display: block; position: absolute; left: auto; right: 0; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item > .sub-menu { right: 100%; left: auto; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .ast-menu-toggle { left: -15px; }'; } else { $inline_on_mobile_css .= ' .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.menu-item-has-children { margin-right: 10px; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu { display: block; position: absolute; right: auto; left: 0; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu .menu-item .ast-menu-toggle { padding: 0; right: 1em; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item > .sub-menu { left: 100%; right: auto; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .ast-menu-toggle { right: -15px; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.menu-item-has-children { margin-right: 10px; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu { display: block; position: absolute; right: auto; left: 0; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .menu-item.ast-submenu-expanded > .sub-menu > .menu-item > .sub-menu { left: 100%; right: auto; } .ast-header-break-point .ast-mobile-header-wrap .ast-flex.inline-on-mobile .ast-menu-toggle { right: -15px; }'; } return $dynamic_css .= Astra_Enqueue_Scripts::trim_css( $inline_on_mobile_css ); } /** * Related Posts Loader for Astra theme. * * @package Astra * @author Brainstorm Force * @copyright Copyright (c) 2021, Brainstorm Force * @link https://www.brainstormforce.com * @since Astra 3.5.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Customizer Initialization * * @since 3.5.0 */ class Astra_Related_Posts_Loader { /** * Constructor * * @since 3.5.0 */ public function __construct() { add_filter( 'astra_theme_defaults', array( $this, 'theme_defaults' ) ); add_action( 'customize_register', array( $this, 'related_posts_customize_register' ), 2 ); // Load Google fonts. add_action( 'astra_get_fonts', array( $this, 'add_fonts' ), 1 ); } /** * Enqueue google fonts. * * @return void */ public function add_fonts() { if ( astra_target_rules_for_related_posts() ) { // Related Posts Section title. $section_title_font_family = astra_get_option( 'related-posts-section-title-font-family' ); $section_title_font_weight = astra_get_option( 'related-posts-section-title-font-weight' ); Astra_Fonts::add_font( $section_title_font_family, $section_title_font_weight ); // Related Posts - Posts title. $post_title_font_family = astra_get_option( 'related-posts-title-font-family' ); $post_title_font_weight = astra_get_option( 'related-posts-title-font-weight' ); Astra_Fonts::add_font( $post_title_font_family, $post_title_font_weight ); // Related Posts - Meta Font. $meta_font_family = astra_get_option( 'related-posts-meta-font-family' ); $meta_font_weight = astra_get_option( 'related-posts-meta-font-weight' ); Astra_Fonts::add_font( $meta_font_family, $meta_font_weight ); // Related Posts - Content Font. $content_font_family = astra_get_option( 'related-posts-content-font-family' ); $content_font_weight = astra_get_option( 'related-posts-content-font-weight' ); Astra_Fonts::add_font( $content_font_family, $content_font_weight ); } } /** * Set Options Default Values * * @param array $defaults Astra options default value array. * @return array */ public function theme_defaults( $defaults ) { /** * Update Astra default color and typography values. To not update directly on existing users site, added backwards. * * @since 4.0.0 */ $apply_new_default_color_typo_values = Astra_Dynamic_CSS::astra_check_default_color_typo(); $astra_options = Astra_Theme_Options::get_astra_options(); $astra_blog_update = Astra_Dynamic_CSS::astra_4_6_0_compatibility(); // Related Posts. $defaults['enable-related-posts'] = false; $defaults['related-posts-title'] = __( 'Related Posts', 'astra' ); $defaults['releted-posts-title-alignment'] = 'left'; $defaults['related-posts-total-count'] = 2; $defaults['enable-related-posts-excerpt'] = false; $defaults['related-posts-box-placement'] = 'default'; $defaults['related-posts-outside-location'] = 'above'; $defaults['related-posts-container-width'] = $astra_blog_update ? '' : 'fallback'; $defaults['related-posts-excerpt-count'] = 25; $defaults['related-posts-based-on'] = 'categories'; $defaults['related-posts-order-by'] = 'date'; $defaults['related-posts-order'] = 'asc'; $defaults['related-posts-grid-responsive'] = array( 'desktop' => '2-equal', 'tablet' => '2-equal', 'mobile' => 'full', ); $defaults['related-posts-structure'] = array( 'featured-image', 'title-meta', ); $defaults['related-posts-tag-style'] = 'none'; $defaults['related-posts-category-style'] = 'none'; $defaults['related-posts-date-format'] = ''; $defaults['related-posts-meta-date-type'] = 'published'; $defaults['related-posts-author-avatar-size'] = ''; $defaults['related-posts-author-avatar'] = false; $defaults['related-posts-author-prefix-label'] = astra_default_strings( 'string-blog-meta-author-by', false ); $defaults['related-posts-image-size'] = ''; $defaults['related-posts-image-custom-scale-width'] = 16; $defaults['related-posts-image-custom-scale-height'] = 9; $defaults['related-posts-image-ratio-pre-scale'] = '16/9'; $defaults['related-posts-image-ratio-type'] = ''; $defaults['related-posts-meta-structure'] = array( 'comments', 'category', 'author', ); // Related Posts - Color styles. $defaults['related-posts-text-color'] = $apply_new_default_color_typo_values ? 'var(--ast-global-color-2)' : ''; $defaults['related-posts-link-color'] = ''; $defaults['related-posts-title-color'] = $apply_new_default_color_typo_values ? 'var(--ast-global-color-2)' : ''; $defaults['related-posts-background-color'] = ''; $defaults['related-posts-meta-color'] = ''; $defaults['related-posts-link-hover-color'] = ''; $defaults['related-posts-meta-link-hover-color'] = ''; // Related Posts - Title typo. $defaults['related-posts-section-title-font-family'] = 'inherit'; $defaults['related-posts-section-title-font-weight'] = 'inherit'; $defaults['related-posts-section-title-text-transform'] = ''; $defaults['related-posts-section-title-line-height'] = $apply_new_default_color_typo_values ? '1.25' : ''; $defaults['related-posts-section-title-font-extras'] = array( 'line-height' => ! isset( $astra_options['related-posts-section-title-font-extras'] ) && isset( $astra_options['related-posts-section-title-line-height'] ) ? $astra_options['related-posts-section-title-line-height'] : '1.6', 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => ! isset( $astra_options['related-posts-section-title-font-extras'] ) && isset( $astra_options['related-posts-section-title-text-transform'] ) ? $astra_options['related-posts-section-title-text-transform'] : '', 'text-decoration' => '', ); $defaults['related-posts-section-title-font-size'] = array( 'desktop' => $apply_new_default_color_typo_values ? '26' : '30', 'tablet' => '', 'mobile' => '', 'desktop-unit' => 'px', 'tablet-unit' => 'px', 'mobile-unit' => 'px', ); // Related Posts - Title typo. $defaults['related-posts-title-font-family'] = 'inherit'; $defaults['related-posts-title-font-weight'] = $apply_new_default_color_typo_values ? '500' : 'inherit'; $defaults['related-posts-title-text-transform'] = ''; $defaults['related-posts-title-line-height'] = '1'; $defaults['related-posts-title-font-size'] = array( 'desktop' => '20', 'tablet' => '', 'mobile' => '', 'desktop-unit' => 'px', 'tablet-unit' => 'px', 'mobile-unit' => 'px', ); $defaults['related-posts-title-font-extras'] = array( 'line-height' => ! isset( $astra_options['related-posts-title-font-extras'] ) && isset( $astra_options['related-posts-title-line-height'] ) ? $astra_options['related-posts-title-line-height'] : ( $astra_blog_update ? '1.5' : '1' ), 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => ! isset( $astra_options['related-posts-title-font-extras'] ) && isset( $astra_options['related-posts-title-text-transform'] ) ? $astra_options['related-posts-title-text-transform'] : '', 'text-decoration' => '', ); // Related Posts - Meta typo. $defaults['related-posts-meta-font-family'] = 'inherit'; $defaults['related-posts-meta-font-weight'] = 'inherit'; $defaults['related-posts-meta-text-transform'] = ''; $defaults['related-posts-meta-line-height'] = ''; $defaults['related-posts-meta-font-size'] = array( 'desktop' => '14', 'tablet' => '', 'mobile' => '', 'desktop-unit' => 'px', 'tablet-unit' => 'px', 'mobile-unit' => 'px', ); $defaults['related-posts-meta-font-extras'] = array( 'line-height' => ! isset( $astra_options['related-posts-meta-font-extras'] ) && isset( $astra_options['related-posts-meta-line-height'] ) ? $astra_options['related-posts-meta-line-height'] : '1.6', 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => ! isset( $astra_options['related-posts-meta-font-extras'] ) && isset( $astra_options['related-posts-meta-text-transform'] ) ? $astra_options['related-posts-meta-text-transform'] : '', 'text-decoration' => '', ); // Related Posts - Content typo. $defaults['related-posts-content-font-family'] = 'inherit'; $defaults['related-posts-content-font-weight'] = 'inherit'; $defaults['related-posts-content-font-extras'] = array( 'line-height' => ! isset( $astra_options['related-posts-content-font-extras'] ) && isset( $astra_options['related-posts-content-line-height'] ) ? $astra_options['related-posts-content-line-height'] : '', 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => ! isset( $astra_options['related-posts-content-font-extras'] ) && isset( $astra_options['related-posts-content-text-transform'] ) ? $astra_options['related-posts-content-text-transform'] : '', 'text-decoration' => '', ); $defaults['related-posts-content-font-size'] = array( 'desktop' => '', 'tablet' => '', 'mobile' => '', 'desktop-unit' => 'px', 'tablet-unit' => 'px', 'mobile-unit' => 'px', ); $defaults['ast-sub-section-related-posts-padding'] = array( 'desktop' => array( 'top' => 2.5, 'right' => 2.5, 'bottom' => 2.5, 'left' => 2.5, ), 'tablet' => array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ), 'mobile' => array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ), 'desktop-unit' => 'em', 'tablet-unit' => 'em', 'mobile-unit' => 'em', ); $defaults['ast-sub-section-related-posts-margin'] = array( 'desktop' => array( 'top' => 2, 'right' => '', 'bottom' => '', 'left' => '', ), 'tablet' => array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ), 'mobile' => array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ), 'desktop-unit' => 'em', 'tablet-unit' => 'em', 'mobile-unit' => 'em', ); return $defaults; } /** * Add postMessage support for site title and description for the Theme Customizer. * * @param WP_Customize_Manager $wp_customize Theme Customizer object. * * @since 3.5.0 */ public function related_posts_customize_register( $wp_customize ) { /** * Register Config control in Related Posts. */ // @codingStandardsIgnoreStart WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound require_once ASTRA_RELATED_POSTS_DIR . 'customizer/class-astra-related-posts-configs.php'; // @codingStandardsIgnoreEnd WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } /** * Render the Related Posts title for the selective refresh partial. * * @since 3.5.0 */ public function render_related_posts_title() { return astra_get_option( 'related-posts-title' ); } } /** * Kicking this off by creating NEW instace. */ new Astra_Related_Posts_Loader(); /** * Astra Theme Customizer Configuration Builder. * * @package astra-builder * @author Astra * @copyright Copyright (c) 2020, Astra * @link https://wpastra.com/ * @since 3.0.0 */ // No direct access, please. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Register Builder Customizer Configurations. * * @since 3.0.0 */ class Astra_Button_Component_Configs { /** * Register Builder Customizer Configurations. * * @param array $configurations Configurations. * @param string $builder_type Builder Type. * @param string $section Section. * * @since 3.0.0 * @return array $configurations Astra Customizer Configurations with updated configurations. */ public static function register_configuration( $configurations, $builder_type = 'header', $section = 'section-hb-button-' ) { if ( 'footer' === $builder_type ) { $class_obj = Astra_Builder_Footer::get_instance(); $number_of_button = Astra_Builder_Helper::$num_of_footer_button; $component_limit = defined( 'ASTRA_EXT_VER' ) ? Astra_Builder_Helper::$component_limit : Astra_Builder_Helper::$num_of_footer_button; } else { $class_obj = Astra_Builder_Header::get_instance(); $number_of_button = Astra_Builder_Helper::$num_of_header_button; $component_limit = defined( 'ASTRA_EXT_VER' ) ? Astra_Builder_Helper::$component_limit : Astra_Builder_Helper::$num_of_header_button; } $button_config = array(); for ( $index = 1; $index <= $component_limit; $index++ ) { $_section = $section . $index; $_prefix = 'button' . $index; /** * These options are related to Header Section - Button. * Prefix hs represents - Header Section. */ $button_config[] = array( /* * Header Builder section - Button Component Configs. */ array( 'name' => $_section, 'type' => 'section', 'priority' => 50, /* translators: %s Index */ 'title' => ( 1 === $number_of_button ) ? __( 'Button', 'astra' ) : sprintf( __( 'Button %s', 'astra' ), $index ), 'panel' => 'panel-' . $builder_type . '-builder-group', 'clone_index' => $index, 'clone_type' => $builder_type . '-button', ), /** * Option: Header Builder Tabs */ array( 'name' => $_section . '-ast-context-tabs', 'section' => $_section, 'type' => 'control', 'control' => 'ast-builder-header-control', 'priority' => 0, 'description' => '', ), /** * Option: Button Text */ array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text]', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-text' ), 'type' => 'control', 'control' => 'text', 'section' => $_section, 'priority' => 20, 'title' => __( 'Text', 'astra' ), 'transport' => 'postMessage', 'partial' => array( 'selector' => '.ast-' . $builder_type . '-button-' . $index, 'container_inclusive' => false, 'render_callback' => array( $class_obj, 'button_' . $index ), 'fallback_refresh' => false, ), 'context' => Astra_Builder_Helper::$general_tab, ), /** * Option: Button Link */ array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-link-option]', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-link-option' ), 'type' => 'control', 'control' => 'ast-link', 'sanitize_callback' => array( 'Astra_Customizer_Sanitizes', 'sanitize_link' ), 'section' => $_section, 'priority' => 30, 'title' => __( 'Link', 'astra' ), 'transport' => 'postMessage', 'partial' => array( 'selector' => '.ast-' . $builder_type . '-button-' . $index, 'container_inclusive' => false, 'render_callback' => array( $class_obj, 'button_' . $index ), ), 'context' => Astra_Builder_Helper::$general_tab, 'divider' => array( 'ast_class' => 'ast-top-section-divider' ), ), /** * Group: Primary Header Button Colors Group */ array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-color-group]', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-color-group' ), 'type' => 'control', 'control' => 'ast-color-group', 'title' => __( 'Text Color', 'astra' ), 'section' => $_section, 'transport' => 'postMessage', 'priority' => 70, 'context' => Astra_Builder_Helper::$design_tab, 'responsive' => true, 'divider' => array( 'ast_class' => 'ast-section-spacing' ), ), array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-background-color-group]', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-color-group' ), 'type' => 'control', 'control' => 'ast-color-group', 'title' => __( 'Background Color', 'astra' ), 'section' => $_section, 'transport' => 'postMessage', 'priority' => 70, 'context' => Astra_Builder_Helper::$design_tab, 'responsive' => true, ), /** * Option: Button Text Color */ array( 'name' => $builder_type . '-' . $_prefix . '-text-color', 'transport' => 'postMessage', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-text-color' ), 'type' => 'sub-control', 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-color-group]', 'section' => $_section, 'tab' => __( 'Normal', 'astra' ), 'control' => 'ast-responsive-color', 'responsive' => true, 'rgba' => true, 'priority' => 9, 'context' => Astra_Builder_Helper::$design_tab, 'title' => __( 'Normal', 'astra' ), ), /** * Option: Button Text Hover Color */ array( 'name' => $builder_type . '-' . $_prefix . '-text-h-color', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-text-h-color' ), 'transport' => 'postMessage', 'type' => 'sub-control', 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-color-group]', 'section' => $_section, 'tab' => __( 'Hover', 'astra' ), 'control' => 'ast-responsive-color', 'responsive' => true, 'rgba' => true, 'priority' => 9, 'context' => Astra_Builder_Helper::$design_tab, 'title' => __( 'Hover', 'astra' ), ), /** * Option: Button Background Color */ array( 'name' => $builder_type . '-' . $_prefix . '-back-color', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-back-color' ), 'transport' => 'postMessage', 'type' => 'sub-control', 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-background-color-group]', 'section' => $_section, 'tab' => __( 'Normal', 'astra' ), 'control' => 'ast-responsive-color', 'responsive' => true, 'rgba' => true, 'priority' => 10, 'context' => Astra_Builder_Helper::$design_tab, 'title' => __( 'Normal', 'astra' ), ), /** * Option: Button Button Hover Color */ array( 'name' => $builder_type . '-' . $_prefix . '-back-h-color', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-back-h-color' ), 'transport' => 'postMessage', 'type' => 'sub-control', 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-background-color-group]', 'section' => $_section, 'tab' => __( 'Hover', 'astra' ), 'control' => 'ast-responsive-color', 'responsive' => true, 'rgba' => true, 'priority' => 10, 'context' => Astra_Builder_Helper::$design_tab, 'title' => __( 'Hover', 'astra' ), ), array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-builder-button-border-colors-group]', 'type' => 'control', 'control' => 'ast-color-group', 'title' => __( 'Border Color', 'astra' ), 'section' => $_section, 'priority' => 70, 'transport' => 'postMessage', 'context' => Astra_Builder_Helper::$design_tab, 'responsive' => true, 'divider' => array( 'ast_class' => 'ast-bottom-divider' ), ), /** * Option: Button Border Color */ array( 'name' => $builder_type . '-' . $_prefix . '-border-color', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-border-color' ), 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-builder-button-border-colors-group]', 'transport' => 'postMessage', 'type' => 'sub-control', 'section' => $_section, 'control' => 'ast-responsive-color', 'responsive' => true, 'rgba' => true, 'priority' => 70, 'context' => Astra_Builder_Helper::$design_tab, 'title' => __( 'Normal', 'astra' ), ), /** * Option: Button Border Hover Color */ array( 'name' => $builder_type . '-' . $_prefix . '-border-h-color', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-border-h-color' ), 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-builder-button-border-colors-group]', 'transport' => 'postMessage', 'type' => 'sub-control', 'section' => $_section, 'control' => 'ast-responsive-color', 'responsive' => true, 'rgba' => true, 'priority' => 70, 'context' => Astra_Builder_Helper::$design_tab, 'title' => __( 'Hover', 'astra' ), ), /** * Option: Button Border Size */ array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-border-size]', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-border-size' ), 'type' => 'control', 'section' => $_section, 'control' => 'ast-border', 'transport' => 'postMessage', 'linked_choices' => true, 'priority' => 99, 'title' => __( 'Border Width', 'astra' ), 'context' => Astra_Builder_Helper::$design_tab, 'choices' => array( 'top' => __( 'Top', 'astra' ), 'right' => __( 'Right', 'astra' ), 'bottom' => __( 'Bottom', 'astra' ), 'left' => __( 'Left', 'astra' ), ), 'divider' => array( 'ast_class' => 'ast-top-section-divider' ), ), /** * Option: Button Radius Fields */ array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-border-radius-fields]', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-border-radius-fields' ), 'type' => 'control', 'control' => 'ast-responsive-spacing', 'sanitize_callback' => array( 'Astra_Customizer_Sanitizes', 'sanitize_responsive_spacing' ), 'section' => $_section, 'title' => __( 'Border Radius', 'astra' ), 'linked_choices' => true, 'transport' => 'postMessage', 'unit_choices' => array( 'px', 'em', '%' ), 'choices' => array( 'top' => __( 'Top', 'astra' ), 'right' => __( 'Right', 'astra' ), 'bottom' => __( 'Bottom', 'astra' ), 'left' => __( 'Left', 'astra' ), ), 'priority' => 99, 'context' => Astra_Builder_Helper::$design_tab, 'connected' => false, 'divider' => array( 'ast_class' => 'ast-top-section-divider' ), ), /** * Option: Primary Header Button Typography */ array( 'name' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-typography]', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-text-typography' ), 'type' => 'control', 'control' => 'ast-settings-group', 'title' => __( 'Font', 'astra' ), 'section' => $_section, 'transport' => 'postMessage', 'context' => Astra_Builder_Helper::$design_tab, 'priority' => 90, ), /** * Option: Primary Header Button Font Family */ array( 'name' => $builder_type . '-' . $_prefix . '-font-family', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-font-family' ), 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-typography]', 'type' => 'sub-control', 'section' => $_section, 'control' => 'ast-font', 'font_type' => 'ast-font-family', 'title' => __( 'Font Family', 'astra' ), 'context' => Astra_Builder_Helper::$general_tab, 'connect' => $builder_type . '-' . $_prefix . '-font-weight', 'priority' => 1, 'divider' => array( 'ast_class' => 'ast-sub-bottom-dotted-divider' ), ), /** * Option: Primary Footer Button Font Weight */ array( 'name' => $builder_type . '-' . $_prefix . '-font-weight', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-font-weight' ), 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-typography]', 'type' => 'sub-control', 'section' => $_section, 'control' => 'ast-font', 'font_type' => 'ast-font-weight', 'title' => __( 'Font Weight', 'astra' ), 'sanitize_callback' => array( 'Astra_Customizer_Sanitizes', 'sanitize_font_weight' ), 'connect' => $builder_type . '-' . $_prefix . '-font-family', 'priority' => 2, 'context' => Astra_Builder_Helper::$general_tab, 'divider' => array( 'ast_class' => 'ast-sub-bottom-dotted-divider' ), ), /** * Option: Primary Header Button Font Size */ array( 'name' => $builder_type . '-' . $_prefix . '-font-size', 'default' => astra_get_option( $builder_type . '-' . $_prefix . '-font-size' ), 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-typography]', 'transport' => 'postMessage', 'title' => __( 'Font Size', 'astra' ), 'type' => 'sub-control', 'section' => $_section, 'control' => 'ast-responsive-slider', 'priority' => 3, 'context' => Astra_Builder_Helper::$general_tab, 'sanitize_callback' => array( 'Astra_Customizer_Sanitizes', 'sanitize_responsive_slider' ), 'suffix' => array( 'px', 'em', 'vw', 'rem' ), 'input_attrs' => array( 'px' => array( 'min' => 0, 'step' => 1, 'max' => 200, ), 'em' => array( 'min' => 0, 'step' => 0.01, 'max' => 20, ), 'vw' => array( 'min' => 0, 'step' => 0.1, 'max' => 25, ), 'rem' => array( 'min' => 0, 'step' => 0.1, 'max' => 20, ), ), ), /** * Option: Primary Footer Button Font Extras */ array( 'name' => $builder_type . '-' . $_prefix . '-font-extras', 'parent' => ASTRA_THEME_SETTINGS . '[' . $builder_type . '-' . $_prefix . '-text-typography]', 'section' => $_section, 'type' => 'sub-control', 'control' => 'ast-font-extras', 'priority' => 5, 'default' => astra_get_option( 'breadcrumb-font-extras' ), 'context' => Astra_Builder_Helper::$general_tab, 'title' => __( 'Font Extras', 'astra' ), ), ); if ( 'footer' === $builder_type ) { $button_config[] = array( array( 'name' => ASTRA_THEME_SETTINGS . '[footer-button-' . $index . '-alignment]', 'default' => astra_get_option( 'footer-button-' . $index . '-alignment' ), 'type' => 'control', 'control' => 'ast-selector', 'section' => $_section, 'priority' => 35, 'title' => __( 'Alignment', 'astra' ), 'context' => Astra_Builder_Helper::$general_tab, 'transport' => 'postMessage', 'choices' => array( 'flex-start' => 'align-left', 'center' => 'align-center', 'flex-end' => 'align-right', ), 'divider' => array( 'ast_class' => 'ast-top-section-divider' ), ), ); } $button_config[] = Astra_Builder_Base_Configuration::prepare_visibility_tab( $_section, $builder_type ); $button_config[] = Astra_Extended_Base_Configuration::prepare_advanced_tab( $_section ); } $button_config = call_user_func_array( 'array_merge', $button_config + array( array() ) ); $configurations = array_merge( $configurations, $button_config ); return $configurations; } } /** * Kicking this off by creating object of this class. */ new Astra_Button_Component_Configs(); /** * Header Builder Configuration. * * @author Astra * @package Astra * @copyright Copyright (c) 2023, Astra * @link https://wpastra.com/ * @since 4.5.2 */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Register header_builder header builder Customizer Configurations. * * @param array $configurations Astra Customizer Configurations. * @since 4.5.2 * @return array Astra Customizer Configurations with updated configurations. */ function astra_header_header_builder_configuration( $configurations = array() ) { $cloned_component_track = Astra_Builder_Helper::$component_count_array; $widget_config = array(); $astra_has_widgets_block_editor = astra_has_widgets_block_editor(); for ( $index = 1; $index <= Astra_Builder_Helper::$num_of_header_button; $index++ ) { $header_button_section = 'section-hb-button-' . $index; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( in_array( $header_button_section, $cloned_component_track['removed-items'], true ) ) { /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort continue; } $item = array( 'name' => ( 1 === Astra_Builder_Helper::$num_of_header_button ) ? 'Button' : 'Button ' . $index, 'icon' => 'admin-links', 'section' => $header_button_section, 'clone' => defined( 'ASTRA_EXT_VER' ), 'type' => 'button', 'builder' => 'header', ); Astra_Builder_Helper::$header_desktop_items[ 'button-' . $index ] = $item; Astra_Builder_Helper::$header_mobile_items[ 'button-' . $index ] = $item; } for ( $index = 1; $index <= Astra_Builder_Helper::$num_of_header_html; $index++ ) { $header_html_section = 'section-hb-html-' . $index; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( in_array( $header_html_section, $cloned_component_track['removed-items'], true ) ) { /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort continue; } $item = array( 'name' => ( 1 === Astra_Builder_Helper::$num_of_header_html ) ? 'HTML' : 'HTML ' . $index, 'icon' => 'text', 'section' => $header_html_section, 'clone' => defined( 'ASTRA_EXT_VER' ), 'type' => 'html', 'builder' => 'header', ); Astra_Builder_Helper::$header_desktop_items[ 'html-' . $index ] = $item; Astra_Builder_Helper::$header_mobile_items[ 'html-' . $index ] = $item; } for ( $index = 1; $index <= Astra_Builder_Helper::$num_of_header_widgets; $index++ ) { $header_widget_section = 'sidebar-widgets-header-widget-' . $index; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( in_array( $header_widget_section, $cloned_component_track['removed-items'], true ) ) { /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort continue; } $item = array( 'name' => ( 1 === Astra_Builder_Helper::$num_of_header_widgets ) ? 'Widget' : 'Widget ' . $index, 'icon' => 'wordpress', 'section' => $header_widget_section, 'clone' => defined( 'ASTRA_EXT_VER' ), 'type' => 'widget', 'builder' => 'header', ); if ( $astra_has_widgets_block_editor ) { $widget_config[] = array( 'name' => $header_widget_section, 'type' => 'section', 'priority' => 5, 'panel' => 'panel-header-builder-group', ); } Astra_Builder_Helper::$header_desktop_items[ 'widget-' . $index ] = $item; Astra_Builder_Helper::$header_mobile_items[ 'widget-' . $index ] = $item; } if ( $astra_has_widgets_block_editor ) { $configurations = array_merge( $configurations, $widget_config ); } for ( $index = 1; $index <= Astra_Builder_Helper::$num_of_header_menu; $index++ ) { switch ( $index ) { case 1: $name = __( 'Primary Menu', 'astra' ); break; case 2: $name = __( 'Secondary Menu', 'astra' ); break; default: $name = __( 'Menu ', 'astra' ) . $index; break; } $item = array( 'name' => $name, 'icon' => 'menu', 'section' => 'section-hb-menu-' . $index, 'clone' => defined( 'ASTRA_EXT_VER' ), 'type' => 'menu', 'builder' => 'header', ); Astra_Builder_Helper::$header_desktop_items[ 'menu-' . $index ] = $item; Astra_Builder_Helper::$header_mobile_items[ 'menu-' . $index ] = $item; } for ( $index = 1; $index <= Astra_Builder_Helper::$num_of_header_social_icons; $index++ ) { $header_social_section = 'section-hb-social-icons-' . $index; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( in_array( $header_social_section, $cloned_component_track['removed-items'], true ) ) { /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort continue; } $item = array( 'name' => ( 1 === Astra_Builder_Helper::$num_of_header_social_icons ) ? 'Social' : 'Social ' . $index, 'icon' => 'share', 'section' => $header_social_section, 'clone' => defined( 'ASTRA_EXT_VER' ), 'type' => 'social-icons', 'builder' => 'header', ); Astra_Builder_Helper::$header_desktop_items[ 'social-icons-' . $index ] = $item; Astra_Builder_Helper::$header_mobile_items[ 'social-icons-' . $index ] = $item; } $_configs = array( /* * Header Builder section */ array( 'name' => 'section-header-builder', 'type' => 'section', 'priority' => 5, 'title' => __( 'Header Builder', 'astra' ), 'panel' => 'panel-header-builder-group', ), /** * Option: Header Layout */ array( 'name' => 'section-header-builder-layout', 'type' => 'section', 'priority' => 0, 'title' => __( 'Header Layout', 'astra' ), 'panel' => 'panel-header-builder-group', ), /** * Option: Header Builder Tabs */ array( 'name' => 'section-header-builder-layout-ast-context-tabs', 'section' => 'section-header-builder-layout', 'type' => 'control', 'control' => 'ast-builder-header-control', 'priority' => 0, 'description' => '', ), /** * Header Clone Component Track. */ array( 'name' => ASTRA_THEME_SETTINGS . '[cloned-component-track]', 'section' => 'section-header-builder-layout', 'type' => 'control', 'control' => 'ast-hidden', 'priority' => 43, 'transport' => 'postMessage', 'partial' => false, 'default' => astra_get_option( 'cloned-component-track' ), ), /** * Option: Header Builder */ array( 'name' => ASTRA_THEME_SETTINGS . '[builder-header]', 'section' => 'section-header-builder', 'type' => 'control', 'control' => 'ast-builder-header-control', 'priority' => 40, 'description' => '', 'context' => array(), 'divider' => ( astra_showcase_upgrade_notices() ) ? array() : array( 'ast_class' => 'ast-pro-available' ), ), /** * Option: Header Desktop Items. */ array( 'name' => ASTRA_THEME_SETTINGS . '[header-desktop-items]', 'section' => 'section-header-builder', 'type' => 'control', 'control' => 'ast-builder', 'title' => __( 'Header Builder', 'astra' ), 'priority' => 25, 'default' => astra_get_option( 'header-desktop-items' ), 'choices' => Astra_Builder_Helper::$header_desktop_items, 'transport' => 'postMessage', 'partial' => array( 'selector' => '#masthead', 'container_inclusive' => true, 'render_callback' => array( Astra_Builder_Header::get_instance(), 'header_builder_markup' ), ), 'input_attrs' => array( 'group' => ASTRA_THEME_SETTINGS . '[header-desktop-items]', 'rows' => array( 'popup', 'above', 'primary', 'below' ), 'zones' => array( 'popup' => array( 'popup_content' => 'Popup Content', ), 'above' => array( 'above_left' => 'Top - Left', 'above_left_center' => 'Top - Left Center', 'above_center' => 'Top - Center', 'above_right_center' => 'Top - Right Center', 'above_right' => 'Top - Right', ), 'primary' => array( 'primary_left' => 'Main - Left', 'primary_left_center' => 'Main - Left Center', 'primary_center' => 'Main - Center', 'primary_right_center' => 'Main - Right Center', 'primary_right' => 'Main - Right', ), 'below' => array( 'below_left' => 'Bottom - Left', 'below_left_center' => 'Bottom - Left Center', 'below_center' => 'Bottom - Center', 'below_right_center' => 'Bottom - Right Center', 'below_right' => 'Bottom - Right', ), ), 'status' => array( 'above' => true, 'primary' => true, 'below' => true, ), ), 'context' => array( array( 'setting' => 'ast_selected_device', 'value' => 'desktop', ), ), ), /** * Header Desktop Available draggable items. */ array( 'name' => ASTRA_THEME_SETTINGS . '[header-desktop-draggable-items]', 'section' => 'section-header-builder-layout', 'type' => 'control', 'control' => 'ast-draggable-items', 'priority' => 30, 'input_attrs' => array( 'group' => ASTRA_THEME_SETTINGS . '[header-desktop-items]', 'zones' => array( 'popup', 'above', 'primary', 'below' ), ), 'context' => array( array( 'setting' => 'ast_selected_device', 'value' => 'desktop', ), array( 'setting' => 'ast_selected_tab', 'value' => 'general', ), ), 'divider' => array( 'ast_class' => 'ast-section-spacing' ), ), /** * Option: Header Mobile Items. */ array( 'name' => ASTRA_THEME_SETTINGS . '[header-mobile-items]', 'section' => 'section-header-builder', 'type' => 'control', 'control' => 'ast-builder', 'title' => __( 'Header Builder', 'astra' ), 'priority' => 35, 'default' => astra_get_option( 'header-mobile-items' ), 'choices' => Astra_Builder_Helper::$header_mobile_items, 'transport' => 'postMessage', 'partial' => array( 'selector' => '#masthead', 'container_inclusive' => true, 'render_callback' => array( Astra_Builder_Header::get_instance(), 'header_builder_markup' ), ), 'input_attrs' => array( 'group' => ASTRA_THEME_SETTINGS . '[header-mobile-items]', 'rows' => array( 'popup', 'above', 'primary', 'below' ), 'zones' => array( 'popup' => array( 'popup_content' => 'Popup Content', ), 'above' => array( 'above_left' => 'Top - Left', 'above_center' => 'Top - Center', 'above_right' => 'Top - Right', ), 'primary' => array( 'primary_left' => 'Main - Left', 'primary_center' => 'Main - Center', 'primary_right' => 'Main - Right', ), 'below' => array( 'below_left' => 'Bottom - Left', 'below_center' => 'Bottom - Center', 'below_right' => 'Bottom - Right', ), ), 'status' => array( 'above' => true, 'primary' => true, 'below' => true, ), ), 'context' => Astra_Builder_Helper::$responsive_devices, ), /** * Header Mobile Available draggable items. */ array( 'name' => ASTRA_THEME_SETTINGS . '[header-mobile-draggable-items]', 'section' => 'section-header-builder-layout', 'type' => 'control', 'control' => 'ast-draggable-items', 'input_attrs' => array( 'group' => ASTRA_THEME_SETTINGS . '[header-mobile-items]', 'zones' => array( 'popup', 'above', 'primary', 'below' ), ), 'priority' => 43, 'context' => array( array( 'setting' => 'ast_selected_device', 'operator' => 'in', 'value' => array( 'tablet', 'mobile' ), ), array( 'setting' => 'ast_selected_tab', 'value' => 'general', ), ), ), /** * Header Mobile popup items. */ array( 'name' => ASTRA_THEME_SETTINGS . '[header-mobile-popup-items]', 'section' => 'section-header-builder-layout', 'type' => 'control', 'control' => 'ast-hidden', 'priority' => 43, 'transport' => 'postMessage', 'partial' => array( 'selector' => '#ast-mobile-popup-wrapper', 'container_inclusive' => true, 'render_callback' => array( Astra_Builder_Header::get_instance(), 'mobile_popup' ), ), 'default' => false, ), /** * Option: Blog Color Section heading */ array( 'name' => ASTRA_THEME_SETTINGS . '[header-transparent-link-heading]', 'type' => 'control', 'control' => 'ast-heading', 'section' => 'section-header-builder-layout', 'title' => __( 'Header Types', 'astra' ), 'priority' => 44, 'settings' => array(), 'context' => Astra_Builder_Helper::$general_tab, 'divider' => array( 'ast_class' => 'ast-section-spacing' ), ), /** * Option: Header Transparant */ array( 'name' => ASTRA_THEME_SETTINGS . '[header-transparant-link]', 'section' => 'section-header-builder-layout', 'type' => 'control', 'control' => 'ast-header-type-button', 'input_attrs' => array( 'section' => 'section-transparent-header', 'label' => esc_html__( 'Transparent Header', 'astra' ), ), 'priority' => 45, 'context' => Astra_Builder_Helper::$general_tab, 'settings' => false, 'divider' => array( 'ast_class' => 'ast-section-spacing' ), ), // Option: Header Width. array( 'name' => ASTRA_THEME_SETTINGS . '[hb-header-main-layout-width]', 'default' => astra_get_option( 'hb-header-main-layout-width' ), 'type' => 'control', 'control' => 'ast-selector', 'section' => 'section-header-builder-layout', 'priority' => 4, 'title' => __( 'Width', 'astra' ), 'choices' => array( 'full' => __( 'Full Width', 'astra' ), 'content' => __( 'Content Width', 'astra' ), ), 'context' => array( array( 'setting' => 'ast_selected_tab', 'value' => 'design', ), array( 'setting' => 'ast_selected_device', 'value' => 'desktop', ), ), 'transport' => 'postMessage', 'renderAs' => 'text', 'responsive' => false, 'divider' => array( 'ast_class' => 'ast-section-spacing ast-bottom-section-divider' ), ), array( 'name' => ASTRA_THEME_SETTINGS . '[section-header-builder-layout-margin]', 'default' => astra_get_option( 'section-header-builder-layout-margin' ), 'type' => 'control', 'transport' => 'postMessage', 'control' => 'ast-responsive-spacing', 'sanitize_callback' => array( 'Astra_Customizer_Sanitizes', 'sanitize_responsive_spacing' ), 'section' => 'section-header-builder-layout', 'priority' => 220, 'title' => __( 'Margin', 'astra' ), 'linked_choices' => true, 'unit_choices' => array( 'px', 'em', '%' ), 'choices' => array( 'top' => __( 'Top', 'astra' ), 'right' => __( 'Right', 'astra' ), 'bottom' => __( 'Bottom', 'astra' ), 'left' => __( 'Left', 'astra' ), ), 'context' => Astra_Builder_Helper::$design_tab, ), ); // Learn More link if Astra Pro is not activated. if ( astra_showcase_upgrade_notices() ) { /** * Option: Pro options */ $_configs[] = array( 'name' => ASTRA_THEME_SETTINGS . '[header-builder-pro-items]', 'type' => 'control', 'control' => 'ast-upgrade', 'renderAs' => 'list', 'choices' => array( 'one' => array( 'title' => __( 'Sticky header', 'astra' ), ), 'two' => array( 'title' => __( 'Divider element', 'astra' ), ), 'three' => array( 'title' => __( 'Language Switcher element', 'astra' ), ), 'four' => array( 'title' => __( 'Toggle Button element', 'astra' ), ), 'five' => array( 'title' => __( 'Clone, Delete element options', 'astra' ), ), 'six' => array( 'title' => __( 'Increased element count', 'astra' ), ), 'seven' => array( 'title' => __( 'More design options', 'astra' ), ), ), 'section' => 'section-header-builder-layout', 'default' => '', 'priority' => 999, 'context' => array(), 'title' => __( 'Make an instant connection with amazing site headers', 'astra' ), 'divider' => array( 'ast_class' => 'ast-top-section-divider' ), ); } /** @psalm-suppress UndefinedClass */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( defined( 'ASTRA_EXT_VER' ) && Astra_Ext_Extension::is_active( 'sticky-header' ) ) { /** @psalm-suppress UndefinedClass */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** * Option: Header Transparant */ $_configs[] = array( 'name' => ASTRA_THEME_SETTINGS . '[header-sticky-link]', 'section' => 'section-header-builder-layout', 'type' => 'control', 'control' => 'ast-header-type-button', 'input_attrs' => array( 'section' => 'section-sticky-header', 'label' => esc_html__( 'Sticky Header', 'astra' ), ), 'priority' => 45, 'context' => Astra_Builder_Helper::$general_tab, 'settings' => false, ); } $_configs = array_merge( $_configs, $configurations ); if ( Astra_Builder_Customizer::astra_collect_customizer_builder_data() ) { array_map( 'astra_save_header_customizer_configs', $_configs ); } return $_configs; } if ( Astra_Builder_Customizer::astra_collect_customizer_builder_data() ) { astra_header_header_builder_configuration(); }

操作のヒント

UIの操作は、オペレーティングシステムの標準ファイルマネージャにほぼ準拠しています。ただし、モバイルブラウザではドラッグ&ドロップはできません。

  • 右クリックまたはロングタップでコンテキストメニューを表示します。
  • アイテムを移動/コピーするには、フォルダツリーまたはワークスペースにドラッグ&ドロップします。
  • ワークスペース内のアイテムの選択は、ShiftキーまたはAltキー(Optionキー)で選択範囲を拡張できます。
  • コピー先のフォルダまたはワークスペースにドラッグアンドドロップして、ファイルとフォルダをアップロードします。
  • アップロードダイアログでは、クリップボードのデータやURLリストのペースト/ドロップ、他のブラウザやファイルマネージャからのドラッグ&ドロップなどを受け入れることができます。
  • Altキー(Optionキー)を押しながらドラッグすると、ブラウザの外にドラッグできます。Google Chromeでダウンロード操作になります。
/** * HTML component. * * @package Astra Builder * @author Brainstorm Force * @copyright Copyright (c) 2020, Brainstorm Force * @link https://www.brainstormforce.com * @since Astra 3.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } define( 'ASTRA_HEADER_HTML_DIR', ASTRA_THEME_DIR . 'inc/builder/type/header/html' ); define( 'ASTRA_HEADER_HTML_URI', ASTRA_THEME_URI . 'inc/builder/type/header/html' ); /** * Heading Initial Setup * * @since 3.0.0 */ class Astra_Header_Html_Component { /** * Constructor function that initializes required actions and hooks */ public function __construct() { // @codingStandardsIgnoreStart WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound require_once ASTRA_HEADER_HTML_DIR . '/class-astra-header-html-component-loader.php'; // Include front end files. if ( ! is_admin() || Astra_Builder_Customizer::astra_collect_customizer_builder_data() ) { require_once ASTRA_HEADER_HTML_DIR . '/dynamic-css/dynamic.css.php'; } // @codingStandardsIgnoreEnd WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } } /** * Kicking this off by creating an object. */ new Astra_Header_Html_Component(); /** * Search Styling Loader for Astra theme. * * @package astra-builder * @author Astra * @copyright Copyright (c) 2020, Astra * @link https://wpastra.com/ * @since 3.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Customizer Initialization * * @since 3.0.0 */ class Astra_Header_Search_Component_Loader { /** * Constructor * * @since 3.0.0 */ public function __construct() { add_filter( 'astra_get_search', array( $this, 'get_search_markup' ), 10, 3 ); add_action( 'customize_preview_init', array( $this, 'preview_scripts' ), 110 ); } /** * Customizer Preview * * @since 3.0.0 */ public function preview_scripts() { /** * Load unminified if SCRIPT_DEBUG is true. */ /* Directory and Extension */ $dir_name = ( SCRIPT_DEBUG ) ? 'unminified' : 'minified'; $file_prefix = ( SCRIPT_DEBUG ) ? '' : '.min'; wp_enqueue_script( 'astra-header-builder-search-customizer-preview-js', ASTRA_HEADER_SEARCH_URI . '/assets/js/' . $dir_name . '/customizer-preview' . $file_prefix . '.js', array( 'customize-preview', 'astra-customizer-preview-js' ), ASTRA_THEME_VERSION, true ); } /** * Adding Wrapper for Search Form. * * @since 3.0.0 * * @param string $search_markup Search Form Content. * @param string $option Search Form Options. * @param string $device Device Desktop/Tablet/Mobile. * @return Search HTML structure created. */ public static function get_search_markup( $search_markup, $option = '', $device = '' ) { if ( is_customize_preview() ) { Astra_Builder_UI_Controller::render_customizer_edit_button(); } return $search_markup; } } /** * Kicking this off by creating the object of the class. */ new Astra_Header_Search_Component_Loader(); import Box from '@elementor/ui/Box'; import Container from '@elementor/ui/Container'; import { styled } from '@elementor/ui/styles'; import AccessibilityAssistantEmptyState from '@ea11y/pages/assistant/empty-state'; import AccessibilityAssistantHeading from '@ea11y/pages/assistant/heading'; import AccessibilityAssistantNoResultsState from '@ea11y/pages/assistant/no-results-state'; import AccessibilityAssistantResultsHeading from '@ea11y/pages/assistant/results/heading'; import AccessibilityAssistantResultsTable from '@ea11y/pages/assistant/results/table'; import AccessibilityAssistantStats from '@ea11y/pages/assistant/stats'; import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; import { useEffect } from '@wordpress/element'; import { useAccessibilityAssistantContext } from '../../contexts/accessibility-assistant-context'; const AccessibilityAssistant = () => { const { stats, loading, period, scannerResults, getFilteredScannerResults, onPeriodChange, } = useAccessibilityAssistantContext(); useEffect(() => { mixpanelService.sendEvent(mixpanelEvents.pageView, { page: 'Dashboard', }); }, []); if (!loading && !scannerResults.length) { return ( ); } if ( !loading && scannerResults.length && !getFilteredScannerResults().length ) { return ( <> ); } return ( <> ); }; export const StyledBox = styled(Box)` display: flex; flex-direction: column; justify-content: space-between; align-items: center; max-height: 100%; min-height: 50%; overflow: auto; `; const StyledHeadingWrapper = styled(Box)` width: 100%; `; const StyledHeadingContainer = styled(Container)` padding: ${({ theme }) => theme.spacing(4)}; @media (min-width: ${({ theme }) => theme.breakpoints.values.xl}px) { padding-inline: 0; } `; export const StyledContainer = styled(Container)` padding: ${({ theme }) => theme.spacing(1, 4, 4)}; @media (min-width: ${({ theme }) => theme.breakpoints.values.xl}px) { padding-inline: 0; } `; export default AccessibilityAssistant; Welcome to Shohdy Metals

Welcome to Shouhdy MetalsMetal ScrappingWhere Quality Meets Precision

At Shouhdy Metals, we redefine excellence in metal craftsmanship. With an unwavering commitment to quality and precision, we stand at the forefront of innovation in the metalworking industry. Welcome to our digital abode, where ingenuity meets reliability, and where your metal needs find their perfect solution.

Crafting Excellence, Forging Trust

For decades, Shouhdy Metals has been synonymous with uncompromising quality and unparalleled craftsmanship. From the intricate details of our designs to the robustness of our finished products, every piece we produce bears the hallmark of excellence.

Get Our Service Now

Whether you seek precision-machined components or bespoke metal fabrications, we are your steadfast partner in materializing your vision.

:Tel:+97317001668

About Us

Innovate. Create. Inspire

Innovation drives our every endeavor. We thrive on pushing the boundaries of what’s possible, continuously exploring new techniques, and embracing cutting-edge technologies to deliver results that surpass expectations. Our team of seasoned experts combines traditional craftsmanship with modern methodologies, ensuring that each project we undertake is a testament to our unwavering commitment to excellence.

Hanan Hamed Mohamed Shouhdy

CEO Shouhdy Metals

city-building-demolition-cleanup-with-dumpsters-fi-3HS638D.jpg
WhatsApp Image 2024-01-24 at 01.44.04
0 +
Years Of Experience

Industries We Serve

At Shouhdy Metals, our commitment to excellence extends across various industries, where our craftsmanship meets the unique demands of each sector. With our expertise in metalworking and dedication to innovation, we proudly serve various industries, ensuring that our products and services exceed expectations every time.

Grocery Stores

In the bustling world of grocery stores, efficiency and durability are paramount. From shopping carts to shelving units, we provide bespoke metal solutions designed to withstand the rigors of daily use while maintaining a sleek and professional appearance. Our attention to detail ensures that every metal component seamlessly integrates into the retail environment, enhancing both aesthetics and functionality.

Medical & Hospital

In the realm of healthcare, precision, and hygiene are non-negotiable. From medical instruments to hospital furniture, we prioritize safety and cleanliness in every metal component we manufacture. Our meticulous attention to detail ensures that our products not only meet stringent industry standards but also contribute to fostering healing environments where patients feel secure and cared for.

Hotel & Restaurant

In the hospitality industry, first impressions matter. From ornate metal fixtures to robust kitchen equipment, we collaborate with hotels and restaurants to elevate their spaces with style and sophistication. Whether it's crafting bespoke signage or fabricating custom furniture, our precision-engineered metal solutions add a touch of elegance while standing the test of time in demanding hospitality environments.

Industries

Industries We Serve

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Grocery Stores

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna.

Hotel & Restaurant

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna.

Medical & Hospital

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna.

What Service We Offer

At Shouhdy Metals, your satisfaction is our priority. We understand the importance of reliability, consistency, and timeliness in every project we undertake. With our proven track record and dedication to customer service, we assure you a seamless experience from concept to completion . Your vision is our mission, and we spare no effort in realizing it with finesse and precision.

WhatsApp Image 2024-01-24 at 01.43.05
Wood Recycling Service

Wood Recycling Service

Our advanced recycling facilities and unwavering dedication to eco-friendly practices enable us to provide businesses with a reliable and efficient solution for managing their wood waste while contributing to a cleaner, greener future.

WhatsApp Image 2024-01-24 at 01.44.03
E-Waste Management

E-Waste Management

Our e-waste management services encompass the safe and environmentally conscious recycling of electronic components, safeguarding sensitive data and minimizing ecological impact throughout the disposal process.

WhatsApp Image 2024-01-25 at 18.24.41_43e6adc9
Paper Scrap Recycling

Paper Scrap Recycling

Our streamlined paper scrap recycling services ensure that paper-based waste is transformed into valuable resources, contributing to a more eco-friendly and circular economy. Our Experienced team is always ready to help our customers

Contact Info

Our Office

Building 834 Road 323 Block 903 East Riffa Kindom of Bahrain

Mail Us

info@shouhdymetals.com

Phone Number

+97317001668

0 +
Client Satisfaction
0 +
Industries Served
0 +
Years Of Experience
0 +
Professional Workers

Basic Plans

$125/month

* Tax & other services included.

Business Plans

$225/month

* Tax & other services included.
Pricing Plans

Choose The Best Pricing Plans For You

Lorem ipsum dolor sit amet, consect adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullam

100% Guarantee

Lorem ipsum dolor sit amet consectetur.

24/7 Support

Lorem ipsum dolor sit amet consectetur.

What They Say

We Are Trusted Over 20+ Countries Worldwide

Our 10 years of industry experience have honed our processes, enabling us to deliver streamlined disposal services tailored to meet your specific needs.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua Ut enim ad minim veniam

    Gerald Flynn
    Gerald Flynn

    Entrepreneur

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua Ut enim ad minim veniam

      Evelyn Bush
      Evelyn Bush

      CEO Bciaga

      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua Ut enim ad minim veniam

        Carlo Conrad
        Carlo Conrad

        Businessman

        Our Blog

        Latest Blog & Articles

        No Content Available
        Lorem ipsum dolor sit amet, consectet adipiscing elit, sed do eiusmod

        Work Hours

        Lorem ipsum dolor sit amet, consectectur adipiscing elit, sed do eiusmod tempor

        Copyright reserved to Shouhdy Metals@ 2024

        Copyright © 2022. All rights reserved.
        Scroll to Top