HEX
Server: nginx/1.18.0
System: Linux vcwordpress 5.15.0-174-generic #184-Ubuntu SMP Fri Mar 13 18:41:50 UTC 2026 x86_64
User: root (0)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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';