Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/tutor-pro/classes/CourseComingSoon.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
/**
3
+
* Handle Course Coming Soon
4
+
*
5
+
* @package TutorPro\Classes
6
+
* @author Themeum <support@themeum.com>
7
+
* @link https://themeum.com
8
+
* @since 3.3.0
9
+
*/
10
+
11
+
namespace TUTOR_PRO;
12
+
13
+
use TUTOR\Input;
14
+
15
+
if ( ! defined( 'ABSPATH' ) ) {
16
+
exit;
17
+
}
18
+
19
+
/**
20
+
* Class Course Coming Soon
21
+
*/
22
+
class CourseComingSoon {
23
+
24
+
const COURSE_COMING_SOON_META = '_tutor_course_enable_coming_soon';
25
+
const COURSE_COMING_SOON_THUMBNAIL_ID_META = '_tutor_course_coming_soon_thumbnail_id';
26
+
const COURSE_CURRICULUM_PREVIEW_META = '_tutor_course_enable_curriculum_preview';
27
+
/**
28
+
* Register hooks.
29
+
*/
30
+
public function __construct() {
31
+
/**
32
+
* Coming soon hooks
33
+
*
34
+
* @since 3.3.0
35
+
*/
36
+
add_filter( 'tutor_course_thumb_url', array( $this, 'set_coming_soon_thumbnail' ), 10, 4 );
37
+
add_filter( 'tutor_get_course_topics', array( $this, 'show_course_curriculum' ) );
38
+
add_filter( 'tutor_course_filter_args', array( $this, 'show_filtered_coming_soon_courses' ) );
39
+
add_filter( 'tutor/course/single/entry-box/free', array( $this, 'remove_coming_soon_add_to_cart' ), 10, 2 );
40
+
add_filter( 'tutor_add_to_cart_btn', array( $this, 'remove_coming_soon_add_to_cart' ), 10, 2 );
41
+
add_filter( 'tutor_pro_subscription_enrollment', array( $this, 'remove_coming_soon_add_to_cart' ), 10, 2 );
42
+
add_filter( 'tutor_course_loop_add_to_cart_button', array( $this, 'remove_coming_soon_add_to_cart' ), 10, 2 );
43
+
add_filter( 'tutor_course_restrict_new_entry', array( $this, 'set_course_coming_soon_entry_button' ), 10, 2 );
44
+
add_filter( 'tutor_course_details_response', array( $this, 'set_course_coming_soon_details_response' ) );
45
+
add_filter( 'tutor_course/loop/start/button', array( $this, 'remove_coming_soon_add_to_cart' ), 10, 2 );
46
+
add_filter( 'tutor_limit_course_archive_list_filter', array( $this, 'set_course_coming_soon_archive_query' ) );
47
+
add_filter( 'tutor_course_lead_info_args', array( $this, 'set_coming_soon_lead_info_args' ) );
48
+
add_filter( 'tutor/course/single/entry-box/is_public', array( $this, 'set_course_coming_soon_entry_button'), 10, 2 );
49
+
add_filter( 'tutor/course/single/entry-box/is_enrolled', array( $this, 'set_course_coming_soon_entry_button'), 10, 2 );
50
+
add_filter( 'tutor_course_loop_price', array( $this, 'restrict_public_course' ), 10, 2);
51
+
add_filter( 'tutor_course_has_video', array( $this, 'replace_intro_video' ), 10, 2 );
52
+
53
+
add_action( 'future_to_publish', array( $this, 'handle_schedule_post_published' ) );
54
+
add_action( 'pre_get_posts', array( $this, 'get_coming_soon_details' ) );
55
+
add_action( 'tutor_course/single/entry/after', array( $this, 'set_entry_box_coming_soon_button' ), 8 );
56
+
add_action( 'tutor_course_loop_footer_bottom', array( $this, 'show_course_coming_soon' ) );
57
+
add_action( 'tutor_save_course_after', array( $this, 'set_course_coming_soon_meta' ), 10, 2 );
58
+
add_action( 'tutor_after_prepare_update_post_meta', array( $this, 'prepare_course_coming_soon_update_post_meta' ), 10, 2 );
59
+
}
60
+
61
+
/**
62
+
* Restrict public course entry in course list when coming soon.
63
+
*
64
+
* @since 3.3.0
65
+
*
66
+
* @param string $content the course card footer content.
67
+
* @param int $course_id the course id.
68
+
*
69
+
* @return string
70
+
*/
71
+
public function restrict_public_course( $content, $course_id ) {
72
+
$course_coming_soon = (bool) get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
73
+
$is_public_course = 'yes' === get_post_meta( $course_id, '_tutor_is_public_course', true );
74
+
if ( $course_coming_soon && $is_public_course ) {
75
+
$content = '';
76
+
}
77
+
return $content;
78
+
}
79
+
80
+
/**
81
+
* Replace course details intro video for coming soon
82
+
*
83
+
* @since 3.3.0
84
+
*
85
+
* @param array|bool $has_video check if video exists for course.
86
+
*
87
+
* @return array|bool;
88
+
*/
89
+
public function replace_intro_video( $has_video, $course_id ) {
90
+
$course_coming_soon = (bool) get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
91
+
$coming_soon_thumbnail_id = (int) get_post_meta( $course_id, self::COURSE_COMING_SOON_THUMBNAIL_ID_META, true );
92
+
if ( $course_coming_soon && $coming_soon_thumbnail_id ) {
93
+
$has_video = false;
94
+
}
95
+
return $has_video;
96
+
}
97
+
98
+
/**
99
+
* Filter course lead info args for coming soon.
100
+
*
101
+
* @since 3.3.0
102
+
*
103
+
* @param array $args course lead info query args.
104
+
*
105
+
* @return array
106
+
*/
107
+
public function set_coming_soon_lead_info_args( $args ) {
108
+
$args['post_status'] = array( 'publish', 'future' );
109
+
return $args;
110
+
}
111
+
112
+
/**
113
+
* Meta query for getting coming soon courses only.
114
+
*
115
+
* @since 3.3.0
116
+
*
117
+
* @return array
118
+
*/
119
+
private function coming_soon_meta_query() {
120
+
$meta_query = array(
121
+
'relation' => 'OR',
122
+
array(
123
+
'key' => self::COURSE_COMING_SOON_META,
124
+
'value' => '1',
125
+
'compare' => '=',
126
+
),
127
+
array(
128
+
'key' => self::COURSE_COMING_SOON_META,
129
+
'compare' => 'NOT EXISTS',
130
+
),
131
+
);
132
+
return $meta_query;
133
+
}
134
+
135
+
/**
136
+
* Set course archive list query object for coming soon.
137
+
*
138
+
* @since 3.3.0
139
+
*
140
+
* @param \WP_Query $query the query object.
141
+
*
142
+
* @return \WP_Query
143
+
*/
144
+
public function set_course_coming_soon_archive_query( $query ) {
145
+
$query->set( 'post_status', array( 'publish', 'future' ) );
146
+
// Only show coming soon and published courses.
147
+
$query->set(
148
+
'meta_query',
149
+
$this->coming_soon_meta_query()
150
+
);
151
+
152
+
return $query;
153
+
}
154
+
155
+
/**
156
+
* Extend course details for coming soon.
157
+
*
158
+
* @since 3.3.0
159
+
*
160
+
* @param array $data the course details.
161
+
*
162
+
* @return array
163
+
*/
164
+
public function set_course_coming_soon_details_response( $data ) {
165
+
$course_id = Input::sanitize( $data['ID'], 0 );
166
+
167
+
$data['enable_coming_soon'] = get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
168
+
$is_coming_soon = (bool) $data['enable_coming_soon'];
169
+
if ( $is_coming_soon ) {
170
+
$data['coming_soon_thumbnail'] = wp_get_attachment_image_url( get_post_meta( $course_id, self::COURSE_COMING_SOON_THUMBNAIL_ID_META, true ), 'post-thumbnail' );
171
+
$data['coming_soon_thumbnail_id'] = get_post_meta( $course_id, self::COURSE_COMING_SOON_THUMBNAIL_ID_META, true );
172
+
$data['enable_curriculum_preview'] = get_post_meta( $course_id, self::COURSE_CURRICULUM_PREVIEW_META, true );
173
+
}
174
+
175
+
return $data;
176
+
}
177
+
178
+
/**
179
+
* Prevent course entry when coming soon.
180
+
*
181
+
* @since 3.3.0
182
+
*
183
+
* @param string $content the content to replace.
184
+
* @param int $course_id the course id.
185
+
*
186
+
* @return string
187
+
*/
188
+
public function set_course_coming_soon_entry_button( $content, $course_id ) {
189
+
$course_coming_soon = (bool) get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
190
+
191
+
if ( $course_coming_soon ) {
192
+
$content = '';
193
+
}
194
+
195
+
return $content;
196
+
}
197
+
198
+
/**
199
+
* Save course coming soon meta when save post.
200
+
*
201
+
* @since 3.3.0
202
+
*
203
+
* @param int $post_ID the post id.
204
+
* @param \WP_Post $course the tutor course.
205
+
*
206
+
* @return void
207
+
*/
208
+
public function set_course_coming_soon_meta( $post_ID, $course ) {
209
+
$enable_coming_soon = Input::post( 'enable_coming_soon' );
210
+
if ( $enable_coming_soon ) {
211
+
update_post_meta( $post_ID, self::COURSE_COMING_SOON_META, $enable_coming_soon );
212
+
} elseif ( ! tutor_is_rest() ) {
213
+
delete_post_meta( $post_ID, self::COURSE_COMING_SOON_META );
214
+
}
215
+
216
+
$coming_soon_thumbnail_id = Input::post( 'coming_soon_thumbnail_id' );
217
+
if ( $coming_soon_thumbnail_id ) {
218
+
update_post_meta( $post_ID, self::COURSE_COMING_SOON_THUMBNAIL_ID_META, $coming_soon_thumbnail_id );
219
+
} elseif ( ! tutor_is_rest() ) {
220
+
delete_post_meta( $post_ID, self::COURSE_COMING_SOON_THUMBNAIL_ID_META );
221
+
}
222
+
223
+
$enable_curriculum_preview = Input::post( 'enable_curriculum_preview' );
224
+
if ( $enable_curriculum_preview ) {
225
+
update_post_meta( $post_ID, self::COURSE_CURRICULUM_PREVIEW_META, $enable_curriculum_preview );
226
+
} elseif ( ! tutor_is_rest() ) {
227
+
delete_post_meta( $post_ID, self::COURSE_CURRICULUM_PREVIEW_META );
228
+
}
229
+
}
230
+
231
+
/**
232
+
* Prepare coming soon course meta on course update.
233
+
*
234
+
* @since 3.3.0
235
+
*
236
+
* @param int $post_id the post id.
237
+
* @param array $params the post parameters passed.
238
+
*
239
+
* @return void
240
+
*/
241
+
public function prepare_course_coming_soon_update_post_meta( $post_id, $params ) {
242
+
if ( isset( $params['enable_coming_soon'] ) ) {
243
+
update_post_meta( $post_id, self::COURSE_COMING_SOON_META, $params['enable_coming_soon'] );
244
+
}
245
+
246
+
if ( isset( $params['coming_soon_thumbnail_id'] ) ) {
247
+
update_post_meta( $post_id, self::COURSE_COMING_SOON_THUMBNAIL_ID_META, $params['coming_soon_thumbnail_id'] );
248
+
}
249
+
250
+
if ( isset( $params['enable_curriculum_preview'] ) ) {
251
+
update_post_meta( $post_id, self::COURSE_CURRICULUM_PREVIEW_META, $params['enable_curriculum_preview'] );
252
+
}
253
+
}
254
+
255
+
/**
256
+
* Remove add to cart button when course coming soon.
257
+
*
258
+
* @since 3.3.0
259
+
*
260
+
* @param string $button the button content.
261
+
* @param int $course_id the course id.
262
+
*
263
+
* @return string
264
+
*/
265
+
public function remove_coming_soon_add_to_cart( $button, $course_id ) {
266
+
$course_coming_soon = (bool) get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
267
+
268
+
if ( $course_coming_soon ) {
269
+
$button = '';
270
+
}
271
+
272
+
return $button;
273
+
}
274
+
275
+
/**
276
+
* Show coming soon on course list.
277
+
*
278
+
* @since 3.3.0
279
+
*
280
+
* @param int $course_id the course id.
281
+
*
282
+
* @return void
283
+
*/
284
+
public function show_course_coming_soon( $course_id ) {
285
+
$course_coming_soon = (bool) get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
286
+
$content = '';
287
+
288
+
if ( $course_coming_soon ) {
289
+
ob_start();
290
+
tutor_load_template( 'coming-soon', array( 'course' => get_post( $course_id ) ), true );
291
+
$content = ob_get_clean();
292
+
}
293
+
echo wp_kses_post( $content );
294
+
}
295
+
296
+
/**
297
+
* Set coming soon for single course entry box.
298
+
*
299
+
* @since 3.3.0
300
+
*
301
+
* @param int $course_id the course id.
302
+
*
303
+
* @return void
304
+
*/
305
+
public function set_entry_box_coming_soon_button( $course_id ) {
306
+
$course_coming_soon = (bool) get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
307
+
$content = '';
308
+
309
+
if ( $course_coming_soon ) {
310
+
ob_start();
311
+
tutor_load_template(
312
+
'coming-soon',
313
+
array(
314
+
'course' => get_post( $course_id ),
315
+
'is_entry_box' => true,
316
+
),
317
+
true
318
+
);
319
+
$content = ob_get_clean();
320
+
}
321
+
echo wp_kses_post( $content );
322
+
}
323
+
324
+
/**
325
+
* Show coming soon course for course list filter.
326
+
*
327
+
* @since 3.3.0
328
+
*
329
+
* @param array $args array of filter arguments.
330
+
*
331
+
* @return array
332
+
*/
333
+
public function show_filtered_coming_soon_courses( $args ) {
334
+
if ( isset( $args['post_status'] ) ) {
335
+
$args['post_status'] = array( 'publish', 'future' );
336
+
}
337
+
338
+
if ( isset( $args['meta_query'] ) ) {
339
+
array_push(
340
+
$args['meta_query'],
341
+
$this->coming_soon_meta_query()
342
+
);
343
+
} else {
344
+
$args['meta_query'] = $this->coming_soon_meta_query();
345
+
}
346
+
347
+
return $args;
348
+
}
349
+
350
+
351
+
/**
352
+
* Show course curriculum on coming soon courses.
353
+
*
354
+
* @since 3.3.0
355
+
*
356
+
* @param \WP_Query $topics the topics of the course.
357
+
*
358
+
* @return \WP_Query
359
+
*/
360
+
public function show_course_curriculum( $topics ) {
361
+
$course_id = get_the_ID();
362
+
$course_coming_soon = (bool) get_post_meta( $course_id, self::COURSE_COMING_SOON_META, true );
363
+
$course_curriculum = (bool) get_post_meta( $course_id, self::COURSE_CURRICULUM_PREVIEW_META, true );
364
+
365
+
if ( $course_coming_soon && ! $course_curriculum ) {
366
+
return new \WP_Query();
367
+
}
368
+
369
+
return $topics;
370
+
}
371
+
372
+
373
+
/**
374
+
* Show coming soon course details for students.
375
+
*
376
+
* @since 3.3.0
377
+
*
378
+
* @param \WP_Query $query the query object.
379
+
*
380
+
* @return void
381
+
*/
382
+
public function get_coming_soon_details( $query ) {
383
+
384
+
$post_type = Input::get( 'post_type' );
385
+
$post_id = Input::get( 'p' );
386
+
$course_type = isset( $post_type ) && in_array( $post_type, array( tutor()->course_post_type ), true );
387
+
$coming_soon = isset( $post_id ) && (bool) get_post_meta( $post_id, self::COURSE_COMING_SOON_META, true );
388
+
389
+
if ( $coming_soon && $course_type ) {
390
+
$query->set( 'post_status', array( 'publish', 'future' ) );
391
+
}
392
+
}
393
+
394
+
/**
395
+
* Set coming soon thumbnail if provided and replace course thumbnail.
396
+
*
397
+
* @since 3.3.0
398
+
*
399
+
* @param int $thumb_url the thumbnail url.
400
+
* @param int $post_id the post id.
401
+
* @param string $size the thumbnail size.
402
+
* @param int $post_thumbnail_id the feature image of course.
403
+
*
404
+
* @return int
405
+
*/
406
+
public function set_coming_soon_thumbnail( $thumb_url, $post_id, $size, $post_thumbnail_id ) {
407
+
408
+
$enable_coming_soon = (bool) get_post_meta( $post_id, self::COURSE_COMING_SOON_META, true );
409
+
$coming_soon_thumbnail_id = (int) get_post_meta( $post_id, self::COURSE_COMING_SOON_THUMBNAIL_ID_META, true );
410
+
$placeholder_url = tutor_pro()->url . 'assets/images/coming-soon.svg';
411
+
412
+
if ( $enable_coming_soon && $coming_soon_thumbnail_id ) {
413
+
$thumb_url = wp_get_attachment_image_url( $coming_soon_thumbnail_id, $size );
414
+
} elseif ( $enable_coming_soon && ! $post_thumbnail_id ) {
415
+
$thumb_url = $placeholder_url;
416
+
}
417
+
418
+
return $thumb_url;
419
+
}
420
+
421
+
/**
422
+
* Handle scheduled course publish.
423
+
*
424
+
* @since 3.3.0
425
+
*
426
+
* @param object $course the course object.
427
+
*
428
+
* @return void
429
+
*/
430
+
public function handle_schedule_post_published( $course ) {
431
+
if ( tutor()->course_post_type !== $course->post_type ) {
432
+
return;
433
+
}
434
+
435
+
$enable_coming_soon = (bool) get_post_meta( $course->ID, self::COURSE_COMING_SOON_META, true );
436
+
437
+
if ( $enable_coming_soon ) {
438
+
delete_post_meta( $course->ID, self::COURSE_COMING_SOON_META );
439
+
delete_post_meta( $course->ID, self::COURSE_COMING_SOON_THUMBNAIL_ID_META );
440
+
delete_post_meta( $course->ID, self::COURSE_CURRICULUM_PREVIEW_META );
441
+
}
442
+
}
443
+
}
444
+