Make WordPress Core


Ignore:
Timestamp:
12/28/2019 09:18:03 PM (7 years ago)
Author:
SergeyBiryukov
Message:

Bootstrap/Load: Make handling the /favicon.ico requests more flexible.

Previously, wp_favicon_request() was introduced in [13205] to avoid a performance hit of serving a full 404 page on every favicon request.

While working as intended, that implementation did not provide a way for theme or plugin authors to manage the behavior of favicon requests.

This changeset implements the following logic (only applied if WordPress is installed in the root directory):

  • If there is a Site Icon set in Customizer, redirect /favicon.ico requests to that icon.
  • Otherwise, use the WordPress logo as a default icon.
  • If a physical /favicon.ico file exists, do nothing, let the server handle the request.

Handling /favicon.ico is now more consistent with handling /robots.txt requests.

New functions and hooks:

  • Introduce is_favicon() conditional tag to complement is_robots().
  • Introduce do_favicon action to complement do_robots and use it in template loader.
  • Introduce do_favicon() function, hooked to the above action by default, to complement do_robots().
  • Introduce do_faviconico action to complement do_robotstxt, for plugins to override the default behavior.
  • Mark wp_favicon_request() as deprecated in favor of do_favicon().

Props jonoaldersonwp, birgire, joostdevalk, mukesh27, SergeyBiryukov.
Fixes #47398.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-query.php

    r46661 r47018  
    390390         */
    391391        public $is_robots = false;
     392
     393        /**
     394         * Signifies whether the current query is for the favicon.ico file.
     395         *
     396         * @since 5.4.0
     397         * @var bool
     398         */
     399        public $is_favicon = false;
    392400
    393401        /**
    … …  
    479487                $this->is_singular          = false;
    480488                $this->is_robots            = false;
     489                $this->is_favicon           = false;
    481490                $this->is_posts_page        = false;
    482491                $this->is_post_type_archive = false;
    … …  
    745754                if ( ! empty( $qv['robots'] ) ) {
    746755                        $this->is_robots = true;
     756                } elseif ( ! empty( $qv['favicon'] ) ) {
     757                        $this->is_favicon = true;
    747758                }
    748759
    … …  
    958969                }
    959970
    960                 if ( ! ( $this->is_singular || $this->is_archive || $this->is_search || $this->is_feed || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots ) ) {
     971                if ( ! ( $this->is_singular || $this->is_archive || $this->is_search || $this->is_feed
     972                                || ( defined( 'REST_REQUEST' ) && REST_REQUEST )
     973                                || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots || $this->is_favicon ) ) {
    961974                        $this->is_home = true;
    962975                }
    … …  
    40084021
    40094022        /**
    4010          * Is the query for the robots file?
     4023         * Is the query for the robots.txt file?
    40114024         *
    40124025         * @since 3.1.0
    … …  
    40164029        public function is_robots() {
    40174030                return (bool) $this->is_robots;
     4031        }
     4032
     4033        /**
     4034         * Is the query for the favicon.ico file?
     4035         *
     4036         * @since 5.4.0
     4037         *
     4038         * @return bool
     4039         */
     4040        public function is_favicon() {
     4041                return (bool) $this->is_favicon;
    40184042        }
    40194043
Note: See TracChangeset for help on using the changeset viewer.