$php_self ) );
$document_root = realpath( $document_root );
return $document_root;
}
}
if ( ! empty( $_SERVER['PATH_TRANSLATED'] ) && ! empty( $_SERVER['PHP_SELF'] ) ) {
$document_root = substr(
self::normalize_path( htmlspecialchars( stripslashes( $_SERVER['PATH_TRANSLATED'] ) ) ), // phpcs:ignore
0,
-strlen( self::normalize_path( htmlspecialchars( stripslashes( $_SERVER['PHP_SELF'] ) ) ) ) // phpcs:ignore
);
} elseif ( ! empty( $_SERVER['DOCUMENT_ROOT'] ) ) {
$document_root = self::normalize_path( htmlspecialchars( stripslashes( $_SERVER['DOCUMENT_ROOT'] ) ) ); // phpcs:ignore
} else {
$document_root = ABSPATH;
}
$document_root = realpath( $document_root );
return $document_root;
}
/**
* Returns absolute path to blog install dir
*
* Example:
*
* DOCUMENT_ROOT=/var/www/vhosts/domain.com
* install dir=/var/www/vhosts/domain.com/site/blog
* return /var/www/vhosts/domain.com/site/blog
*
* No trailing slash!
*
* @static
*
* @return string
*/
public static function site_root() {
$site_root = ABSPATH;
$site_root = realpath( $site_root );
$site_root = self::normalize_path( $site_root );
return $site_root;
}
/**
* Returns blog path.
*
* Example:
*
* siteurl=http://domain.com/site/blog
* return /site/blog/
*
* With trailing slash!
*
* @static
*
* @return string
*/
public static function site_url_uri() {
return self::url_to_uri( site_url() ) . '/';
}
/**
* Returns home domain.
*
* @static
*
* @return string
*/
public static function home_url_host() {
$home_url = get_home_url();
$parse_url = @parse_url( $home_url ); // phpcs:ignore
if ( $parse_url && isset( $parse_url['host'] ) ) {
return $parse_url['host'];
}
return self::host();
}
/**
* Returns home path.
*
* Example:
*
* home=http://domain.com/site/
* siteurl=http://domain.com/site/blog
* return /site/
*
* With trailing slash!
*
* @static
*
* @return string
*/
public static function home_url_uri() {
return self::url_to_uri( get_home_url() ) . '/';
}
/**
* Network home URL.
*
* @static
*
* @return string
*/
public static function network_home_url_uri() {
$uri = network_home_url( '', 'relative' );
/*
* There is a bug in WP where network_home_url can return
* a non-relative URI even though scheme is set to relative.
*/
if ( self::is_url( $uri ) ) {
$uri = parse_url( $uri, PHP_URL_PATH );
}
if ( empty( $uri ) ) {
return '/';
}
return $uri;
}
/**
* Returns server hostname with port.
*
* @static
*
* @return string
*/
public static function host_port() {
static $host = null;
if ( null === $host ) {
if ( ! empty( $_SERVER['HTTP_HOST'] ) ) {
// HTTP_HOST sometimes is not set causing warning.
$host = htmlspecialchars( stripslashes( $_SERVER['HTTP_HOST'] ) ); // phpcs:ignore
} else {
$host = '';
}
}
return $host;
}
/**
* Host.
*
* @static
*
* @return string
*/
public static function host() {
$host_port = self::host_port();
$pos = strpos( $host_port, ':' );
if ( $pos === false ) {
return $host_port;
}
return substr( $host_port, 0, $pos );
}
/**
* Returns WP config file path.
*
* @static
*
* @return string
*/
public static function wp_config_path() {
$search = array(
ABSPATH . 'wp-config.php',
dirname( ABSPATH ) . DIRECTORY_SEPARATOR . 'wp-config.php',
);
foreach ( $search as $path ) {
if ( file_exists( $path ) ) {
return $path;
}
}
return false;
}
/**
* Parses path.
*
* @static
*
* @param string $path Path.
* @return mixed
*/
public static function parse_path( $path ) {
$path = str_replace(
array(
'%BLOG_ID%',
'%POST_ID%',
'%BLOG_ID%',
'%HOST%',
),
array(
( isset( $GLOBALS['blog_id'] ) && is_numeric( $GLOBALS['blog_id'] ) ? (int) $GLOBALS['blog_id'] : 0 ),
( isset( $GLOBALS['post_id'] ) && is_numeric( $GLOBALS['post_id'] ) ?
(int) $GLOBALS['post_id'] : 0 ),
self::blog_id(),
self::host(),
),
$path
);
return $path;
}
/**
* Normalizes file name.
*
* Relative to site root!
*
* @static
*
* @param string $file File path.
* @return string
*/
public static function normalize_file( $file ) {
if ( self::is_url( $file ) ) {
if ( strstr( $file, '?' ) === false ) {
$home_url_regexp = '~' . self::home_url_regexp() . '~i';
$file = preg_replace( $home_url_regexp, '', $file );
}
}
if ( ! self::is_url( $file ) ) {
$file = self::normalize_path( $file );
$file = str_replace( self::site_root(), '', $file );
$file = ltrim( $file, '/' );
}
return $file;
}
/**
* Normalizes file name for minify.
*
* Relative to document root!
*
* @static
*
* @param string $file
* @return string
*/
public static function normalize_file_minify( $file ) {
if ( self::is_url( $file ) ) {
if ( strstr( $file, '?' ) === false ) {
$domain_url_regexp = '~' . self::home_domain_root_url_regexp() . '~i';
$file = preg_replace( $domain_url_regexp, '', $file );
}
}
if ( ! self::is_url( $file ) ) {
$file = self::normalize_path( $file );
$file = str_replace( self::document_root(), '', $file );
$file = ltrim( $file, '/' );
}
return $file;
}
/**
* Normalizes file name for minify.
* Relative to document root!
*
* @static
*
* @param string $file File path.
* @return string
*/
public static function url_to_docroot_filename( $url ) {
$data = array(
'home_url' => get_home_url(),
'url' => $url,
);
$data = apply_filters( 'w3tc_url_to_docroot_filename', $data );
$home_url = $data['home_url'];
$normalized_url = $data['url'];
$normalized_url = self::remove_query_all( $normalized_url );
// Cut protocol.
$normalized_url = preg_replace( '~^http(s)?://~', '//', $normalized_url );
$home_url = preg_replace( '~^http(s)?://~', '//', $home_url );
if ( substr( $normalized_url, 0, strlen( $home_url ) ) !== $home_url ) {
// Not a home url, return unchanged since cant be converted to filename.
return null;
}
$path_relative_to_home = str_replace( $home_url, '', $normalized_url );
$home = set_url_scheme( get_option( 'home' ), 'http' );
$siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' );
$home_path = rtrim( Util_Environment::site_path(), '/' );
// Adjust home_path if site is not is home.
if ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) ) {
// $siteurl - $home/
$wp_path_rel_to_home = rtrim( str_ireplace( $home, '', $siteurl ), '/' );
if ( substr( $home_path, -strlen( $wp_path_rel_to_home ) ) ==
$wp_path_rel_to_home ) {
$home_path = substr( $home_path, 0, -strlen( $wp_path_rel_to_home ) );
}
}
// Common encoded characters.
$path_relative_to_home = str_replace( '%20', ' ', $path_relative_to_home );
$full_filename = $home_path . DIRECTORY_SEPARATOR .
trim( $path_relative_to_home, DIRECTORY_SEPARATOR );
$docroot = self::document_root();
if ( substr( $full_filename, 0, strlen( $docroot ) ) == $docroot ) {
$docroot_filename = substr( $full_filename, strlen( $docroot ) );
} else {
$docroot_filename = $path_relative_to_home;
}
/*
* Sometimes urls (coming from other plugins/themes)
* contain multiple "/" like "my-folder//myfile.js" which
* fails to recognize by filesystem, while url is accessible.
*/
$docroot_filename = str_replace( '//', DIRECTORY_SEPARATOR, $docroot_filename );
return ltrim( $docroot_filename, DIRECTORY_SEPARATOR );
}
/**
* Document root to full filename.
*
* @static
*
* @param string $docroot_filename Document filename.
* @return strin
*/
public static function docroot_to_full_filename( $docroot_filename ) {
return rtrim( Util_Environment::document_root(), DIRECTORY_SEPARATOR ) .
DIRECTORY_SEPARATOR . $docroot_filename;
}
/**
* Removes WP query string from URL.
*
* @static
*/
public static function remove_query( $url ) {
$url = preg_replace( '~(\?|&|&|&)+ver=[a-z0-9-_\.]+~i', '', $url );
return $url;
}
/**
* Removes all query strings from url.
*
* @static
*
* @param string $url URL.
* @return string
*/
public static function remove_query_all( $url ) {
$pos = strpos( $url, '?' );
if ( $pos === false ) {
return $url;
}
return substr( $url, 0, $pos );
}
/**
* Converts win path to unix.
*
* @static
*
* @param string $path Path.
* @return string
*/
public static function normalize_path( $path ) {
$path = preg_replace( '~[/\\\]+~', '/', $path );
$path = rtrim( $path, '/' );
return $path;
}
/**
* Returns real path of given path.
*
* @static
*
* @param string $path Path.
* @return string
*/
public static function realpath( $path ) {
$path = self::normalize_path( $path );
$parts = explode( '/', $path );
$absolutes = array();
foreach ( $parts as $part ) {
if ( '.' == $part ) {
continue;
}
if ( '..' == $part ) {
array_pop( $absolutes );
} else {
$absolutes[] = $part;
}
}
return implode( '/', $absolutes );
}
/**
* Returns real path of given path.
*
* @static
*
* @param string $path Path.
* @return string
*/
public static function path_remove_dots( $path ) {
$parts = explode( '/', $path );
$absolutes = array();
foreach ( $parts as $part ) {
if ( '.' == $part ) {
continue;
}
if ( '..' == $part ) {
array_pop( $absolutes );
} else {
$absolutes[] = $part;
}
}
return implode( '/', $absolutes );
}
/**
* Returns full URL from relative one.
*
* @static
*
* @param string $relative_url Relative URL.
* @return string
*/
public static function url_relative_to_full( $relative_url ) {
$relative_url = self::path_remove_dots( $relative_url );
if ( version_compare( PHP_VERSION, '5.4.7' ) < 0 ) {
if ( substr( $relative_url, 0, 2 ) === '//' ) {
$relative_url = ( self::is_https() ? 'https' : 'http' ) . ':' . $relative_url;
}
}
$rel = parse_url( $relative_url );
// it's full url already
if ( isset( $rel['scheme'] ) || isset( $rel['host'] ) )
return $relative_url;
if ( !isset( $rel['host'] ) ) {
$home_parsed = parse_url( get_home_url() );
$rel['host'] = $home_parsed['host'];
if ( isset( $home_parsed['port'] ) ) {
$rel['port'] = $home_parsed['port'];
}
}
$scheme = isset( $rel['scheme'] ) ? $rel['scheme'] . '://' : '//';
$host = isset( $rel['host'] ) ? $rel['host'] : '';
$port = isset( $rel['port'] ) ? ':' . $rel['port'] : '';
$path = isset( $rel['path'] ) ? $rel['path'] : '';
$query = isset( $rel['query'] ) ? '?' . $rel['query'] : '';
return "$scheme$host$port$path$query";
}
/**
* Redirects to URL.
*
* @static
*
* @param string $url URL.
* @param array $params Parameters.
*/
public static function redirect( $url = '', $params = array() ) {
$url = self::url_format( $url, $params );
if ( function_exists( 'do_action' ) ) {
do_action( 'w3tc_redirect' );
}
@header( 'Location: ' . $url ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
exit();
}
/**
* Redirects to URL.
*
* @static
*
* @param string $url URL.
* @param array $params Parameters.
* @param bool $safe_redirect Safe redirect or not.
*/
public static function safe_redirect_temp( $url = '', $params = array(), $safe_redirect = false ) {
$url = self::url_format( $url, $params );
if ( function_exists( 'do_action' ) ) {
do_action( 'w3tc_redirect' );
}
$status_code = 302;
$protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ?
htmlspecialchars( stripslashes( $_SERVER['SERVER_PROTOCOL'] ) ) : ''; // phpcs:ignore
if ( 'HTTP/1.1' === $protocol ) {
$status_code = 307;
}
$text = get_status_header_desc( $status_code );
if ( ! empty( $text ) ) {
$status_header = "$protocol $status_code $text";
@header( $status_header, true, $status_code );
}
add_action(
'wp_safe_redirect_fallback',
array( '\W3TC\Util_Environment', 'wp_safe_redirect_fallback' )
);
@header( 'Cache-Control: no-cache' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
wp_safe_redirect( $url, $status_code );
exit();
}
/**
* Fallback for wp_sfe_redirect().
*
* @static
*
* @param string $url URL.
* @return string
*/
public static function wp_safe_redirect_fallback( $url ) {
return home_url( '?w3tc_repeat=invalid' );
}
/**
* Detects post ID.
*
* @static
*
* @return int
*/
public static function detect_post_id() {
global $posts, $comment_post_ID, $post_ID; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
$p_val = Util_Request::get_integer( 'p' );
if ( $post_ID ) {
return $post_ID;
} elseif ( $comment_post_ID ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
return $comment_post_ID; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
} elseif ( ( is_single() || is_page() ) && is_array( $posts ) && isset( $posts[0]->ID ) ) {
return $posts[0]->ID;
} elseif ( isset( $posts->ID ) ) {
return $posts->ID;
} elseif ( ! empty( $p_val ) ) {
return $p_val;
}
return 0;
}
/**
* Get W3TC instance id.
*
* @static
*
* @return int
*/
public static function instance_id() {
if ( defined( 'W3TC_INSTANCE_ID' ) ) {
return W3TC_INSTANCE_ID;
}
static $instance_id;
if ( ! isset( $instance_id ) ) {
$config = Dispatcher::config();
$instance_id = $config->get_integer( 'common.instance_id', 0 );
}
return $instance_id;
}
/**
* Get W3TC edition.
*
* @static
*
* @param Config $config Config.
* @return string
*/
public static function w3tc_edition( $config = null ) {
if ( self::is_w3tc_pro( $config ) && self::is_w3tc_pro_dev() ) {
return 'pro development';
}
if ( self::is_w3tc_pro( $config ) ) {
return 'pro';
}
return 'community';
}
/**
* Is W3TC Pro.
*
* @static
*
* @param Config $config Config.
* @return bool
*/
public static function is_w3tc_pro( $config = null ) {
if ( defined( 'W3TC_PRO' ) && W3TC_PRO ) {
return true;
}
if ( defined( 'W3TC_ENTERPRISE' ) && W3TC_ENTERPRISE ) {
return true;
}
if ( is_object( $config ) ) {
$plugin_type = $config->get_string( 'plugin.type' );
if ( 'pro' === $plugin_type || 'pro_dev' === $plugin_type ) {
return true;
}
}
return false;
}
/**
* Enable Pro Dev mode support.
*
* @static
*
* @return bool
*/
public static function is_w3tc_pro_dev() {
return defined( 'W3TC_PRO_DEV_MODE' ) && W3TC_PRO_DEV_MODE;
}
/**
* Quotes regular expression string.
*
* @static
*
* @param string $string String.
* @param string $delimiter Delimeter.
* @return string
*/
public static function preg_quote( $string, $delimiter = '~' ) {
$string = preg_quote( $string, $delimiter );
$string = strtr(
$string,
array( ' ' => '\ ' )
);
return $string;
}
/**
* Returns true if zlib output compression is enabled otherwise false.
*
* @static
*
* @return bool
*/
public static function is_zlib_enabled() {
return self::to_boolean( ini_get( 'zlib.output_compression' ) );
}
/**
* Recursive strips slahes from the var.
*
* @static
*
* @param mixed $var Value.
* @return mixed
*/
public static function stripslashes( $var ) {
if ( is_string( $var ) ) {
return stripslashes( $var );
} elseif ( is_array( $var ) ) {
$var = array_map( array( '\W3TC\Util_Environment', 'stripslashes' ), $var );
}
return $var;
}
/**
* Checks if post should be flushed or not. Returns true if it should not be flushed.
*
* @static
*
* @param object $post Post object.
* @param string $module Which cache module to check against (pgcache, varnish, dbcache or objectcache).
* @param Config $config Config.
* @return bool
*/
public static function is_flushable_post( $post, $module, $config ) {
if ( is_numeric( $post ) ) {
$post = get_post( $post );
}
$post_status = array( 'publish' );
/**
* Dont flush when we have post "attachment"
* its child of the post and is flushed always when post is published, while not changed in fact.
*/
$post_type = array( 'revision', 'attachment' );
switch ( $module ) {
case 'pgcache':
case 'varnish':
case 'posts': // Means html content of post pages.
if ( ! $config->get_boolean( 'pgcache.reject.logged' ) ) {
$post_status[] = 'private';
}
break;
case 'dbcache':
if ( ! $config->get_boolean( 'dbcache.reject.logged' ) ) {
$post_status[] = 'private';
}
break;
}
$flushable = is_object( $post ) && ! in_array( $post->post_type, $post_type, true ) && in_array( $post->post_status, $post_status, true );
return apply_filters( 'w3tc_flushable_post', $flushable, $post, $module );
}
/**
* Checks if post belongs to a custom post type.
*
* @since 2.1.7
* @static
*
* @param object $post Post object.
* @return bool
*/
public static function is_custom_post_type( $post ) {
$post_type = get_post_type_object( $post->post_type );
// post type not found belongs to default post type(s).
if ( empty( $post_type ) ) {
return false;
}
// check if custom.
if ( false === $post_type->_builtin ) {
return true;
}
return false;
}
/**
* Converts value to boolean.
*
* @static
*
* @param mixed $value Value.
* @return bool
*/
public static function to_boolean( $value ) {
if ( is_string( $value ) ) {
switch ( strtolower( $value ) ) {
case '+':
case '1':
case 'y':
case 'on':
case 'yes':
case 'true':
case 'enabled':
return true;
case '-':
case '0':
case 'n':
case 'no':
case 'off':
case 'false':
case 'disabled':
return false;
}
}
return (boolean) $value;
}
/**
* Returns the apache, nginx version.
*
* @static
*
* @return string
*/
public static function get_server_version() {
$sig = explode(
'/',
isset( $_SERVER['SERVER_SOFTWARE'] ) ?
htmlspecialchars( stripslashes( $_SERVER['SERVER_SOFTWARE'] ) ) : '' // phpcs:ignore
);
$temp = isset( $sig[1] ) ? explode( ' ', $sig[1] ) : array( '0' );
$version = $temp[0];
return $version;
}
/**
* Checks if current request is REST REQUEST.
*
* @static
*/
public static function is_rest_request( $url ) {
if ( defined( 'REST_REQUEST' ) && REST_REQUEST )
return true;
// in case when called before constant is set
// wp filters are not available in that case
return preg_match( '~' . W3TC_WP_JSON_URI . '~', $url );
}
/**
* Reset microcache.
*
* @static
*/
public static function reset_microcache() {
global $w3_current_blog_id;
$w3_current_blog_id = null;
self::$is_using_master_config = null;
}
/**
* Removes blank lines, trim values, removes duplicates, and sorts array.
*
* @since 2.4.3
*
* @param array $values Array of values.
*
* @return array
*/
public static function clean_array( $values ) {
if ( ! empty( $values ) && is_array( $values ) ) {
$values = array_unique(
array_filter(
array_map(
'trim',
$values
),
'strlen'
)
);
sort( $values );
}
return $values;
}
/**
* Parses textarea setting value from string to array.
*
* @since 2.4.3
*
* @param string $value Value.
*
* @return array
*/
public static function textarea_to_array( $value ) {
$values_array = array();
if ( ! empty( $value ) ) {
$values_array = self::clean_array(
preg_split(
'/\R/',
$value,
0,
PREG_SPLIT_NO_EMPTY
)
);
}
return $values_array;
}
}
Fatal error: Uncaught Error: Class 'W3TC\Util_Environment' not found in /home/dale/public_html/wp-content/plugins/w3-total-cache/Config.php:118
Stack trace:
#0 /home/dale/public_html/wp-content/plugins/w3-total-cache/Dispatcher.php(16): W3TC\Config->__construct()
#1 /home/dale/public_html/wp-content/plugins/w3-total-cache/Dispatcher.php(26): W3TC\Dispatcher::component('Config')
#2 /home/dale/public_html/wp-content/plugins/w3-total-cache/Mobile_Redirect.php(16): W3TC\Dispatcher::config()
#3 /home/dale/public_html/wp-content/plugins/w3-total-cache/Dispatcher.php(16): W3TC\Mobile_Redirect->__construct()
#4 /home/dale/public_html/wp-content/advanced-cache.php(31): W3TC\Dispatcher::component('Mobile_Redirect')
#5 /home/dale/public_html/wp-settings.php(97): include('/home/dale/publ...')
#6 /home/dale/public_html/wp-config.php(21): require_once('/home/dale/publ...')
#7 /home/dale/public_html/wp-load.php(50): require_once('/home/dale/publ...')
#8 /home/dale/public_html/wp-blog-header.php(13): require_once('/home/dale/publ...')
#9 in /home/dale/public_html/wp-content/plugins/w3-total-cache/Config.php on line 118