/var/www/html_us/wp-content/plugins/elementor/includes/heartbeat.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
namespace Elementor;

if ( ! 
defined'ABSPATH' ) ) {
    exit; 
// Exit if accessed directly.
}

/**
 * Elementor heartbeat.
 *
 * Elementor heartbeat handler class is responsible for initializing Elementor
 * heartbeat. The class communicates with WordPress Heartbeat API while working
 * with Elementor.
 *
 * @since 1.0.0
 */
class Heartbeat {

    
/**
     * Heartbeat received.
     *
     * Locks the Heartbeat response received when editing with Elementor.
     *
     * Fired by `heartbeat_received` filter.
     *
     * @since 1.0.0
     * @access public
     *
     * @param array $response The Heartbeat response.
     * @param array $data     The `$_POST` data sent.
     *
     * @return array Heartbeat response received.
     */
    
public function heartbeat_received$response$data ) {
        if ( isset( 
$data['elementor_post_lock']['post_ID'] ) ) {
            
$post_id $data['elementor_post_lock']['post_ID'];
            
$locked_user Plugin::$instance->editor->get_locked_user$post_id );

            if ( ! 
$locked_user || ! empty( $data['elementor_force_post_lock'] ) ) {
                
Plugin::$instance->editor->lock_post$post_id );
            } else {
                
$response['locked_user'] = $locked_user->display_name;
            }

            
/** @var Core\Common\Modules\Ajax\Module $ajax */
            
$ajax Plugin::$instance->common->get_component'ajax' );

            
$response['elementorNonce'] = $ajax->create_nonce();
        }
        return 
$response;
    }

    
/**
     * Refresh nonces.
     *
     * Filter the nonces to send to the editor when editing with Elementor. Used
     * to refresh the nonce when the nonce expires while editing. This way the
     * user doesn't need to log-in again as Elementor fetches the new nonce from
     * the server using ajax.
     *
     * Fired by `wp_refresh_nonces` filter.
     *
     * @since 1.8.0
     * @access public
     *
     * @param array $response The no-priv Heartbeat response object or array.
     * @param array $data     The `$_POST` data sent.
     *
     * @return array Refreshed nonces.
     */
    
public function refresh_nonces$response$data ) {
        if ( isset( 
$data['elementor_post_lock']['post_ID'] ) ) {
            
/** @var Core\Common\Modules\Ajax\Module $ajax */
            
$ajax Plugin::$instance->common->get_component'ajax' );

            
$response['elementor-refresh-nonces'] = [
                
'elementorNonce' => $ajax->create_nonce(),
                
'heartbeatNonce' => wp_create_nonce'heartbeat-nonce' ),
            ];
        }

        return 
$response;
    }

    
/**
     * Heartbeat constructor.
     *
     * Initializing Elementor heartbeat.
     *
     * @since 1.0.0
     * @access public
     */
    
public function __construct() {
        
add_filter'heartbeat_received', [ $this'heartbeat_received' ], 10);
        
add_filter'wp_refresh_nonces', [ $this'refresh_nonces' ], 30);
    }
}