PluginProbe ʕ •ᴥ•ʔ
Backup Migration / 1.3.0
Backup Migration v1.3.0
2.1.6 2.1.5.2 trunk 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.6.1 1.4.7 1.4.8 1.4.9 1.4.9.1 2.0.0 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.5.1
backup-backup / modules / review / review.php
backup-backup / modules / review Last commit date
assets 2 years ago views 2 years ago review.php 2 years ago
review.php
325 lines
1 <?php
2
3 /**
4 * File for our cool review ask in the header
5 *
6 * @category Child Plugin
7 * @version v0.1.0
8 * @since v0.1.0
9 * @author iClyde <kontakt@iclyde.pl>
10 */
11
12 // Namespace
13 namespace Inisev\Subs;
14
15 // Disallow direct access
16 if (defined('ABSPATH')) {
17
18 /**
19 * Main class for handling the Review
20 */
21 if (!class_exists('Inisev\Subs\Inisev_Review')) {
22 class Inisev_Review {
23
24 /**
25 * Local variables
26 */
27 private $root; // __ROOT__ of plugin's root
28 private $file; // __FILE__ of plugin's root
29 private $slug; // Plugin's slug
30 private $name; // Name displayed in banner
31 private $days; // Days displayed in banner
32 private $minutes; // Minutes displayed in banner
33 private $debug = false; // If true it will display minutes
34 private $minimum_time = (30 * 24 * 60 * 60); // Minimum time required to display (in seconds)
35 // private $minimum_time = (3 * 60); // Minimum time required to display (in seconds)
36 private $remind_time = '+14 days'; // Time when banner will be reminded
37 private $time_between = '+2 days'; // Time when new banner can be displayed
38
39 /**
40 * Local URLs
41 */
42 private $root_url; // Root URL for plugin's dir
43 private $assets_url; // Root URL for review assets
44 private $review_url; // Review URL
45 private $plugin_menu_url; // Plugin's settings menu
46
47 /**
48 * __construct:
49 * Compile some variables for "future use"
50 * Such as slug of current plugin, root dir of plugin
51 *
52 * @param string $root_file __FILE__ of plugin's main file
53 * @param string $root_dir __DIR__ of plugin's main file
54 * @param string $individual_slug Individual slug - mostly plugin's slug
55 * @param string $display_name The name that will be displayed in the banner
56 * @param string $review_url The URL that will be served as review one
57 * @param string $plugin_menu_url Plugin menu slug example.com/wp-admin/admin.php?page=<this slug here>
58 * @return Inisev_Review The review object
59 */
60 function __construct($root_file, $root_dir, $individual_slug, $display_name, $review_url, $plugin_menu_url) {
61
62 $this->file = $root_file;
63 $this->root = $root_dir;
64 $this->slug = $individual_slug;
65 $this->name = $display_name;
66
67 $this->review_url = $review_url;
68 $this->plugin_menu_url = admin_url('admin.php?page=' . $plugin_menu_url);
69
70 $this->root_url = plugin_dir_url($this->file);
71 $this->assets_url = $this->root_url . 'modules/review/assets/';
72 $this->option_name = '_irb_h_bn_review';
73 $option_name = $this->option_name;
74 $empty = ['users' => []];
75 $empty[$individual_slug] = time();
76
77 $data = get_option($option_name, false);
78
79 if ($data != false && isset($data) && is_array($data)) {
80
81 if (!array_key_exists($individual_slug, $data)) {
82
83 $data[$individual_slug] = time();
84 update_option($option_name, $data);
85
86 }
87
88 $this->using_since = $data;
89
90 } else {
91
92 if ($individual_slug == 'copy-delete-posts' && get_option('_cdp_review', false) != false) {
93 if (isset(get_option('_cdp_review', false)['installed'])) {
94 $empty[$individual_slug] = get_option('_cdp_review', false)['installed'];
95 }
96 }
97
98 update_option($option_name, $empty);
99 $this->using_since = $empty;
100
101 }
102
103 // Add handler for Ajax request
104 if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
105
106 // Check if slug is defined
107 if (isset($_POST['slug']) && !empty($_POST['slug'])) {
108
109 // Handle the request
110 add_action('wp_ajax_inisev_review', [&$this, 'handle_review_action']);
111
112 }
113
114 // Stop for POST
115 return;
116
117 }
118
119 add_action('wp_loaded', [&$this, 'init_review']);
120
121 }
122
123 /**
124 * __asset - Loads assets
125 *
126 * @param string $file path relative
127 * @return string file URL
128 */
129 private function __asset($file) {
130
131 return $this->assets_url . $file;
132
133 }
134
135 /**
136 * __dir_asset - Loads assets
137 *
138 * @param string $file path relative
139 * @return string absolute path
140 */
141 private function __dir_asset($file) {
142
143 return __DIR__ . '/assets' . '/' . $file;
144
145 }
146
147 /**
148 * _asset - Loads assets and automatically echo
149 *
150 * @param string $file path relative
151 * @echo string file URL
152 */
153 private function _asset($file) {
154
155 echo $this->assets_url . $file;
156
157 }
158
159 /**
160 * _dir_asset - Loads assets and automatically echo
161 *
162 * @param string $file path relative
163 * @echo string absolute path
164 */
165 private function _dir_asset($file) {
166
167 echo __DIR__ . '/assets' . '/' . $file;
168
169 }
170
171 /**
172 * can_be_displayed - check if the banner should be displayed
173 *
174 * @return bool true if banner can be displayed
175 */
176 private function can_be_displayed() {
177
178 $uid = get_current_user_id();
179 if (!defined('IRB_H_CHECK_LOADED') && function_exists('get_current_user_id') && isset($uid) && intval($uid) > 0) {
180
181 $since = intval($this->using_since[$this->slug]);
182 $diff = time() - $since;
183
184 if ($diff > $this->minimum_time) {
185
186 $seconds = $diff;
187 $minutes = intval($diff / 60);
188 $hours = intval($minutes / 60);
189 $days = intval($hours / 24);
190
191 $this->days = $days;
192 $this->minutes = $minutes;
193 $data = $this->using_since;
194
195 if (isset($data['users']) && isset($data['users'][$uid])) {
196
197 if (isset($data['users'][$uid]['delay_between'])) {
198 if (time() <= intval($data['users'][$uid]['delay_between'])) {
199 return false;
200 }
201 }
202
203 if (isset($data['users'][$uid][$this->slug])) {
204 if (isset($data['users'][$uid][$this->slug]['remind'])) {
205 if (time() <= intval($data['users'][$uid][$this->slug]['remind'])) {
206 return false;
207 }
208 }
209 if (isset($data['users'][$uid][$this->slug]['dismiss'])) {
210 if ($data['users'][$uid][$this->slug]['dismiss'] == true || $data['users'][$uid][$this->slug]['dismiss'] == 'true') {
211 return false;
212 }
213 }
214 }
215
216 }
217
218 define('IRB_H_CHECK_LOADED', true);
219 return true;
220
221 } else return false;
222
223 } else return false;
224
225 }
226
227 /**
228 * add_assets - adds required assests by the banner
229 *
230 * @return void
231 */
232 public function add_assets() {
233
234 if (!defined('IRB_H_ASSETS_LOADED')) {
235 define('IRB_H_ASSETS_LOADED', true);
236 wp_enqueue_script('inisev-review-script', $this->__asset('js/script.js'), [], filemtime($this->__dir_asset('js/script.js')), true);
237 wp_enqueue_style('inisev-review-style', $this->__asset('css/style.css'), [], filemtime($this->__dir_asset('css/style.css')));
238 wp_localize_script('inisev-review-script', 'inisev_review_dismiss', [
239 'nonce' => wp_create_nonce('inisev_review_dismiss'),
240 ], true);
241 }
242
243 }
244
245 /**
246 * display_review - loads the HTML and prints it in the header only once
247 *
248 * @return void
249 */
250 public function display_review() {
251
252 if (!defined('IRB_H_HTML_LOADED')) {
253 define('IRB_H_HTML_LOADED', true);
254 include_once __DIR__ . '/views/banner.php';
255 }
256
257 }
258
259 /**
260 * handle_review_action - Handles all POST actions
261 *
262 * @param string $_POST['token'] - must be === 'irbh'
263 * @param string $_POST['slug'] - the unique slug
264 * @param string $_POST['mode'] - the unique action remind/dismiss
265 *
266 * @return json returns it to browser
267 */
268 public function handle_review_action() {
269
270 if (check_ajax_referer('inisev_review_dismiss', 'nonce', false) === false) {
271 return wp_send_json_error();
272 }
273
274 $slug = sanitize_text_field($_POST['slug']);
275 $mode = sanitize_text_field($_POST['mode']);
276
277 if (!empty($_POST['slug']) && isset($mode) && in_array($mode, ['dismiss', 'remind'])) {
278 $option_name = $this->option_name;
279 $data = get_option($option_name, false);
280 if ($data != false) {
281
282 $uid = get_current_user_id();
283
284 if (!array_key_exists('users', $data)) $data['users'] = [];
285 if (!array_key_exists($uid, $data['users'])) $data['users'][$uid] = [];
286 if (!array_key_exists($slug, $data['users'][$uid])) $data['users'][$uid][$slug] = [];
287
288 $data['users'][$uid]['delay_between'] = strtotime($this->time_between);
289
290 if ($mode == 'remind') {
291 $data['users'][$uid][$slug]['remind'] = strtotime($this->remind_time);
292 }
293
294 if ($mode == 'dismiss') {
295 $data['users'][$uid][$slug]['dismiss'] = true;
296 }
297
298 update_option($option_name, $data);
299
300 wp_send_json_success();
301
302 } else wp_send_json_error();
303 } else wp_send_json_error();
304
305 }
306
307 /**
308 * init_review - initialization when the user is authenticated already
309 *
310 * @return void
311 */
312 public function init_review() {
313
314 if ($this->can_be_displayed()) {
315 add_action('admin_enqueue_scripts', [&$this, 'add_assets']);
316 add_action('admin_notices', [&$this, 'display_review']);
317 }
318
319 }
320
321 }
322 }
323
324 }
325