defined( 'WPINC' ) || exit();
* Provides utility functions for LiteSpeed Cache, including IP detection and heartbeat control.
class Tool extends Root {
const LOG_TAG = '[Tool]';
* Retrieves the public IP address of the server.
* @return string The public IP address or an error message.
public function check_ip() {
self::debug( '✅ check_ip' );
$response = wp_safe_remote_get( 'https://cyberpanel.sh/?ip', [
'User-Agent' => 'curl/8.7.1',
if ( is_wp_error( $response ) ) {
return esc_html__( 'Failed to detect IP', 'litespeed-cache' );
$ip = trim( $response['body'] );
self::debug( 'result [ip] ' . $ip );
if ( Utility::valid_ipv4( $ip ) ) {
return esc_html__( 'Failed to detect IP', 'litespeed-cache' );
* Configures WordPress heartbeat settings for frontend, backend, and editor.
public function heartbeat() {
add_action( 'wp_enqueue_scripts', [ $this, 'heartbeat_frontend' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'heartbeat_backend' ] );
add_filter( 'heartbeat_settings', [ $this, 'heartbeat_settings' ] );
* Heartbeat Control frontend control
* Manages heartbeat settings for the frontend.
public function heartbeat_frontend() {
if ( ! $this->conf( Base::O_MISC_HEARTBEAT_FRONT ) ) {
if ( ! $this->conf( Base::O_MISC_HEARTBEAT_FRONT_TTL ) ) {
wp_deregister_script( 'heartbeat' );
Debug2::debug( '[Tool] Deregistered frontend heartbeat' );
* Heartbeat Control backend control
* Manages heartbeat settings for the backend and editor.
public function heartbeat_backend() {
if ( $this->is_editor() ) {
if ( ! $this->conf( Base::O_MISC_HEARTBEAT_EDITOR ) ) {
if ( ! $this->conf( Base::O_MISC_HEARTBEAT_EDITOR_TTL ) ) {
wp_deregister_script( 'heartbeat' );
Debug2::debug( '[Tool] Deregistered editor heartbeat' );
if ( ! $this->conf( Base::O_MISC_HEARTBEAT_BACK ) ) {
if ( ! $this->conf( Base::O_MISC_HEARTBEAT_BACK_TTL ) ) {
wp_deregister_script( 'heartbeat' );
Debug2::debug( '[Tool] Deregistered backend heartbeat' );
* Heartbeat Control settings
* Adjusts heartbeat interval settings based on configuration.
* @param array $settings Existing heartbeat settings.
* @return array Modified heartbeat settings.
public function heartbeat_settings( $settings ) {
// Check editor first to make frontend editor valid too
if ( $this->is_editor() ) {
if ( $this->conf( Base::O_MISC_HEARTBEAT_EDITOR ) ) {
$settings['interval'] = $this->conf( Base::O_MISC_HEARTBEAT_EDITOR_TTL );
Debug2::debug( '[Tool] Heartbeat interval set to ' . $this->conf( Base::O_MISC_HEARTBEAT_EDITOR_TTL ) );
} elseif ( ! is_admin() ) {
if ( $this->conf( Base::O_MISC_HEARTBEAT_FRONT ) ) {
$settings['interval'] = $this->conf( Base::O_MISC_HEARTBEAT_FRONT_TTL );
Debug2::debug( '[Tool] Heartbeat interval set to ' . $this->conf( Base::O_MISC_HEARTBEAT_FRONT_TTL ) );
} elseif ( $this->conf( Base::O_MISC_HEARTBEAT_BACK ) ) {
$settings['interval'] = $this->conf( Base::O_MISC_HEARTBEAT_BACK_TTL );
Debug2::debug( '[Tool] Heartbeat interval set to ' . $this->conf( Base::O_MISC_HEARTBEAT_BACK_TTL ) );
* Determines if the current request is within the WordPress editor.
* @return bool True if in editor, false otherwise.
public function is_editor() {
$request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
$res = is_admin() && Utility::str_hit_array( $request_uri, [ 'post.php', 'post-new.php' ] );
return apply_filters( 'litespeed_is_editor', $res );