2022-02-18 19:09:35 +07:00

167 lines
3.4 KiB
PHP

<?php
namespace WP_Rocket\Engine\Preload;
/**
* Abstract preload class
*
* @since 3.2
* @author Remy Perona
*/
abstract class AbstractPreload {
/**
* Suffix used to identify "mobile items" to preload.
*
* @since 3.5
* @author Grégory Viguier
*
* @var string
*/
const MOBILE_SUFFIX = '##wpm-mobile##';
/**
* Background Process instance
*
* @since 3.2
* @var FullProcess
*/
protected $preload_process;
/**
* Cache processing that use get_rocket_cache_query_string().
*
* @since 3.5
* @author Grégory Viguier
*
* @var array
*/
protected $cache_query_strings;
/**
* Constructor
*
* @since 3.2
* @author Remy Perona
*
* @param FullProcess $preload_process Background Process instance.
*/
public function __construct( FullProcess $preload_process ) {
$this->preload_process = $preload_process;
}
/**
* Cancels any preload process running
*
* @since 3.2
* @author Remy Perona
*
* @return void
*/
public function cancel_preload() {
delete_transient( $this->get_running_transient_name() );
$this->preload_process->cancel_process();
}
/**
* Checks if a process is already running
*
* @since 3.2.1.1
* @author Remy Perona
*
* @return boolean
*/
public function is_process_running() {
return $this->preload_process->is_process_running();
}
/**
* Tell if mobile preload is enabled.
*
* @since 3.5
* @author Grégory Viguier
*
* @return bool
*/
public function is_mobile_preload_enabled() {
return $this->preload_process->is_mobile_preload_enabled();
}
/**
* Get the prefix to prepend to the user agent used for preload to make a HTTP request detected as a mobile device.
*
* @since 3.5.0.2
* @author Grégory Viguier
*
* @return string
*/
public function get_mobile_user_agent_prefix() {
return $this->preload_process->get_mobile_user_agent_prefix();
}
/**
* Get the number of preloaded URLs.
*
* @since 3.5
* @author Grégory Viguier
*
* @return int|bool The number of preloaded URLs. False if the process is not running.
*/
public function get_number_of_preloaded_items() {
$nbr = get_transient( $this->get_running_transient_name() );
if ( false === $nbr ) {
return false;
}
return absint( $nbr );
}
/**
* Create a unique identifier for a given URL.
* This is used for the "mobile items"
*
* @since 3.5
* @author Grégory Viguier
*
* @param string $url A URL.
* @return string
*/
protected function get_url_identifier( $url ) {
if ( ! isset( $this->cache_query_strings ) ) {
$this->cache_query_strings = array_fill_keys( get_rocket_cache_query_string(), '' );
ksort( $this->cache_query_strings );
}
$path = (array) wp_parse_url( $url );
$query = isset( $path['query'] ) ? $path['query'] : '';
$path = isset( $path['path'] ) ? $path['path'] : '';
$path = strtolower( trailingslashit( $path ) );
if ( ! $this->cache_query_strings ) {
return $path;
}
parse_str( $query, $query_array );
$query_array = array_intersect_key( $query_array, $this->cache_query_strings );
$query_array = array_merge( $this->cache_query_strings, $query_array );
return $path . '?' . http_build_query( $query_array );
}
/**
* Get the name of the transient that stores the number of preloaded URLs.
*
* @since 3.5
* @author Grégory Viguier
*
* @return string
*/
protected function get_running_transient_name() {
return sprintf( 'rocket_%s_preload_running', static::PRELOAD_ID );
}
}