add wp-rocket
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
namespace WP_Rocket\Engine\Preload\Links;
|
||||
|
||||
use WP_Rocket\Admin\Options_Data;
|
||||
use WP_Rocket\Event_Management\Subscriber_Interface;
|
||||
|
||||
class AdminSubscriber implements Subscriber_Interface {
|
||||
/**
|
||||
* Options Data instance
|
||||
*
|
||||
* @var Options_Data
|
||||
*/
|
||||
private $options;
|
||||
|
||||
/**
|
||||
* Instantiate the class.
|
||||
*
|
||||
* @param Options_Data $options Options Data instance.
|
||||
*/
|
||||
public function __construct( Options_Data $options ) {
|
||||
$this->options = $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Events this subscriber wants to listen to.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function get_subscribed_events() {
|
||||
return [
|
||||
'rocket_first_install_options' => 'add_option',
|
||||
'rocket_plugins_to_deactivate' => 'add_incompatible_plugins',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the option key & value to the WP Rocket options array
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @param array $options WP Rocket options array.
|
||||
* @return array
|
||||
*/
|
||||
public function add_option( $options ) {
|
||||
$options = (array) $options;
|
||||
|
||||
$options['preload_links'] = 0;
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds plugins incompatible with preload links to our notice.
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @param array $plugins Array of incompatible plugins.
|
||||
* @return array
|
||||
*/
|
||||
public function add_incompatible_plugins( $plugins ) {
|
||||
if ( ! (bool) $this->options->get( 'preload_links', 0 ) ) {
|
||||
return $plugins;
|
||||
}
|
||||
|
||||
$plugins['flying-pages'] = 'flying-pages/flying-pages.php';
|
||||
$plugins['instant-page'] = 'instant-page/instantpage.php';
|
||||
$plugins['quicklink'] = 'quicklink/quicklink.php';
|
||||
|
||||
return $plugins;
|
||||
}
|
||||
}
|
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
namespace WP_Rocket\Engine\Preload\Links;
|
||||
|
||||
use WP_Rocket\Engine\Container\ServiceProvider\AbstractServiceProvider;
|
||||
|
||||
/**
|
||||
* Service provider for WP Rocket preload links.
|
||||
*/
|
||||
class ServiceProvider extends AbstractServiceProvider {
|
||||
/**
|
||||
* The provides array is a way to let the container
|
||||
* know that a service is provided by this service
|
||||
* provider. Every service that is registered via
|
||||
* this service provider must have an alias added
|
||||
* to this array or it will be ignored.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $provides = [
|
||||
'preload_links_admin_subscriber',
|
||||
'preload_links_subscriber',
|
||||
];
|
||||
|
||||
/**
|
||||
* Registers the subscribers in the container
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register() {
|
||||
$options = $this->getContainer()->get( 'options' );
|
||||
|
||||
$this->getContainer()->share( 'preload_links_admin_subscriber', 'WP_Rocket\Engine\Preload\Links\AdminSubscriber' )
|
||||
->withArgument( $options );
|
||||
$this->getContainer()->share( 'preload_links_subscriber', 'WP_Rocket\Engine\Preload\Links\Subscriber' )
|
||||
->withArgument( $options )
|
||||
->withArgument( rocket_direct_filesystem() );
|
||||
}
|
||||
}
|
@@ -0,0 +1,209 @@
|
||||
<?php
|
||||
|
||||
namespace WP_Rocket\Engine\Preload\Links;
|
||||
|
||||
use WP_Filesystem_Direct;
|
||||
use WP_Rocket\Admin\Options_Data;
|
||||
use WP_Rocket\Event_Management\Subscriber_Interface;
|
||||
|
||||
class Subscriber implements Subscriber_Interface {
|
||||
/**
|
||||
* Options Data instance
|
||||
*
|
||||
* @var Options_Data
|
||||
*/
|
||||
private $options;
|
||||
|
||||
/**
|
||||
* WP_Filesystem_Direct instance.
|
||||
*
|
||||
* @var WP_Filesystem_Direct
|
||||
*/
|
||||
private $filesystem;
|
||||
|
||||
/**
|
||||
* Script enqueued status.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $is_enqueued = false;
|
||||
|
||||
/**
|
||||
* Instantiate the class.
|
||||
*
|
||||
* @param Options_Data $options Options Data instance.
|
||||
* @param WP_Filesystem_Direct $filesystem The Filesystem object.
|
||||
*/
|
||||
public function __construct( Options_Data $options, $filesystem ) {
|
||||
$this->options = $options;
|
||||
$this->filesystem = $filesystem;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of events that this subscriber wants to listen to.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function get_subscribed_events() {
|
||||
return [
|
||||
'wp_enqueue_scripts' => 'add_preload_script',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the inline script to the footer when the option is enabled
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function add_preload_script() {
|
||||
if ( $this->is_enqueued ) {
|
||||
return;
|
||||
}
|
||||
if ( ! (bool) $this->options->get( 'preload_links', 0 ) || rocket_bypass() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$js_assets_path = rocket_get_constant( 'WP_ROCKET_PATH' ) . 'assets/js/';
|
||||
|
||||
if ( ! wp_script_is( 'rocket-browser-checker' ) ) {
|
||||
$checker_filename = rocket_get_constant( 'SCRIPT_DEBUG' ) ? 'browser-checker.js' : 'browser-checker.min.js';
|
||||
|
||||
// phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NoExplicitVersion
|
||||
wp_register_script(
|
||||
'rocket-browser-checker',
|
||||
'',
|
||||
[],
|
||||
'',
|
||||
true
|
||||
);
|
||||
wp_enqueue_script( 'rocket-browser-checker' );
|
||||
wp_add_inline_script(
|
||||
'rocket-browser-checker',
|
||||
$this->filesystem->get_contents( "{$js_assets_path}{$checker_filename}" )
|
||||
);
|
||||
}
|
||||
|
||||
$preload_filename = rocket_get_constant( 'SCRIPT_DEBUG' ) ? 'preload-links.js' : 'preload-links.min.js';
|
||||
|
||||
// Register handle with no src to add the inline script after.
|
||||
// phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NoExplicitVersion
|
||||
wp_register_script(
|
||||
'rocket-preload-links',
|
||||
'',
|
||||
[
|
||||
'rocket-browser-checker',
|
||||
],
|
||||
'',
|
||||
true
|
||||
);
|
||||
wp_enqueue_script( 'rocket-preload-links' );
|
||||
wp_add_inline_script(
|
||||
'rocket-preload-links',
|
||||
$this->filesystem->get_contents( "{$js_assets_path}{$preload_filename}" )
|
||||
);
|
||||
wp_localize_script(
|
||||
'rocket-preload-links',
|
||||
'RocketPreloadLinksConfig',
|
||||
$this->get_preload_links_config()
|
||||
);
|
||||
|
||||
$this->is_enqueued = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Preload Links script configuration parameters.
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @return string[] Preload Links script configuration parameters.
|
||||
*/
|
||||
private function get_preload_links_config() {
|
||||
$use_trailing_slash = $this->use_trailing_slash();
|
||||
$images_ext = 'jpg|jpeg|gif|png|tiff|bmp|webp|avif';
|
||||
|
||||
$config = [
|
||||
'excludeUris' => $this->get_uris_to_exclude( $use_trailing_slash ),
|
||||
'usesTrailingSlash' => $use_trailing_slash,
|
||||
'imageExt' => $images_ext,
|
||||
'fileExt' => $images_ext . '|php|pdf|html|htm',
|
||||
'siteUrl' => home_url(),
|
||||
'onHoverDelay' => 100, // milliseconds. -1 disables the "on hover" feature.
|
||||
'rateThrottle' => 3, // on hover: limits the number of links preloaded per second.
|
||||
];
|
||||
|
||||
/**
|
||||
* Preload Links script configuration parameters.
|
||||
*
|
||||
* This array of parameters are passed as RocketPreloadLinksConfig object and used by the
|
||||
* `preload-links.min.js` script to configure the behavior of the Preload Links feature.
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @param string[] $config Preload Links script configuration parameters.
|
||||
*/
|
||||
$filtered_config = apply_filters( 'rocket_preload_links_config', $config );
|
||||
|
||||
if ( ! is_array( $filtered_config ) ) {
|
||||
return $config;
|
||||
}
|
||||
|
||||
return array_merge( $config, $filtered_config );
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the URIs to exclude.
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @param bool $use_trailing_slash When true, uses trailing slash.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function get_uris_to_exclude( $use_trailing_slash ) {
|
||||
$site_url = site_url();
|
||||
$uris = get_rocket_cache_reject_uri();
|
||||
$uris = str_replace( [ '/(.*)|', '/(.*)/|' ], '/|', $uris );
|
||||
|
||||
foreach ( [ '/wp-admin', '/logout' ] as $uri ) {
|
||||
$uris .= "|{$uri}";
|
||||
if ( $use_trailing_slash ) {
|
||||
$uris .= '/';
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( [ wp_logout_url(), wp_login_url() ] as $uri ) {
|
||||
if ( strpos( $uri, '?' ) !== false ) {
|
||||
continue;
|
||||
}
|
||||
$uris .= '|' . str_replace( $site_url, '', $uri );
|
||||
}
|
||||
|
||||
return $uris;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given URL has a trailing slash.
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @param string $url URL to check.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function has_trailing_slash( $url ) {
|
||||
return substr( $url, -1 ) === '/';
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates if the site uses a trailing slash in the permalink structure.
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @return bool when true, uses `/`; else, no.
|
||||
*/
|
||||
private function use_trailing_slash() {
|
||||
return $this->has_trailing_slash( get_permalink() );
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user