PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.3.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.3.9
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / inc / abstracts / abstract-object-data.php

abstract-object-data.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.3.9, at inc/abstracts/abstract-object-data.php

594 lines 13.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class LP_Abstract_Object_Data.
4 *
5 * @author ThimPress
6 * @package LearnPress/Classes
7 * @version 3.0.0
8 */
9
10 defined( 'ABSPATH' ) || exit();
11
12 if ( ! class_exists( 'LP_Abstract_Object_Data' ) ) {
13
14 /**
15 * Class LP_Abstract_Object_Data
16 */
17 abstract class LP_Abstract_Object_Data {
18 /**
19 * @var int
20 */
21 protected $_id = 0;
22
23 /**
24 * @var array
25 */
26 protected $_data = array();
27
28 /**
29 * @var array
30 */
31 protected $_extra_data = array();
32
33 /**
34 * @var bool
35 */
36 protected $_no_cache = false;
37
38 /**
39 * @var array
40 */
41 protected $_supports = array();
42
43 /**
44 * Store new changes
45 *
46 * @var array
47 */
48 protected $_changes = array();
49
50 /**
51 * @var array
52 */
53 protected $_extra_data_changes = array();
54
55 /**
56 * Object meta
57 *
58 * @var array
59 */
60 protected $_meta_data = array();
61
62 /**
63 * @var array
64 */
65 protected $_meta_keys = array();
66
67 /**
68 * CURD class to manipulation with database.
69 *
70 * @var null
71 */
72 protected $_curd = null;
73
74 /**
75 * Mark the $post object is set up to this class
76 *
77 * @var bool
78 */
79 protected $_setup_postdata = false;
80
81 public $object_type = 'object-data';
82
83 /**
84 * LP_Abstract_Object_Data constructor.
85 *
86 * @param null $data
87 */
88 public function __construct( $data = null ) {
89 $this->_data = (array) $data;
90 if ( array_key_exists( 'id', $this->_data ) ) {
91 $this->set_id( absint( $this->_data['id'] ) );
92 unset( $this->_data['id'] );
93 }
94 $this->load_curd();
95 }
96
97 /**
98 * Load curd.
99 */
100 protected function load_curd() {
101 if ( is_string( $this->_curd ) && $this->_curd ) {
102 $this->_curd = new $this->_curd();
103 }
104 }
105
106 /**
107 * Set id of object in database
108 *
109 * @param $id
110 */
111 public function set_id( $id ) {
112 $this->_id = $id;
113 }
114
115 /**
116 * Get id of object in database
117 *
118 * @return int
119 */
120 public function get_id() {
121 return absint( $this->_id );
122 }
123
124 /**
125 * Get post object assigned to this class.
126 *
127 * @return array|null|WP_Post
128 * @since 3.0.0
129 */
130 public function get_post() {
131 return get_post( $this->get_id() );
132 }
133
134 /**
135 * Get global $post object and set it up with new data
136 *
137 * @return bool|WP_Post
138 * @since 3.0.0
139 */
140 public function setup_postdata() {
141 global $post;
142
143 $post = $this->get_post();
144
145 if ( $post ) {
146 setup_postdata( $post );
147 $this->_setup_postdata = true;
148
149 return $post;
150 }
151
152 return false;
153 }
154
155 /**
156 * Reset global $post to WP default.
157 *
158 * @return bool
159 * @since 3.0.0
160 */
161 public function reset_postdata() {
162 if ( $this->_setup_postdata ) {
163 wp_reset_postdata();
164
165 return true;
166 }
167
168 return false;
169 }
170
171 /**
172 * Get object data.
173 *
174 * @updated 3.2.0
175 * @date 13 Nov 2018
176 *
177 * @param string $name - Optional. Name of data want to get, true if return all.
178 * @param mixed $default
179 *
180 * @return array|mixed
181 */
182 public function get_data( $name = '', $default = '' ) {
183 if ( is_string( $name ) && $name ) {
184 return array_key_exists( $name, $this->_data ) ? $this->_data[ $name ] : ( array_key_exists( $name, $this->_extra_data ) ? $this->_extra_data[ $name ] : $default );
185 } elseif ( is_array( $name ) ) {
186 $data = array();
187
188 foreach ( $name as $key ) {
189 $data[ $key ] = $this->get_data( $key, $default );
190 }
191
192 return $data;
193 }
194
195 return array_merge( $this->_data, $this->_extra_data );
196 }
197
198 /**
199 * Get data as LP_Datetime object
200 *
201 * @param string $name
202 *
203 * @return array|LP_Datetime|mixed
204 * @since 3.2.0
205 */
206 public function get_data_date( $name ) {
207 $data = $this->get_data( $name );
208
209 return is_a( $data, 'LP_Datetime' ) ? $data : new LP_Datetime( $data );
210 }
211
212
213 /**
214 * @param string $name
215 * @param mixed $default
216 *
217 * @return array|bool|mixed|string
218 */
219 public function get_extra_data( string $name = '', $default = false ) {
220 if ( is_string( $name ) ) {
221 return array_key_exists( $name, $this->_extra_data ) && ! empty( $this->_extra_data[ $name ] ) ? $this->_extra_data[ $name ] : $default;
222 } elseif ( is_array( $name ) ) {
223 $data = array();
224 foreach ( $name as $key ) {
225 $data[ $key ] = $this->get_extra_data( $key, $default );
226 }
227
228 return $data;
229 }
230
231 return $default;
232 }
233
234 /**
235 * Set object data.
236 *
237 * @param mixed $key_or_data
238 * @param mixed $value
239 * @param bool $extra
240 */
241 protected function _set_data( $key_or_data, $value = '', $extra = false ) {
242 if ( is_array( $key_or_data ) ) {
243 foreach ( $key_or_data as $key => $value ) {
244 $this->_set_data( $key, $value, $extra );
245 }
246 } elseif ( $key_or_data ) {
247 if ( $extra ) {
248 // Do not allow to add extra data with the same key in data
249 if ( ! array_key_exists( $key_or_data, $this->_data ) ) {
250 $this->_extra_data[ $key_or_data ] = $value;
251 }
252 } else {
253 try {
254 if ( ! is_string( $key_or_data ) && ! is_numeric( $key_or_data ) ) {
255 throw new Exception( 'error' );
256 }
257
258 // Only change the data is already existed
259 // if ( array_key_exists( $key_or_data, $this->_data ) ) {
260 $this->_data[ $key_or_data ] = $value;
261 // } else {
262 // $this->_extra_data[ $key_or_data ] = $value;
263 // }
264 } catch ( Throwable $ex ) {
265 error_log( $ex->getMessage() );
266 }
267 }
268 }
269 }
270
271 /**
272 * Set extra data
273 *
274 * @param array|string $key_or_data
275 * @param string|mixed $value
276 * @return $this
277 */
278 public function set_data( $key_or_data, $value = '' ) {
279 $this->_set_data( $key_or_data, $value );
280 return $this;
281 }
282
283 /**
284 * Set data datetime
285 * if $value is empty, not set is LP_Datetime object
286 *
287 * @param $key
288 * @param $value
289 *
290 * @version 4.0.1
291 * @return LP_Abstract_Object_Data
292 */
293 public function set_data_date( $key, $value ): LP_Abstract_Object_Data {
294 $lp_date = '';
295 if ( ! empty( $value ) ) {
296 $lp_date = new LP_Datetime( $value );
297 }
298
299 $this->set_data( $key, $lp_date );
300
301 return $this;
302 }
303
304 /**
305 * @param $key
306 * @param $value
307 * @deprecated 4.1.7.3
308 */
309 protected function _set_data_date( $key, $value, $extra = false ) {
310 _deprecated_function( __FUNCTION__, '4.1.7.3', 'set_data_date' );
311 $this->set_data_date( $key, $value );
312 }
313
314 /**
315 * @deprecated 4.1.7.3
316 */
317 public function set_data_null_date( $key ) {
318 _deprecated_function( __METHOD__, '4.1.7.3' );
319 $this->_set_data( $key, LP_Datetime::getSqlNullDate() );
320 }
321
322 /**
323 * Set data via methods in array
324 *
325 * @param array $data - Array with key is method and value is value to set
326 *
327 * @throws Exception
328 */
329 public function set_data_via_methods( $data ) {
330 $errors = array_keys( $data );
331 foreach ( $data as $prop => $value ) {
332 $setter = "set_$prop";
333 if ( is_callable( array( $this, $setter ) ) ) {
334 $reflection = new ReflectionMethod( $this, $setter );
335
336 if ( $reflection->isPublic() ) {
337 $this->{$setter}( $value );
338 $errors = array_diff( $errors, array( $prop ) );
339 }
340 }
341 }
342
343 // If there is at least one method failed
344 if ( $errors ) {
345 $errors = array_map( array( $this, 'prefix_set_method' ), $errors );
346 throw new Exception( sprintf( __( 'The following functions %1$s do not exist in %2$s', 'learnpress' ), join( ',', $errors ), get_class( $this ) ) );
347 }
348 }
349
350 /**
351 * Return the keys of data
352 *
353 * @param bool $extra - Optional. TRUE if including extra data
354 *
355 * @return array
356 */
357 public function get_data_keys( $extra = true ) {
358 return $extra ? array_merge( array_keys( $this->_data ), array_keys( $this->_extra_data ) ) : array_keys( $this->_data );
359 }
360
361 /**
362 * @param $method
363 *
364 * @return string
365 */
366 public function prefix_set_method( $method ) {
367 return "set_{$method}";
368 }
369
370 /**
371 * Apply the changes
372 */
373 public function apply_changes() {
374 $this->_data = array_replace_recursive( $this->_data, $this->_changes );
375 $this->_changes = array();
376 }
377
378 /**
379 * Get the changes.
380 *
381 * @return array
382 */
383 public function get_changes() {
384 return $this->_changes;
385 }
386
387 /**
388 * Check if question is support feature.
389 *
390 * @param string $feature
391 * @param string $type
392 *
393 * @return bool
394 */
395 public function is_support( $feature, $type = '' ) {
396 $feature = $this->_sanitize_feature_key( $feature );
397
398 return LP_Global::object_is_support_feature( $this->object_type, $feature, $type );
399 }
400
401 /**
402 * Add a feature that question is supported
403 *
404 * @param $feature
405 * @param string $type
406 */
407 public function add_support( $feature, $type = 'yes' ) {
408
409 $feature = $this->_sanitize_feature_key( $feature );
410 LP_Global::add_object_feature( $this->object_type, $feature, $type );
411 }
412
413 /**
414 * @param $feature
415 *
416 * @return mixed
417 */
418 protected function _sanitize_feature_key( $feature ) {
419 return preg_replace( '~[_]+~', '-', $feature );
420 }
421
422 /**
423 * Get all features are supported by question.
424 *
425 * @return array
426 * @deprecated 4.1.7.3
427 */
428 public function get_supports() {
429 _deprecated_function( __FUNCTION__, '4.1.7.3' );
430 return LP_Global::get_object_supports( $this->object_type );
431 }
432
433 /**
434 * @param $value
435 * @deprecated 4.1.7.3
436 */
437 /*public function set_no_cache( $value ) {
438 $this->_no_cache = $value;
439 }*/
440
441 /**
442 * @return bool
443 * @deprecated 4.1.7.3
444 */
445 /*public function get_no_cache() {
446 return $this->_no_cache;
447 }*/
448
449 /**
450 * Read all metas and set to object
451 */
452 public function read_meta() {
453 $meta_data = $this->_curd->read_meta( $this );
454
455 if ( $meta_data ) {
456 $external_metas = array_filter( $meta_data, array( $this, 'exclude_metas' ) );
457
458 foreach ( $external_metas as $meta ) {
459 $this->_meta_data[] = $meta;
460 }
461 }
462 }
463
464 /**
465 * Callback function for excluding meta keys.
466 *
467 * @param $meta
468 *
469 * @return bool
470 */
471 protected function exclude_metas( $meta ) {
472 $exclude_keys = array_merge( array_keys( $this->_meta_keys ), array_keys( $this->_data ) );
473
474 return ! in_array( $meta->meta_key, $exclude_keys ) && 0 !== stripos( $meta->meta_key, 'wp_' );
475 }
476
477 /**
478 * Add new meta data to object.
479 *
480 * @param string|array $key_or_array
481 * @param string $value
482 */
483 public function add_meta( $key_or_array, $value = '' ) {
484 if ( is_array( $key_or_array ) ) {
485 foreach ( $key_or_array as $key => $value ) {
486 $this->add_meta( $key, $value );
487 }
488 } elseif ( is_string( $key_or_array ) ) {
489 $this->_meta_data[] = (object) array(
490 'meta_key' => $key_or_array,
491 'meta_value' => $value,
492 );
493 } else {
494 $this->_meta_data[] = $key_or_array;
495 }
496 }
497
498 /**
499 * Delete meta data by key.
500 * If meta value is passed, compare with existing value in database (string only).
501 *
502 * @param string $meta_key
503 * @param bool $meta_value - Optional. FALSE to abort comparison.
504 *
505 * @return bool
506 */
507 public function delete_meta( $meta_key, $meta_value = false ) {
508 if ( empty( $this->_meta_data ) ) {
509 return false;
510 } else {
511 $new_meta_data = array();
512 foreach ( $this->_meta_data as $k => $meta_data ) {
513 if ( $meta_data->meta_key === $meta_key ) {
514 if ( false !== $meta_value && $meta_data->meta_value === $meta_value ) {
515 continue;
516 }
517 continue;
518 }
519 $new_meta_data[] = $meta_data;
520 }
521 // Assign new meta
522 $this->_meta_data = $new_meta_data;
523
524 // Force to deleting from database
525 delete_post_meta( $this->get_id(), $meta_key, $meta_value );
526 }
527
528 return true;
529 }
530
531 /**
532 * Update item meta if it is already existed. Otherwise, add a new once.
533 *
534 * @param $meta_key
535 * @param $meta_value
536 */
537 public function set_meta( $meta_key, $meta_value ) {
538 if ( empty( $this->_meta_data ) ) {
539 $this->add_meta( $meta_key, $meta_value );
540 } else {
541 $found = false;
542 foreach ( $this->_meta_data as $k => $meta_data ) {
543 if ( $meta_data->meta_key === $meta_key ) {
544 $this->_meta_data[ $k ]->meta_value = $meta_value;
545 $found = true;
546 }
547 }
548 if ( ! $found ) {
549 $this->add_meta( $meta_key, $meta_value );
550 }
551 }
552 }
553
554 /**
555 * Update meta.
556 *
557 * @updated 3.1.0
558 *
559 * @param string $key
560 * @param mixed $value
561 * @param mixed $prev_value
562 */
563 public function update_meta( $key = '', $value = '', $prev_value = '' ) {
564 if ( func_num_args() == 0 ) {
565 if ( $this->_meta_data ) {
566 foreach ( $this->_meta_data as $meta_data ) {
567 $this->_curd->update_meta( $this, $meta_data );
568 }
569 }
570 } else {
571 $update = update_post_meta( $this->get_id(), $key, $value, $prev_value );
572 if ( ! is_bool( $update ) && $update ) {
573 $this->_meta_data = (object) array(
574 'meta_key' => $key,
575 'meta_value' => $value,
576 );
577 }
578 }
579 }
580
581
582 /**
583 * Get meta keys.
584 *
585 * @return array
586 */
587 public function get_meta_keys() {
588 return $this->_meta_keys;
589 }
590
591 }
592
593 }
594