Test Failed
Pull Request — master (#456)
by Kiran
16:45
created

WP_Async_Request   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 148
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 0
Metric Value
dl 0
loc 148
rs 10
c 0
b 0
f 0
wmc 10
lcom 1
cbo 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A data() 0 5 1
A dispatch() 0 6 1
A get_query_args() 0 10 2
A get_query_url() 0 7 2
A get_post_args() 0 13 2
A maybe_handle() 0 10 1
handle() 0 1 ?
1
<?php
2
/**
3
 * WP Async Request
4
 *
5
 * @package WP-Background-Processing
6
 */
7
8
defined( 'ABSPATH' ) || exit;
9
10
/**
11
 * Abstract WP_Async_Request class.
12
 */
13
abstract class 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
		return array(
99
			'action' => $this->identifier,
100
			'nonce'  => wp_create_nonce( $this->identifier ),
101
		);
102
	}
103
104
	/**
105
	 * Get query URL
106
	 *
107
	 * @return string
108
	 */
109
	protected function get_query_url() {
110
		if ( property_exists( $this, 'query_url' ) ) {
111
			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...
112
		}
113
114
		return admin_url( 'admin-ajax.php' );
115
	}
116
117
	/**
118
	 * Get post args
119
	 *
120
	 * @return array
121
	 */
122
	protected function get_post_args() {
123
		if ( property_exists( $this, 'post_args' ) ) {
124
			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...
125
		}
126
127
		return array(
128
			'timeout'   => 0.01,
129
			'blocking'  => false,
130
			'body'      => $this->data,
131
			'cookies'   => $_COOKIE,
132
			'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
133
		);
134
	}
135
136
	/**
137
	 * Maybe handle
138
	 *
139
	 * Check for correct nonce and pass to handler.
140
	 */
141
	public function maybe_handle() {
142
		// Don't lock up other requests while processing
143
		session_write_close();
144
145
		check_ajax_referer( $this->identifier, 'nonce' );
146
147
		$this->handle();
148
149
		wp_die();
150
	}
151
152
	/**
153
	 * Handle
154
	 *
155
	 * Override this method to perform any actions required
156
	 * during the async request.
157
	 */
158
	abstract protected function handle();
159
160
}
161