204 lines
6.1 KiB
PHP
204 lines
6.1 KiB
PHP
<?php
|
|
/**
|
|
* File: UserExperience_Preload_Requests_Extension.php
|
|
*
|
|
* Controls the Preload Requests feature.
|
|
*
|
|
* @since 2.5.1
|
|
*
|
|
* @package W3TC
|
|
*/
|
|
|
|
namespace W3TC;
|
|
|
|
/**
|
|
* UserExperience Preload Requests Extension.
|
|
*
|
|
* @since 2.5.1
|
|
*/
|
|
class UserExperience_Preload_Requests_Extension {
|
|
/**
|
|
* Config.
|
|
*
|
|
* @var object
|
|
*/
|
|
private $config;
|
|
|
|
/**
|
|
* User Experience DNS Prefetc constructor.
|
|
*
|
|
* @since 2.5.1
|
|
*/
|
|
public function __construct() {
|
|
$this->config = Dispatcher::config();
|
|
}
|
|
|
|
/**
|
|
* Runs User Experience DNS Prefetc feature.
|
|
*
|
|
* @since 2.5.1
|
|
*
|
|
* @return void
|
|
*/
|
|
public function run() {
|
|
if ( ! Util_Environment::is_w3tc_pro( $this->config ) ) {
|
|
$this->config->set_extension_active_frontend( 'user-experience-preload-requests', false );
|
|
return;
|
|
}
|
|
|
|
// Applies logic to display page cache flush notice if Preload Requests settings are altered and saved.
|
|
add_filter( 'w3tc_save_options', array( $this, 'w3tc_save_options' ) );
|
|
|
|
// Renders the Preload Reqeusts settings metabox on the User Expereince advanced setting page.
|
|
add_action( 'w3tc_userexperience_page', array( $this, 'w3tc_userexperience_page' ) );
|
|
|
|
// This filter is documented in Generic_AdminActions_Default.php under the read_request method.
|
|
add_filter( 'w3tc_config_key_descriptor', array( $this, 'w3tc_config_key_descriptor' ), 10, 2 );
|
|
|
|
// Applies dns-prefetch, preconnect, and preload headers.
|
|
add_action( 'wp_head', array( $this, 'w3tc_preload_requests_headers' ) );
|
|
add_action( 'admin_head', array( $this, 'w3tc_preload_requests_headers' ) );
|
|
}
|
|
|
|
/**
|
|
* Renders the user experience Preload Requests settings page.
|
|
*
|
|
* @since 2.5.1
|
|
*
|
|
* @return void
|
|
*/
|
|
public function w3tc_userexperience_page() {
|
|
include __DIR__ . '/UserExperience_Preload_Requests_Page_View.php';
|
|
}
|
|
|
|
/**
|
|
* Specify config key typing for fields that need it.
|
|
*
|
|
* @since 2.5.1
|
|
*
|
|
* @param mixed $descriptor Descriptor.
|
|
* @param mixed $key Compound key array.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function w3tc_config_key_descriptor( $descriptor, $key ) {
|
|
if (
|
|
is_array( $key )
|
|
&& in_array(
|
|
implode( '.', $key ),
|
|
array(
|
|
'user-experience-preload-requests.dns-prefetch',
|
|
'user-experience-preload-requests.preconnect',
|
|
'user-experience-preload-requests.preload-css',
|
|
'user-experience-preload-requests.preload-js',
|
|
'user-experience-preload-requests.preload-fonts',
|
|
'user-experience-preload-requests.preload-images',
|
|
'user-experience-preload-requests.preload-videos',
|
|
'user-experience-preload-requests.preload-audio',
|
|
'user-experience-preload-requests.preload-documents',
|
|
)
|
|
)
|
|
) {
|
|
$descriptor = array( 'type' => 'array' );
|
|
}
|
|
|
|
return $descriptor;
|
|
}
|
|
|
|
/**
|
|
* Performs actions on save.
|
|
*
|
|
* @since 2.5.1
|
|
*
|
|
* @param array $data Array of save data.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function w3tc_save_options( $data ) {
|
|
$new_config = $data['new_config'];
|
|
$old_config = $data['old_config'];
|
|
|
|
$new_includes = $new_config->get_array( array( 'user-experience-preload-requests', 'includes' ) );
|
|
$old_includes = $old_config->get_array( array( 'user-experience-preload-requests', 'includes' ) );
|
|
|
|
if ( $new_includes !== $old_includes && $this->config->get_boolean( 'pgcache.enabled' ) ) {
|
|
$state = Dispatcher::config_state();
|
|
$state->set( 'common.show_note.flush_posts_needed', true );
|
|
$state->save();
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Applies the Preload Requests headers for wp_head and admin_head.
|
|
*
|
|
* @since 2.5.1
|
|
*
|
|
* @return void
|
|
*/
|
|
public function w3tc_preload_requests_headers() {
|
|
// Preconnect hints should be printed first so they take priority. If not supported then dns-prefetch will be the fallback.
|
|
$preconnect = $this->config->get_array( array( 'user-experience-preload-requests', 'preconnect' ) );
|
|
foreach ( $preconnect as $url ) {
|
|
echo '<link rel="preconnect" href="' . esc_url( $url ) . '" crossorigin>';
|
|
}
|
|
|
|
$dns_prefetch = $this->config->get_array( array( 'user-experience-preload-requests', 'dns-prefetch' ) );
|
|
foreach ( $dns_prefetch as $url ) {
|
|
echo '<link rel="dns-prefetch" href="' . esc_url( $url ) . '">';
|
|
}
|
|
|
|
$preload_css = $this->config->get_array( array( 'user-experience-preload-requests', 'preload-css' ) );
|
|
foreach ( $preload_css as $url ) {
|
|
echo '<link rel="preload" href="' . esc_url( $url ) . '" as="style">';
|
|
}
|
|
|
|
$preload_js = $this->config->get_array( array( 'user-experience-preload-requests', 'preload-js' ) );
|
|
foreach ( $preload_js as $url ) {
|
|
echo '<link rel="preload" href="' . esc_url( $url ) . '" as="script">';
|
|
}
|
|
|
|
$preload_fonts = $this->config->get_array( array( 'user-experience-preload-requests', 'preload-fonts' ) );
|
|
foreach ( $preload_fonts as $url ) {
|
|
echo '<link rel="preload" href="' . esc_url( $url ) . '" as="font" type="font/woff2">';
|
|
}
|
|
|
|
$preload_images = $this->config->get_array( array( 'user-experience-preload-requests', 'preload-images' ) );
|
|
foreach ( $preload_images as $url ) {
|
|
echo '<link rel="preload" href="' . esc_url( $url ) . '" as="image">';
|
|
}
|
|
|
|
$preload_videos = $this->config->get_array( array( 'user-experience-preload-requests', 'preload-videos' ) );
|
|
foreach ( $preload_videos as $url ) {
|
|
echo '<link rel="preload" href="' . esc_url( $url ) . '" as="video">';
|
|
}
|
|
|
|
$preload_audio = $this->config->get_array( array( 'user-experience-preload-requests', 'preload-audio' ) );
|
|
foreach ( $preload_audio as $url ) {
|
|
echo '<link rel="preload" href="' . esc_url( $url ) . '" as="audio">';
|
|
}
|
|
|
|
$preload_documents = $this->config->get_array( array( 'user-experience-preload-requests', 'preload-documents' ) );
|
|
foreach ( $preload_documents as $url ) {
|
|
echo '<link rel="preload" href="' . esc_url( $url ) . '" as="document">';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets the enabled status of the extension.
|
|
*
|
|
* @since 2.5.1
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function is_enabled() {
|
|
$config = Dispatcher::config();
|
|
$extensions_active = $config->get_array( 'extensions.active' );
|
|
return Util_Environment::is_w3tc_pro( $config ) && array_key_exists( 'user-experience-preload-requests', $extensions_active );
|
|
}
|
|
}
|
|
|
|
$o = new UserExperience_Preload_Requests_Extension();
|
|
$o->run();
|