Make WordPress Core


Ignore:
Timestamp:
12/28/2019 09:18:03 PM (5 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.