Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/tutor-pro/classes/CourseComingSoon.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
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 +