Completed
Push — develop ( 1d2391...a94b56 )
by David
02:55 queued 11s
created

Wordlift_Plugin_WP_Async_Request::data()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * WP Async Request
4
 *
5
 * @package WP-Background-Processing
6
 */
7
8
/**
9
 * Abstract Wordlift_Plugin_WP_Async_Request class.
10
 *
11
 * @abstract
12
 */
13
abstract class Wordlift_Plugin_WP_Async_Request {
14
15
	/**
16
	 * Prefix
17
	 *
18
	 * (default value: 'wp')
19
	 *
20
	 * @var string
21
	 * @access protected
22
	 */
23
	protected $prefix = 'wp';
24
25
	/**
26
	 * Action
27
	 *
28
	 * (default value: 'async_request')
29
	 *
30
	 * @var string
31
	 * @access protected
32
	 */
33
	protected $action = 'async_request';
34
35
	/**
36
	 * Identifier
37
	 *
38
	 * @var mixed
39
	 * @access protected
40
	 */
41
	protected $identifier;
42
43
	/**
44
	 * Data
45
	 *
46
	 * (default value: array())
47
	 *
48
	 * @var array
49
	 * @access protected
50
	 */
51
	protected $data = array();
52
53
	/**
54
	 * Initiate new async request
55
	 */
56
	public function __construct() {
57
		$this->identifier = $this->prefix . '_' . $this->action;
58
59
		add_action( 'wp_ajax_' . $this->identifier, array( $this, 'maybe_handle' ) );
60
		add_action( 'wp_ajax_nopriv_' . $this->identifier, array( $this, 'maybe_handle' ) );
61
	}
62
63
	/**
64
	 * Set data used during the request
65
	 *
66
	 * @param array $data Data.
67
	 *
68
	 * @return $this
69
	 */
70
	public function data( $data ) {
71
		$this->data = $data;
72
73
		return $this;
74
	}
75
76
	/**
77
	 * Dispatch the async request
78
	 *
79
	 * @return array|WP_Error
80
	 */
81
	public function dispatch() {
82
		$url  = add_query_arg( $this->get_query_args(), $this->get_query_url() );
83
		$args = $this->get_post_args();
84
85
		return wp_remote_post( esc_url_raw( $url ), $args );
86
	}
87
88
	/**
89
	 * Get query args
90
	 *
91
	 * @return array
92
	 */
93
	protected function get_query_args() {
94
		if ( property_exists( $this, 'query_args' ) ) {
95
			return $this->query_args;
0 ignored issues
show
Bug introduced by
The property query_args does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
96
		}
97
98
		$args = array(
99
			'action' => $this->identifier,
100
			'nonce'  => wp_create_nonce( $this->identifier ),
101
		);
102
103
		/**
104
		 * Filters the post arguments used during an async request.
105
		 *
106
		 * @param array $url
107
		 */
108
		return apply_filters( $this->identifier . '_query_args', $args );
109
	}
110
111
	/**
112
	 * Get query URL
113
	 *
114
	 * @return string
115
	 */
116
	protected function get_query_url() {
117
		if ( property_exists( $this, 'query_url' ) ) {
118
			return $this->query_url;
0 ignored issues
show
Bug introduced by
The property query_url does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
119
		}
120
121
		$url = admin_url( 'admin-ajax.php' );
122
123
		/**
124
		 * Filters the post arguments used during an async request.
125
		 *
126
		 * @param string $url
127
		 */
128
		return apply_filters( $this->identifier . '_query_url', $url );
129
	}
130
131
	/**
132
	 * Get post args
133
	 *
134
	 * @return array
135
	 */
136
	protected function get_post_args() {
137
		if ( property_exists( $this, 'post_args' ) ) {
138
			return $this->post_args;
0 ignored issues
show
Bug introduced by
The property post_args does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
139
		}
140
141
		$args = array(
142
			'timeout'   => 0.01,
143
			'blocking'  => false,
144
			'body'      => $this->data,
145
			'cookies'   => $_COOKIE,
146
			'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
147
		);
148
149
		/**
150
		 * Filters the post arguments used during an async request.
151
		 *
152
		 * @param array $args
153
		 */
154
		return apply_filters( $this->identifier . '_post_args', $args );
155
	}
156
157
	/**
158
	 * Maybe handle
159
	 *
160
	 * Check for correct nonce and pass to handler.
161
	 */
162
	public function maybe_handle() {
163
		// Don't lock up other requests while processing
164
		session_write_close();
165
166
		check_ajax_referer( $this->identifier, 'nonce' );
167
168
		$this->handle();
169
170
		wp_die();
171
	}
172
173
	/**
174
	 * Handle
175
	 *
176
	 * Override this method to perform any actions required
177
	 * during the async request.
178
	 */
179
	abstract protected function handle();
180
181
}
182