File: /var/www/e-tdr.com/e-tdr/wp-content/themes/e-tdr/functions.php
<?php
/**
* e-TDR functions and definitions
*
* @link https://developer.wordpress.org/themes/basics/theme-functions/
*
* @package e-TDR
*/
if (! defined('_S_VERSION')) {
// Replace the version number of the theme on each release.
define('_S_VERSION', '1.0.0');
}
/**
* Sets up theme defaults and registers support for various WordPress features.
*
* Note that this function is hooked into the after_setup_theme hook, which
* runs before the init hook. The init hook is too late for some features, such
* as indicating support for post thumbnails.
*/
function e_tdr_setup()
{
/*
* Make theme available for translation.
* Translations can be filed in the /languages/ directory.
* If you're building a theme based on e-TDR, use a find and replace
* to change 'e-tdr' to the name of your theme in all the template files.
*/
load_theme_textdomain('e-tdr', get_template_directory() . '/languages');
// Add default posts and comments RSS feed links to head.
add_theme_support('automatic-feed-links');
/*
* Let WordPress manage the document title.
* By adding theme support, we declare that this theme does not use a
* hard-coded <title> 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');
// This theme uses wp_nav_menu() in one location.
register_nav_menus(
array(
'menu-1' => esc_html__('Primary', 'e-tdr'),
)
);
/*
* 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',
'style',
'script',
)
);
// Set up the WordPress core custom background feature.
add_theme_support(
'custom-background',
apply_filters(
'e_tdr_custom_background_args',
array(
'default-color' => 'ffffff',
'default-image' => '',
)
)
);
// Add theme support for selective refresh for widgets.
add_theme_support('customize-selective-refresh-widgets');
/**
* Add support for core custom logo.
*
* @link https://codex.wordpress.org/Theme_Logo
*/
add_theme_support(
'custom-logo',
array(
'height' => 250,
'width' => 250,
'flex-width' => true,
'flex-height' => true,
)
);
}
add_action('after_setup_theme', 'e_tdr_setup');
/**
* Set the content width in pixels, based on the theme's design and stylesheet.
*
* Priority 0 to make it available to lower priority callbacks.
*
* @global int $content_width
*/
function e_tdr_content_width()
{
$GLOBALS['content_width'] = apply_filters('e_tdr_content_width', 640);
}
add_action('after_setup_theme', 'e_tdr_content_width', 0);
/**
* Register widget area.
*
* @link https://developer.wordpress.org/themes/functionality/sidebars/#registering-a-sidebar
*/
function e_tdr_widgets_init()
{
register_sidebar(
array(
'name' => esc_html__('Sidebar', 'e-tdr'),
'id' => 'sidebar-1',
'description' => esc_html__('Add widgets here.', 'e-tdr'),
'before_widget' => '<section id="%1$s" class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
)
);
}
add_action('widgets_init', 'e_tdr_widgets_init');
/**
* Enqueue scripts and styles.
*/
function e_tdr_scripts()
{
// Enqueue Google Fonts
// wp_enqueue_style('urbanist-font', 'https://fonts.googleapis.com/css2?family=Urbanist:wght@300;400;500;600;700;800;900&display=swap', array(), null);
// Enqueue Bootstrap & Icons
wp_enqueue_style('bootstrap', 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css', array(), '5.3.3');
wp_enqueue_style('bootstrap-icons', 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css', array(), '1.11.3');
wp_enqueue_style('e-tdr-style', get_stylesheet_uri(), array(), _S_VERSION);
wp_style_add_data('e-tdr-style', 'rtl', 'replace');
wp_enqueue_script('e-tdr-navigation', get_template_directory_uri() . '/js/navigation.js', array(), _S_VERSION, true);
if (is_singular() && comments_open() && get_option('thread_comments')) {
wp_enqueue_script('comment-reply');
}
}
add_action('wp_enqueue_scripts', 'e_tdr_scripts');
/**
* Selectively defer non-critical CSS to reduce render-blocking.
* Bootstrap Icons and the large custom stylesheet are deferred since
* they don't affect above-fold layout. Bootstrap grid is kept blocking.
*/
function e_tdr_defer_css($tag, $handle, $src)
{
$deferred_handles = array(
'bootstrap', // Safe: critical grid is inlined in header.php
'bootstrap-icons', // Safe: icons are never above-fold layout-critical
'e-tdr-style', // Safe: major layout styles are inlined in header.php
'etdr-custom-style', // Safe: full custom styles load after critical CSS
);
if (in_array($handle, $deferred_handles)) {
return '<link rel="stylesheet" href="' . esc_attr($src) . '" media="print" onload="this.media=\'all\';">' .
'<noscript><link rel="stylesheet" href="' . esc_attr($src) . '"></noscript>';
}
return $tag;
}
add_filter('style_loader_tag', 'e_tdr_defer_css', 10, 3);
/**
* Filter the enqueued scripts to add 'defer' attribute.
*/
function e_tdr_defer_scripts($tag, $handle, $src)
{
if (is_admin()) return $tag;
// List of scripts that should NOT be deferred (due to inline dependencies)
$exclude_handles = array(
'jquery',
'jquery-core',
'jquery-migrate',
'wp-i18n',
'wp-hooks',
'wp-polyfill'
);
if (in_array($handle, $exclude_handles)) return $tag;
return str_replace(' src', ' defer="defer" src', $tag);
}
add_filter('script_loader_tag', 'e_tdr_defer_scripts', 10, 3);
/**
* Remove Gutenberg Block Library CSS from loading on the frontend.
*/
function e_tdr_remove_wp_block_library_css()
{
wp_dequeue_style('wp-block-library');
wp_dequeue_style('wp-block-library-theme');
wp_dequeue_style('wc-block-style'); // WooCommerce blocks if present
}
add_action('wp_enqueue_scripts', 'e_tdr_remove_wp_block_library_css', 100);
/**
* Disable WordPress Emojis (reduces head overhead and critical path).
*/
function e_tdr_disable_emojis()
{
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
add_filter('tiny_mce_plugins', 'e_tdr_disable_emojis_tinymce');
add_filter('wp_resource_hints', 'e_tdr_disable_emojis_remove_dns_prefetch', 10, 2);
}
add_action('init', 'e_tdr_disable_emojis');
function e_tdr_disable_emojis_tinymce($plugins)
{
if (is_array($plugins)) {
return array_diff($plugins, array('wpemoji'));
}
return array();
}
function e_tdr_disable_emojis_remove_dns_prefetch($urls, $relation_type)
{
if ('dns-prefetch' === $relation_type) {
$emoji_svg_url = apply_filters('emoji_svg_url', 'https://s.w.org/images/core/emoji/14.0.0/svg/');
$urls = array_diff($urls, array($emoji_svg_url));
}
return $urls;
}
/**
* Implement the Custom Header feature.
*/
require get_template_directory() . '/inc/custom-header.php';
/**
* Custom template tags for this theme.
*/
require get_template_directory() . '/inc/template-tags.php';
/**
* Functions which enhance the theme by hooking into WordPress.
*/
require get_template_directory() . '/inc/template-functions.php';
/**
* Customizer additions.
*/
require get_template_directory() . '/inc/customizer.php';
/**
* Load Jetpack compatibility file.
*/
if (defined('JETPACK__VERSION')) {
require get_template_directory() . '/inc/jetpack.php';
}
/**
* Theme Customisations additions.
*/
require get_template_directory() . '/inc/theme-customisations.php';
/**
* Schema Markup (JSON-LD Structured Data).
*/
require get_template_directory() . '/inc/schema-markup.php';