class-learndash-admin-course-cloning.php
7.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
<?php
/**
* LearnDash Admin Course Cloning.
*
* @since 4.2.0
*
* @package LearnDash
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( class_exists( 'LearnDash_Admin_Cloning' ) && ! class_exists( 'Learndash_Admin_Course_Cloning' ) ) {
/**
* Class LearnDash Admin Course Cloning.
*
* @since 4.2.0
*/
class Learndash_Admin_Course_Cloning extends Learndash_Admin_Cloning {
/**
* Returns the post type slug for cloning.
*
* @since 4.2.0
*
* @return string The course post type slug.
*/
public function get_cloning_object(): string {
return 'course';
}
/**
* Changing the action row label for the course as courses are copied entirely.
*
* @since 4.2.0
*
* @return string The cloning action row label.
*/
protected function get_cloning_row_label(): string {
return __( 'Clone', 'learndash' );
}
/**
* Forces the cloning of the course immediately if shared steps is enabled.
*
* @since 4.2.0
*
* @param WP_Post $ld_object The LearnDash WP_Post object.
*
* @return boolean
*/
protected function run_clone_immediately( WP_Post $ld_object ): bool {
return LearnDash_Settings_Section::get_section_setting( 'LearnDash_Settings_Courses_Builder', 'shared_steps' ) === 'yes';
}
/**
* Clones the course.
*
* @since 4.2.0
*
* @param WP_Post $ld_object The LearnDash WP_Post course.
* @param array $args The copy arguments.
*
* @return int The new course ID.
*/
public function clone( WP_Post $ld_object, array $args = array() ) {
$shared_steps = LearnDash_Settings_Section::get_section_setting( 'LearnDash_Settings_Courses_Builder', 'shared_steps' ) === 'yes';
// creating the new course post.
$new_course_id = $this->clone_post_fully( $ld_object, $args );
// update the course meta according to the LD logic.
$this->course_meta_updates( $ld_object, $new_course_id, $shared_steps );
// copy related objects.
// if shared steps is disabled, prepare to copy related objects.
if ( ! $shared_steps ) {
$lesson_cloning_class = new Learndash_Admin_Lesson_Cloning();
$topic_cloning_class = new Learndash_Admin_Topic_Cloning();
$quiz_cloning_class = new Learndash_Admin_Quiz_Cloning();
}
// lessons.
$lessons = learndash_course_get_lessons(
$ld_object->ID,
array(
'return_type' => 'WP_Post',
'per_page' => 0,
)
);
if ( is_array( $lessons ) && ! empty( $lessons ) ) {
$new_lesson_id = 0;
foreach ( $lessons as $lesson ) {
if ( ! $shared_steps ) {
$new_lesson_id = $lesson_cloning_class->clone(
$lesson,
array_replace(
$args,
array(
'copy_name' => $lesson->post_title,
'new_course_id' => $new_course_id,
)
)
);
} else {
// add shared course metadata.
update_post_meta( $lesson->ID, "ld_course_$new_course_id", $new_course_id );
}
// topics.
$topics = learndash_course_get_topics(
$ld_object->ID,
$lesson->ID,
array(
'return_type' => 'WP_Post',
'per_page' => 0,
)
);
if ( is_array( $topics ) && ! empty( $topics ) ) {
$new_topic_id = 0;
foreach ( $topics as $topic ) {
if ( ! $shared_steps ) {
$new_topic_id = $topic_cloning_class->clone(
$topic,
array_replace(
$args,
array(
'copy_name' => $topic->post_title,
'new_course_id' => $new_course_id,
'new_lesson_id' => $new_lesson_id,
)
)
);
} else {
// add shared course metadata.
update_post_meta( $topic->ID, "ld_course_$new_course_id", $new_course_id );
}
// Get Topic's Quizzes.
$topic_quizzes = learndash_course_get_quizzes(
$ld_object->ID,
$topic->ID,
array(
'return_type' => 'WP_Post',
'per_page' => 0,
)
);
if ( is_array( $topic_quizzes ) && ! empty( $topic_quizzes ) ) {
foreach ( $topic_quizzes as $topic_quiz ) {
if ( ! $shared_steps ) {
$quiz_cloning_class->clone(
$topic_quiz,
array_replace(
$args,
array(
'copy_name' => $topic_quiz->post_title,
'new_course_id' => $new_course_id,
'new_lesson_id' => $new_topic_id,
)
)
);
} else {
// add shared course metadata.
update_post_meta( $topic_quiz->ID, "ld_course_$new_course_id", $new_course_id );
}
}
} // end topic quizzes.
}
} // end topics.
// Get lesson's quizzes.
$lesson_quizzes = learndash_course_get_quizzes(
$ld_object->ID,
$lesson->ID,
array(
'return_type' => 'WP_Post',
'per_page' => 0,
)
);
if ( is_array( $lesson_quizzes ) && ! empty( $lesson_quizzes ) ) {
foreach ( $lesson_quizzes as $lesson_quiz ) {
if ( ! $shared_steps ) {
$quiz_cloning_class->clone(
$lesson_quiz,
array_replace(
$args,
array(
'copy_name' => $lesson_quiz->post_title,
'new_course_id' => $new_course_id,
'new_lesson_id' => $new_lesson_id,
)
)
);
} else {
// add shared course metadata.
update_post_meta( $lesson_quiz->ID, "ld_course_$new_course_id", $new_course_id );
}
}
} // end lesson quizzes.
}
} // end lessons.
// Get a list of course (global) quizzes.
$global_quizzes = learndash_course_get_quizzes(
$ld_object->ID,
$ld_object->ID,
array(
'return_type' => 'WP_Post',
'per_page' => 0,
)
);
if ( is_array( $global_quizzes ) && ! empty( $global_quizzes ) ) {
foreach ( $global_quizzes as $global_quiz ) {
if ( ! $shared_steps ) {
$quiz_cloning_class->clone(
$global_quiz,
array_replace(
$args,
array(
'copy_name' => $global_quiz->post_title,
'new_course_id' => $new_course_id,
)
)
);
} else {
// add shared course metadata.
update_post_meta( $global_quiz->ID, "ld_course_$new_course_id", $new_course_id );
}
}
} // end global quizzes.
if ( ! $shared_steps ) {
// set a flag to rebuild the ld_course_steps.
learndash_course_set_steps_dirty( $new_course_id );
}
return $new_course_id;
}
/**
* Update the course meta according to the LD logic.
*
* @since 4.2.0
*
* @param WP_Post $course The course object.
* @param int $new_course_id The new course ID.
* @param bool $shared_steps Whether to share steps or not.
*
* @return void
*/
private function course_meta_updates( WP_Post $course, int $new_course_id, bool $shared_steps ): void {
// remove challenge exam while we do not support cloning them.
learndash_update_setting( $new_course_id, 'exam_challenge', '' );
$course_meta = get_post_meta( $course->ID );
if ( is_array( $course_meta ) ) {
foreach ( $course_meta as $meta_key => $meta_value ) {
// update group meta.
$group_enrolled_prefix = 'learndash_group_enrolled';
if ( substr( $meta_key, 0, strlen( $group_enrolled_prefix ) ) === $group_enrolled_prefix ) {
update_post_meta( $new_course_id, $meta_key, time() );
}
}
}
if ( ! $shared_steps ) {
// delete course steps meta.
delete_post_meta( $new_course_id, 'ld_course_steps' );
} else {
// update course on the metadata.
$ld_course_steps = get_post_meta( $new_course_id, 'ld_course_steps', true );
$ld_course_steps['course_id'] = $new_course_id;
update_post_meta( $new_course_id, 'ld_course_steps', $ld_course_steps );
}
}
}
}