tag in the document head, and expect WordPress to * provide it for us. */ add_theme_support( 'title-tag' ); /* * Enable support for Post Thumbnails on posts and pages. * * @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/ */ add_theme_support( 'post-thumbnails' ); set_post_thumbnail_size( 1140, 855 ); if ( ! isset( $content_width ) ) { $content_width = 1140; } //image sizes - cropped add_image_size( 'exs-square', 800, 800, true ); add_image_size( 'exs-square-half', 800, 400, true ); //Post formats add_theme_support( 'post-formats', array( 'video', 'audio', 'image', 'gallery', 'quote' ) ); /* * Switch default core markup for search form, comment form, and comments * to output valid HTML5. */ add_theme_support( 'html5', array( 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption', 'script', 'style' ) ); /** * Add support for core custom logo. * * @link https://codex.wordpress.org/Theme_Logo */ $exs_custom_header_logo = array( 'height' => 60, 'width' => 150, 'flex-width' => true, 'flex-height' => true, ); add_theme_support( 'custom-logo', $exs_custom_header_logo ); //Background image for header and title sections $exs_custom_header_args = array( 'width' => 1920, 'height' => 800, 'header-text' => false, ); add_theme_support( 'custom-header', $exs_custom_header_args ); add_theme_support( 'custom-background' ); // Add theme support for selective refresh for widgets. add_theme_support( 'customize-selective-refresh-widgets' ); // Gutenberg block editor add_theme_support( 'editor-color-palette', array( // colorLight // colorFont // colorFontMuted // colorBackground // colorBorder // colorDark // colorDarkMuted // colorMain // colorMain2 array( 'name' => esc_html__( 'Light', 'exs' ), 'slug' => 'light', 'color' => 'var(--colorLight)', ), array( 'name' => esc_html__( 'Font', 'exs' ), 'slug' => 'font', 'color' => 'var(--colorFont)', ), array( 'name' => esc_html__( 'Muted', 'exs' ), 'slug' => 'font-muted', 'color' => 'var(--colorFontMuted)', ), array( 'name' => esc_html__( 'Background', 'exs' ), 'slug' => 'background', 'color' => 'var(--colorBackground)', ), array( 'name' => esc_html__( 'Border', 'exs' ), 'slug' => 'border', 'color' => 'var(--colorBorder)', ), array( 'name' => esc_html__( 'Dark', 'exs' ), 'slug' => 'dark', 'color' => 'var(--colorDark)', ), array( 'name' => esc_html__( 'Dark Muted', 'exs' ), 'slug' => 'dark-muted', 'color' => 'var(--colorDarkMuted)', ), array( 'name' => esc_html__( 'Accent', 'exs' ), 'slug' => 'main', 'color' => 'var(--colorMain)', ), array( 'name' => esc_html__( 'Accent 2', 'exs' ), 'slug' => 'main-2', 'color' => 'var(--colorMain2)', ), array( 'name' => esc_html__( 'Accent 3', 'exs' ), 'slug' => 'main-3', 'color' => 'var(--colorMain3)', ), array( 'name' => esc_html__( 'Accent 4', 'exs' ), 'slug' => 'main-4', 'color' => 'var(--colorMain4)', ), ) ); //custom font sizes add_theme_support( 'editor-font-sizes', array( array( /* translators: Font size name */ 'name' => esc_html__( 'Normal', 'exs' ), 'size' => 18, 'slug' => 'normal', ), array( /* translators: Font size name */ 'name' => esc_html__( 'Medium', 'exs' ), 'size' => '1.35em', 'slug' => 'medium', ), array( /* translators: Font size name */ 'name' => esc_html__( 'Large', 'exs' ), 'size' => '1.45em', 'slug' => 'large', ), array( /* translators: Font size name */ 'name' => esc_html__( 'Huge', 'exs' ), 'size' => '1.65em', 'slug' => 'huge', ), array( /* translators: Font size name */ 'name' => esc_html__( 'XL', 'exs' ), 'size' => 'calc(1em + 1.5vmin)', 'slug' => 'xl', ), array( /* translators: Font size name */ 'name' => esc_html__( 'XXL', 'exs' ), 'size' => 'calc(2em + 2vmin)', 'slug' => 'xxl', ), array( /* translators: Font size name */ 'name' => esc_html__( 'XXXL', 'exs' ), 'size' => 'calc(2.25em + 5vmin)', 'slug' => 'xxxl', ), array( /* translators: Font size name */ 'name' => esc_html__( 'XXXXL', 'exs' ), 'size' => 'calc(2.25em + 7vmin)', 'slug' => 'xxxxl', ), ) ); // Add support for Block Styles. // add_theme_support( 'wp-block-styles' ); // 'wp-block-library-theme' - loads in the backend even if not defined here // Add support for full and wide align images. add_theme_support( 'align-wide' ); // Enqueue editor styles. add_theme_support( 'editor-styles' ); $min = get_theme_mod( 'assets_min' ) ? 'min/' : ''; add_editor_style( 'assets/css/' . $min . 'editor-style.css' ); // Add support for responsive embedded content. // It will add JS file to the footer // add_theme_support( 'responsive-embeds' ); //Yoast breadcrumbs support add_theme_support( 'yoast-seo-breadcrumbs' ); //WooCommerce add_theme_support( 'woocommerce' ); add_theme_support( 'wc-product-gallery-lightbox' ); add_theme_support( 'wc-product-gallery-slider' ); //remove block editor for widgets screen for WP >= 5.8 if ( ! empty( get_theme_mod( 'remove_widgets_block_editor' ) ) ) { remove_theme_support( 'widgets-block-editor' ); } //remove default SVG for duotones WP >= 5.8 if ( ! empty( get_theme_mod( 'remove_wp_default_duotone_svg' ) ) ) { //remove_action( 'wp_enqueue_scripts', 'wp_enqueue_global_styles' ); remove_action( 'wp_body_open', 'wp_global_styles_render_svg_filters' ); } //remove default STYLE tags for .wp-container- auto class WP >= 5.8 if ( empty( get_theme_mod( 'enable_wp_default_footer_container_styles', '1' ) ) ) { remove_action( 'render_block', 'wp_render_layout_support_flag', 10, 2 ); } //starter content if ( is_customize_preview() && get_option( 'fresh_site' ) ) { require EXS_THEME_PATH . '/inc/starter-content.php'; add_theme_support( 'starter-content', exs_get_starter_content() ); } // This theme uses wp_nav_menu() in four locations. register_nav_menus( array( 'topline' => esc_html__( 'Topline Menu', 'exs' ), 'primary' => esc_html__( 'Main Menu', 'exs' ), 'copyright' => esc_html__( 'Copyright Menu', 'exs' ), 'bottom' => esc_html__( 'Bottom Fixed Menu', 'exs' ), ) ); } endif; add_action( 'after_setup_theme', 'exs_setup' ); if ( ! function_exists( 'exs_widgets_init' ) ) : /** * Register widget area. * * @link https://developer.wordpress.org/themes/functionality/sidebars/#registering-a-sidebar */ function exs_widgets_init() { $registered_sidebars = array(); register_sidebar( array( 'name' => esc_html__( 'Main', 'exs' ), 'id' => 'sidebar-1', 'description' => esc_html__( 'Add widgets here to appear in your sidebar.', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); $registered_sidebars['sidebar-1'] = esc_html__( 'Main', 'exs' ); register_sidebar( array( 'name' => esc_html__( 'Footer', 'exs' ), 'id' => 'sidebar-2', 'description' => esc_html__( 'Add widgets here to appear in your footer.', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Footer Top Section', 'exs' ), 'id' => 'sidebar-3', 'description' => esc_html__( 'Add widgets here to appear in your top footer section.', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Header Bottom Section', 'exs' ), 'id' => 'sidebar-header-bottom', 'description' => esc_html__( 'Add widgets here to appear in your header bottom section.', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Main Opposite', 'exs' ), 'id' => 'sidebar-1-opposite', 'description' => esc_html__( 'Add widgets here to appear in your opposite sidebar. Will be visible only if the Main sidebar is shown and contains widgets', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); $registered_sidebars['sidebar-1-opposite'] = esc_html__( 'Main Opposite', 'exs' ); register_sidebar( array( 'name' => esc_html__( 'Home page above columns', 'exs' ), 'id' => 'sidebar-home-before-columns', 'description' => esc_html__( 'These widgets will appear on "Home" page above columns.', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Home page above content', 'exs' ), 'id' => 'sidebar-home-before-content', 'description' => esc_html__( 'These widgets will appear on "Home" page above content', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Home page main sidebar', 'exs' ), 'id' => 'sidebar-home-main', 'description' => esc_html__( 'These widgets will appear on "Home" page in main sidebar.', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Home page below content', 'exs' ), 'id' => 'sidebar-home-after-content', 'description' => esc_html__( 'These widgets will appear on "Home" page below main content', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Home page below columns', 'exs' ), 'id' => 'sidebar-home-after-columns', 'description' => esc_html__( 'These widgets will appear on "Home" page below columns', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Header Top Line (Layout 5)', 'exs' ), 'id' => 'sidebar-topline', 'description' => esc_html__( 'Fullwidth widget area. These widgets will appear above header if Header Top line layout #5 is selected in your Customizer. Good for ads banners', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Side Fixed Sidebar', 'exs' ), 'id' => 'sidebar-side-fixed', 'description' => esc_html__( 'Fixed Side Sidebar', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); //WooCommerce sidebar if ( class_exists( 'WooCommerce' ) ) { register_sidebar( array( 'name' => esc_html__( 'Shop', 'exs' ), 'id' => 'shop', 'description' => esc_html__( 'This sidebar will appear on shop pages', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); } //EDD single download sidebar if ( class_exists( 'Easy_Digital_Downloads' ) ) { register_sidebar( array( 'name' => esc_html__( 'Download Sidebar', 'exs' ), 'id' => 'sidebar-download', /* translators: %s: 'Download' post type label name. */ 'description' => sprintf( __( 'Add widgets here to appear in your %s sidebar.', 'exs' ), edd_get_label_singular() ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Downloads Sidebar', 'exs' ), 'id' => 'sidebar-downloads', /* translators: %s: 'Download' post type label name. */ 'description' => sprintf( __( 'Add widgets here to appear in your %s sidebar.', 'exs' ), edd_get_label_plural() ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); } //bbPress sidebar if ( class_exists( 'bbPress' ) ) { register_sidebar( array( 'name' => esc_html__( 'bbPress Theme Sidebar', 'exs' ), 'id' => 'sidebar-bbpress', 'description' => esc_html__( 'This sidebar will appear on the bbPress pages', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); } //BuddyPress sidebar if ( class_exists( 'BuddyPress' ) ) { register_sidebar( array( 'name' => esc_html__( 'BuddyPress Theme Global Sidebar', 'exs' ), 'id' => 'sidebar-buddypress', 'description' => esc_html__( 'This sidebar will appear on the BuddyPress pages', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); } //WP Job Manager sidebar if ( class_exists( 'WP_Job_Manager' ) ) { register_sidebar( array( 'name' => esc_html__( 'WP Job Manager Theme Global Sidebar', 'exs' ), 'id' => 'sidebar-wpjm', 'description' => esc_html__( 'This sidebar will appear on the WP Job Manager pages', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); } //Events sidebar if ( class_exists( 'Tribe__Events__Main' ) ) { register_sidebar( array( 'name' => esc_html__( 'Events Theme Global Sidebar', 'exs' ), 'id' => 'sidebar-events', 'description' => esc_html__( 'This sidebar will appear on the Events calendar pages', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); } //LearnPress if ( class_exists( 'LearnPress' ) ) { register_sidebar( array( 'name' => esc_html__( 'LearnPress Courses', 'exs' ), 'id' => 'sidebar-courses', 'description' => esc_html__( 'This sidebar will appear on the LearnPress courses archive pages', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'LearnPress Single Course', 'exs' ), 'id' => 'sidebar-course', 'description' => esc_html__( 'This sidebar will appear on the LearnPress single course page', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); } //Custom sidebars //since 2.3.0 $custom_sidebars = exs_option( 'custom_sidebars_csv' ); if ( ! empty( $custom_sidebars ) ) { $custom_sidebars_array = explode( ',', $custom_sidebars ); if ( is_array( $custom_sidebars_array ) ) { foreach ( $custom_sidebars_array as $sidebar_name ) : $dynamic_sidebar_name = trim( strip_tags( $sidebar_name ) ); $dynamic_sidebar_id = sanitize_title( $sidebar_name ); register_sidebar( array( 'name' => $dynamic_sidebar_name, 'id' => $dynamic_sidebar_id, 'description' => esc_html__( 'This sidebar is dynamically created from the Customizer options in the ExS Extended Sidebars panel and can be set for your Custom post types there', 'exs' ), 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ) ); $registered_sidebars[ $dynamic_sidebar_id ] = $dynamic_sidebar_name; endforeach; $exs = ExS::instance(); $exs->set( 'sidebars', $registered_sidebars ); } } } endif; add_action( 'widgets_init', 'exs_widgets_init' ); //copy parent theme mods on first child theme activation if ( ! function_exists( 'exs_switch_theme_update_mods' ) ) : function exs_switch_theme_update_mods( $exs_new_theme ) { if ( is_child_theme() ) { //only for default child themes if ( 'exs-child' === get_stylesheet() || 'exs-child-pro' === get_stylesheet() ) { $exs_new_theme_mods = get_theme_mods(); //if is child theme and current theme mods are empty - set theme mods from parent theme if ( empty( $exs_new_theme_mods ) || 1 === count( $exs_new_theme_mods ) || 2 === count( $exs_new_theme_mods ) ) { $exs_mods = get_option( 'theme_mods_' . get_template() ); if ( ! empty( $exs_mods ) ) { foreach ( (array) $exs_mods as $exs_mod => $exs_mod_value ) { // if ( 'sidebars_widgets' !== $exs_mod ) set_theme_mod( $exs_mod, $exs_mod_value ); } } } } } } endif; add_action( 'after_switch_theme', 'exs_switch_theme_update_mods' ); if ( EXS_WP ) { require_once EXS_THEME_PATH . '/inc/wp/admin.php'; } if ( EXS_TM ) { require_once EXS_THEME_PATH . '/inc/tm/admin.php'; } //theme page if ( ! function_exists( 'exs_theme_options_page_menu_item' ) ) : function exs_theme_options_page_menu_item() { add_theme_page( esc_html__( 'ExS Theme', 'exs' ), esc_html__( 'ExS Theme', 'exs' ), 'edit_theme_options', 'exs-theme', 'exs_theme_options_page' ); } endif; add_action( 'admin_menu', 'exs_theme_options_page_menu_item' ); //ajax form processing if( ! function_exists( 'exs_process_ajax_form' ) ) : function exs_process_ajax_form() { // check the nonce if ( ! check_ajax_referer( 'exs_nonce', 'nonce', false ) ) { wp_send_json_error(); } $post_delimiter = '|||'; //post variables $sender_name = isset( $_POST['name'] ) ? explode( $post_delimiter, sanitize_text_field( $_POST['name'] ) ): array( '' ); $sender_email = isset( $_POST['email'] ) ? explode( $post_delimiter, sanitize_email( $_POST['email'] ) ) : array( '' ); $mailchimp = isset( $_POST['mailchimp'] ) ? explode( $post_delimiter, sanitize_email( $_POST['mailchimp'] ) ) : array(); if ( empty( $mailchimp ) ) : //messages $message_success = exs_option( 'contact_message_success' ); $message_fail = exs_option( 'contact_message_fail' ); $subject = get_option( 'blogname' ); $message = isset( $_POST['message'] ) ? explode( $post_delimiter, sanitize_text_field( $_POST['message'] ) ) : array( '' ); $subject = isset( $_POST['subject'] ) ? explode( $post_delimiter, sanitize_text_field( $_POST['subject'] ) ) : array( '', $subject ); $headers = array(); if ( ! empty( $sender_email ) ) { $from_name = ( ! empty( $sender_name[0] ) && ! empty( $sender_name[1] ) ) ? $sender_name[1] : ''; if ( ! empty( $from_name ) ) { $headers[] = 'From: ' . $from_name . ' <' . $sender_email[ count( $sender_email ) - 1 ] . '>'; } else { $headers[] = 'From: ' . $sender_email[ count( $sender_email ) - 1 ]; } } $message_text = $message[ count( $message ) - 1 ]; $subject_text = $subject[ count( $subject ) - 1 ]; //adding info to message body $message_meta = ''; if ( ! empty( $sender_name[0] ) ) { $message_meta .= join( ': ', $sender_name ) . "\r\n"; } if ( ! empty( $sender_email[0] ) ) { $message_meta .= join( ': ', $sender_email ) . "\r\n"; } if ( ! empty( $subject[0] ) ) { $message_meta .= join( ': ', $subject ) . "\r\n"; } //adding another CUSTOM contact form fields that added by user to email message body foreach ( $_POST as $key => $value ) { //checking for standard fields if ( $key === 'nonce' || $key === 'action' || $key === 'name' || $key === 'message' || $key === 'subject' || $key === 'email' ) { continue; } //adding key-value pare to email message body $message_meta .= sanitize_text_field( ucfirst( $key ) ) . ': ' . sanitize_text_field( $value ) . "\r\n"; } $result = wp_mail( get_option( 'admin_email' ), $subject_text, $message_meta . "\r\n" . $message_text, $headers ); if ( $result ) { wp_send_json_success( array( 'message' => $message_success ) ); } else { wp_send_json_error( array( 'message' => $message_fail ) ); } else: //this is mailchimp //messages $api_key = exs_option( 'mailchimp_api_key' ); $api_audience_id = exs_option( 'mailchimp_audience_id' ); $message_fail = exs_option( 'mailchimp_message_fail' ); $message_success = exs_option( 'mailchimp_message_success' ); $message_already = exs_option( 'mailchimp_message_already' ); if ( //checking email empty( $mailchimp[0] ) || empty( $mailchimp[1] ) || filter_var( $mailchimp[1] , FILTER_VALIDATE_EMAIL) === false || //checking api empty( $api_key ) || //checking audience ID (list ID) empty( $api_audience_id ) ) { wp_send_json_error( array( 'message' => $message_fail ) ); } // MailChimp API URL $memberID = md5( strtolower( $mailchimp[1] ) ); $dataCenter = substr( $api_key,strpos( $api_key,'-' ) + 1 ); $url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $api_audience_id . '/members/' . $memberID; // subscriber name $last_name = ''; $first_name = ''; if ( ! empty( $sender_name ) && ! empty( $sender_name[1] ) ) { $arr = explode(' ', $sender_name[1] ); if ( count( $arr ) > 1 ) { $last_name = array_pop( $arr ); } $first_name = join( ' ', $arr ); } // request body $json = json_encode( array( 'email_address' => $mailchimp[1], 'status' => 'subscribed', 'merge_fields' => [ 'FNAME' => esc_html( $first_name ), 'LNAME' => esc_html( $last_name ), ] ) ); $args = array( 'method' => 'PUT', 'httpversion' => '1.1', 'sslverify' => false, 'headers' => array( 'Authorization' => 'Bearer ' . $api_key, 'Content-Type' => 'application/json', ), 'body' => $json, ); $answer = wp_remote_post( $url, $args ); $httpCode = wp_remote_retrieve_response_code( $answer ); // store the status message based on response code if ($httpCode == 200) { wp_send_json_success( array( 'message' => $message_success ) ); } else { switch ($httpCode) { case 214: wp_send_json_error( array( 'message' => $message_already ) ); case 0: default: wp_send_json_error( array( 'message' => $message_fail ) ); } return false; } endif; //mailchimp } endif; add_action( 'wp_ajax_nopriv_exs_ajax_form', 'exs_process_ajax_form' ); add_action( 'wp_ajax_exs_ajax_form', 'exs_process_ajax_form' );