[wp-trac] [WordPress Trac] #63111: short-circuit WordPress processing for requests of missing files

WordPress Trac noreply at wordpress.org
Sun Mar 16 06:33:24 UTC 2025


#63111: short-circuit WordPress processing for requests of missing files
----------------------------+--------------------------------------------
 Reporter:  rpayne7264      |      Owner:  (none)
     Type:  enhancement     |     Status:  new
 Priority:  normal          |  Milestone:  Awaiting Review
Component:  Bootstrap/Load  |    Version:  trunk
 Severity:  major           |   Keywords:  changes-requested has-dev-note
  Focuses:  performance     |
----------------------------+--------------------------------------------
 Any broken link in the HTML output by WordPress, or within a referenced
 CSS file, triggers WordPress to run again—completely.

 If the missing file is an image used multiple times (such as a CSS
 background or sprite), WordPress will execute an additional process for
 each instance. This means a single missing image could cause WordPress to
 run multiple extra times on every page load, significantly impacting
 performance.

 This issue was first reported 14 years ago (#17246), yet it remains
 unresolved. That is unacceptable.

 It should not be the responsibility of plugin developers to patch this
 issue. Nor should site owners be forced to implement workarounds in their
 .htaccess files.

 This is a core issue, and it should be addressed at the core level.

 To help resolve this, I have implemented a new function that detects
 whether an incoming request is for a missing file before WordPress loads
 unnecessarily. I have also modified the template-loader.php file to
 utilize the new function and mitigate redundant executions. Perhaps there
 is a better place for the check to be placed.

 The new function is akin to already-existing functions like wp_doing_ajax
 , wp_is_serving_rest_request and wp_is_json_request.

 Steps to demonstrate the problem:

 1) Set up a WordPress site and ensure debug logging is enabled.  My wp-
 config.php file has the following entries:

 {{{
 @ini_set('log_errors', 1);
 @ini_set('error_log', dirname(__FILE__) . '/php-error.log'); // Set custom
 log file
 define( 'WP_DEBUG', true );
 define( 'WP_DEBUG_DISPLAY', false );
 define( 'WP_DEBUG_LOG', true );
 }}}

 2) Add the following PHP code to the top of wp-includes/functions.php

 {{{
 function wp_is_file_request($extension = '') {
     $is_file_request = false;

     if (empty($extension)) {
         $url = $_SERVER['REQUEST_URI'] ?? '';
         $path = parse_url($url, PHP_URL_PATH) ?? '';
         $extension = pathinfo($path, PATHINFO_EXTENSION);
     }

     if (!empty($extension)) {
         $ext = strtolower($extension);
         $mimes = apply_filters('wp_is_file_request_mime_types',
 wp_get_mime_types());
         $ext_list = [];

         foreach ($mimes as $key => $value) {
             $ext_list = array_merge($ext_list, explode('|', $key));
         }

         $is_file_request = in_array($ext, $ext_list, true);
     }

     return apply_filters('wp_is_file_request', $is_file_request);
 }
 }}}

 3) Add the following code to the top of wp-includes/template-loader.php:

 {{{
 error_log('Loading WordPress: before call to wp_is_file_request');

 // Check if the request is for a file
 if (wp_is_file_request()) {
     // Capture the requested URL or path
     $url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] :
 'Unknown URL';

     // Log that the file request returned true and the requested file
     error_log('Loading WordPress: call to wp_is_file_request returned
 true. Requested file: ' . $url);
 }

 error_log('Loading WordPress: after call to wp_is_file_request');
 }}}

 4) Open your browser and visit any page or post on your WordPress site.

 5) Check if '''wp-content/debug.log''' exists. Open it and see if any
 entries appear in it. You should see something similar to the following:


 {{{
 [16-Mar-2025 04:28:53 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:28:53 UTC] Loading WordPress: after call to
 wp_is_file_request
 }}}

 This indicates that WordPress ran only one time.

 6) Open the page in the editor and add an img tag the points to a non-
 existent image file.

 {{{
 <img src="https://google.com/wp-admin/images/none.jpg" alt="" />
 }}}

 7) Clear debug.log of all entries and save.

 8) View the page you just edited in the browser.

 9) Open debug.log and see if any entries appear in it. You should see
 something similar to the following:

 {{{
 [16-Mar-2025 04:27:23 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:27:23 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:27:24 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:27:24 UTC] Loading WordPress: call to wp_is_file_request
 returned true. Requested file: /wp-admin/none.jpg
 [16-Mar-2025 04:27:24 UTC] Loading WordPress: after call to
 wp_is_file_request
 }}}

 This indicates WordPress ran twice.

 10) Add the following PHP code the theme's functions.php file:

 {{{
 function enqueue_non_existent_files() {
     // Enqueue a non-existent script file
     wp_enqueue_script('non-existent-js', get_template_directory_uri() .
 '/js/non-existent.js', array(), null, true);

     // Enqueue a non-existent CSS file
     wp_enqueue_style('non-existent-css', get_template_directory_uri() .
 '/css/non-existent.css');
 }
 add_action('wp_enqueue_scripts', 'enqueue_non_existent_files');
 }}}

 11) Clear debug.log of all entries and save.

 12) Re-load the page you previously edited in the browser.

 13) Open debug.log and see if any entries appear in it. You should see
 something similar to the following:

 {{{
 [16-Mar-2025 04:24:04 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:04 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: call to wp_is_file_request
 returned true. Requested file: /wp-content/themes/astra/css/non-
 existent.css?ver=1552ecb53cbdcbcbf181a26569fa7272
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: call to wp_is_file_request
 returned true. Requested file: /wp-content/themes/astra/js/non-existent.js
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: call to wp_is_file_request
 returned true. Requested file: /wp-admin/none.jpg
 [16-Mar-2025 04:24:05 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:24:07 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:07 UTC] Loading WordPress: call to wp_is_file_request
 returned true. Requested file: /robots.txt
 [16-Mar-2025 04:24:07 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:24:08 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:08 UTC] Loading WordPress: call to wp_is_file_request
 returned true. Requested file: /robots.txt
 [16-Mar-2025 04:24:08 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:24:09 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:09 UTC] Loading WordPress: after call to
 wp_is_file_request
 [16-Mar-2025 04:24:10 UTC] Loading WordPress: before call to
 wp_is_file_request
 [16-Mar-2025 04:24:10 UTC] Loading WordPress: after call to
 wp_is_file_request
 }}}

 This indicates WordPress ran eight times.  As you can see, the attempt to
 load either the non-existent js file or the non-existent css file causes
 the WP robots.txt virtual file functionality to fail, as well.

 Here is an example of using the 'wp_is_file_request_mime_types' filter:

 {{{#!php
 <?php
 // Make an exception for audio files
 add_filter('wp_is_file_request_mime_types', 'rdp_mime_types_filter');
 function custom_mime_types_filter($mimes){
     unset($mimes['mp3|m4a|m4b']);
     unset($mimes['ra|ram']);
     unset($mimes['wav']);
     unset($mimes['ogg|oga']);
     unset($mimes['mid|midi']);
     unset($mimes['wma']);
     unset($mimes['wax']);
     unset($mimes['mka']);
     return $mimes;
 }
 }}}

 Here is an example of using the 'wp_is_file_request' filter:

 {{{#!php
 <?php
 function custom_wp_is_file_request_filter($is_file_request) {
     // Get the requested URL path
     $url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';

     // Extract the requested file name
     $path = parse_url($url, PHP_URL_PATH);
     $filename = basename($path);

     // If the requested file is 'my-special-message.wav', allow WordPress
 to process it
     if ($filename === 'my-special-message.wav') {
         return false; // Override and allow full WordPress processing
     }

     // Keep the original decision for all other files
     return $is_file_request;
 }

 add_filter('wp_is_file_request', 'custom_wp_is_file_request_filter');
 }}}



 Here's an example of checking if the request is for a wav file:

 {{{#!php
 <?php
 $isWAV = wp_is_file_request('wav');
 }}}

 Here's an example when used to prevent unnecessary execution of plug-in
 code; shouldn't be necessary if the wp_is_file_request() check is
 implemented during WordPress Bootstrap/Load, but just in case.:

 {{{#!php
 <?php
 class RDP_PLUGIN {
         private static $_instance = NULL;

         private function __construct() {
             // prevent running code unnecessarily
             if(wp_is_file_request())return;

             // run the plugin
             add_action('wp_loaded', [$this, 'run'],1);
         }//__construct


         public static function get_instance(){
             if (NULL === self::$_instance) self::$_instance = new self();
             return self::$_instance;
         } //get_instance

                 ...  other plugin code ...

 }

 $RDP_PLUGIN = RDP_PLUGIN::get_instance();
 }}}

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/63111>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list