log_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;
}
/**
* Is there a partial array intersections match?
*
* Returns true if any entries between the tewo arrays match string endings or in whole.
*
* @since 2.7.4
*
* @static
*
* @param array $array1 Array 1.
* @param array $array2 Array 2.
*
* @return bool
*/
public static function array_intersect_partial( array $array1, array $array2 ): bool {
foreach ( $array1 as $url1 ) {
foreach ( $array2 as $url2 ) {
/**
* Parse array1 URLs to handle both full URLs and relative paths.
* If homepage then 'path' will be null, set to '/'.
*/
$parsed_url1 = \wp_parse_url( \trim( $url1, '/' ) );
$parsed_url1['path'] = $parsed_url1['path'] ?? '/';
/**
* Parse array2 URLs to handle both full URLs and relative paths.
* If value is '/' for homepage then don't trim, otherwise tirm.
*/
$parsed_url2 = \wp_parse_url( '/' === $url2 ? '/' : \trim( $url2, '/' ) );
$is_host_set = isset( $parsed_url1['host'], $parsed_url2['host'] );
if ( $url1 === $url2 ) {
// Direct comparison for full URLs that are identical.
return true;
} elseif (
isset( $parsed_url1['path'], $parsed_url2['path'] )
&& (
\substr( $parsed_url1['path'], -\strlen( $parsed_url2['path'] ) ) === $parsed_url2['path'] ||
\substr( $parsed_url2['path'], -\strlen( $parsed_url1['path'] ) ) === $parsed_url1['path']
) && ( ! $is_host_set || ( $is_host_set && $parsed_url1['host'] === $parsed_url2['host'] ) )
) {
/**
* Check if both parsed URLs have 'path' and 'host' component and if they match.
* If either 'host' is not set but 'path' matches, consider it a match.
*/
return true;
}
}
}
return false;
}
/**
* Generates an appropriate timestamp for WP cron using a selected time during the day in the form of an integer.
* Adjusts for discrepacy in timezones between WP and system and adds a day if the result is in the past.
*
* @since 2.8.0
*
* @static
*
* @param int $cron_time Cron schedule time.
*
* @return int
*/
public static function get_cron_schedule_time( int $cron_time = 0 ): int {
// Get the current time in WordPress timezone.
$current_time_wp = new \DateTime( 'now', wp_timezone() );
// Convert the selected cron time into hours and minutes.
$hour = floor( $cron_time / 60 );
$minute = $cron_time % 60;
// Create a DateTime for today at the specified hour and minute in the user's timezone.
$scheduled_time_user = new \DateTime( 'today', wp_timezone() );
$scheduled_time_user->setTime( $hour, $minute );
// Convert the user's scheduled time to UTC for WordPress.
$scheduled_time_utc = clone $scheduled_time_user;
$scheduled_time_utc->setTimezone( new \DateTimeZone( 'UTC' ) );
// If the selected time has already passed today in UTC, schedule for tomorrow.
if ( $scheduled_time_utc <= $current_time_wp ) {
$scheduled_time_utc->modify( '+1 day' );
}
return $scheduled_time_utc->getTimestamp();
}
/**
* Tests the WP Cron spawning system and reports back its status.
*
* This command tests the spawning system by performing the following steps:
*
* * Checks to see if the `DISABLE_WP_CRON` constant is set; errors if true
* because WP-Cron is disabled.
* * Checks to see if the `ALTERNATE_WP_CRON` constant is set; warns if true.
* * Attempts to spawn WP-Cron over HTTP; warns if non 200 response code is
* returned.
*
* @since 2.8.0
*
* @link https://github.com/wp-cli/cron-command/blob/v2.3.1/src/Cron_Command.php#L14-L55
*
* @return bool
*/
public static function is_wpcron_working(): bool {
if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
$errormsg = 'The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.';
return false;
}
if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
$errormsg = 'The ALTERNATE_WP_CRON constant is set to true. WP-Cron spawning is not asynchronous.';
return false;
}
$spawn = self::get_cron_spawn();
if ( is_wp_error( $spawn ) ) {
$errormsg = sprintf( 'WP-Cron spawn failed with error: %s', $spawn->get_error_message() );
return false;
}
$code = wp_remote_retrieve_response_code( $spawn );
$message = wp_remote_retrieve_response_message( $spawn );
if ( 200 === $code ) {
// WP-Cron spawning is working as expected.
return true;
} else {
$errormsg = sprintf( 'WP-Cron spawn returned HTTP status code: %1$s %2$s', $code, $message );
return false;
}
}
/**
* Spawns a request to `wp-cron.php` and return the response.
*
* This function is designed to mimic the functionality in `spawn_cron()`
* with the addition of returning the result of the `wp_remote_post()`
* request.
*
* @since 2.8.0
*
* @link https://github.com/wp-cli/cron-command/blob/v2.3.1/src/Cron_Command.php#L57-L91
*
* @global $wp_version WordPress version string.
*
* @return WP_Error|array The response or WP_Error on failure.
*/
protected static function get_cron_spawn() {
global $wp_version;
$sslverify = version_compare( $wp_version, 4.0, '<' );
$doing_wp_cron = sprintf( '%.22F', microtime( true ) );
$cron_request_array = array(
'url' => site_url( 'wp-cron.php?doing_wp_cron=' . $doing_wp_cron ),
'key' => $doing_wp_cron,
'args' => array(
'timeout' => 3,
'blocking' => true,
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Calling native WordPress hook.
'sslverify' => apply_filters( 'https_local_ssl_verify', $sslverify ),
),
);
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Calling native WordPress hook.
$cron_request = apply_filters( 'cron_request', $cron_request_array );
// Enforce a blocking request in case something that's hooked onto the 'cron_request' filter sets it to false.
$cron_request['args']['blocking'] = true;
$result = wp_remote_post( $cron_request['url'], $cron_request['args'] );
return $result;
}
/**
* Gets the BoldGrid API URL
*
* This URL can be overridden by defining W3TC_API2_URL
*
* @since 2.8.3
*
* @return string The API URL to use for requests.
*/
public static function get_api_base_url() {
return defined( 'W3TC_API2_URL' ) && W3TC_API2_URL ? esc_url( W3TC_API2_URL, array( 'https' ), '' ) : 'https://api2.w3-edge.com';
}
}
Fatal error: Uncaught Error: Class "W3TC\Util_Environment" not found in /home/devangso/public_html/wp-content/plugins/w3-total-cache/Config.php:175
Stack trace:
#0 /home/devangso/public_html/wp-content/plugins/w3-total-cache/Dispatcher.php(36): W3TC\Config->__construct()
#1 /home/devangso/public_html/wp-content/plugins/w3-total-cache/Dispatcher.php(49): W3TC\Dispatcher::component('Config')
#2 /home/devangso/public_html/wp-content/plugins/w3-total-cache/Mobile_Redirect.php(38): W3TC\Dispatcher::config()
#3 /home/devangso/public_html/wp-content/plugins/w3-total-cache/Dispatcher.php(36): W3TC\Mobile_Redirect->__construct()
#4 /home/devangso/public_html/wp-content/advanced-cache.php(36): W3TC\Dispatcher::component('Mobile_Redirect')
#5 /home/devangso/public_html/wp-settings.php(100): include('/home/devangso/...')
#6 /home/devangso/public_html/wp-config.php(99): require_once('/home/devangso/...')
#7 /home/devangso/public_html/wp-load.php(50): require_once('/home/devangso/...')
#8 /home/devangso/public_html/wp-blog-header.php(13): require_once('/home/devangso/...')
#9 /home/devangso/public_html/index.php(17): require('/home/devangso/...')
#10 {main}
thrown in /home/devangso/public_html/wp-content/plugins/w3-total-cache/Config.php on line 175