PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.9.13
Tutor LMS – eLearning and online course solution v3.9.13
3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 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.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Assets.php
tutor / classes Last commit date
Addons.php 11 months ago Admin.php 2 months ago Ajax.php 9 months ago Announcements.php 1 year ago Assets.php 2 months ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Config.php 11 months ago Container.php 11 months ago Course.php 2 months ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 5 months ago Course_Settings_Tabs.php 1 year ago Course_Widget.php 1 year ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 9 months ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Icon.php 8 months ago Input.php 1 year ago Instructor.php 2 months ago Instructors_List.php 2 months ago Lesson.php 2 weeks ago Options_V2.php 7 months ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 10 months ago Question_Answers_List.php 11 months ago Quiz.php 2 weeks ago QuizBuilder.php 2 weeks ago Quiz_Attempts_List.php 9 months ago RestAPI.php 2 years ago Reviews.php 9 months ago Rewrite_Rules.php 2 years ago Shortcode.php 9 months ago Singleton.php 1 year ago Student.php 2 months ago Students_List.php 1 year ago Taxonomies.php 1 year ago Template.php 9 months ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 3 weeks ago Tutor.php 2 months ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 8 months ago Upgrader.php 9 months ago User.php 4 months ago Utils.php 3 weeks ago Video_Stream.php 3 years ago WhatsNew.php 9 months ago Withdraw.php 1 year ago Withdraw_Requests_List.php 11 months ago WooCommerce.php 7 months ago
Assets.php
746 lines
1 <?php
2 /**
3 * Manage Assets
4 *
5 * @package Tutor
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 use Tutor\Ecommerce\CouponController;
14 use Tutor\Ecommerce\OptionKeys;
15 use Tutor\Ecommerce\OrderController;
16 use Tutor\Ecommerce\Settings;
17 use Tutor\Models\CourseModel;
18
19 if ( ! defined( 'ABSPATH' ) ) {
20 exit;
21 }
22
23 /**
24 * Assets class
25 *
26 * @since 1.0.0
27 */
28 class Assets {
29
30
31 /**
32 * Constructor
33 *
34 * @since 1.0.0
35 *
36 * @since 3.0.0 register hook param added
37 *
38 * @param bool $register_hooks param added to enable or disable registering hooks.
39 *
40 * @return void
41 */
42 public function __construct( $register_hooks = true ) {
43 if ( ! $register_hooks ) {
44 return;
45 }
46
47 /**
48 * Common scripts loading
49 */
50 add_action( 'admin_enqueue_scripts', array( $this, 'common_scripts' ) );
51 add_action( 'wp_enqueue_scripts', array( $this, 'common_scripts' ) );
52 /**
53 * Front and backend script enqueue
54 */
55 add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
56 add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
57
58 add_action( 'admin_enqueue_scripts', array( $this, 'load_meta_data' ) );
59 add_action( 'wp_enqueue_scripts', array( $this, 'load_meta_data' ) );
60
61 /**
62 * Text domain loading
63 */
64 add_action( 'admin_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
65 add_action( 'wp_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
66 add_filter( 'tutor_localize_data', array( $this, 'modify_localize_data' ) );
67
68 /**
69 * Register translatable function to load
70 * Handled script with text domain attached to
71 *
72 * @since 1.9.0
73 */
74 add_action( 'admin_head', array( $this, 'tutor_add_mce_button' ) );
75 add_filter( 'get_the_generator_html', array( $this, 'tutor_generator_tag' ), 10, 2 );
76 add_filter( 'get_the_generator_xhtml', array( $this, 'tutor_generator_tag' ), 10, 2 );
77
78 /**
79 * Add translation support for external tinyMCE button
80 *
81 * @since 1.9.7
82 */
83 add_filter( 'mce_external_languages', array( $this, 'tutor_tinymce_translate' ) );
84
85 /**
86 * Identifier class to body tag
87 *
88 * @since v1.9.9
89 */
90 add_filter( 'body_class', array( $this, 'add_identifier_class_to_body' ) );
91 add_filter( 'admin_body_class', array( $this, 'add_identifier_class_to_body' ) );
92
93 /**
94 * Add edit with front end builder button on Gutenberg editor
95 *
96 * @since v2.0.5
97 */
98 add_action( 'enqueue_block_editor_assets', __CLASS__ . '::add_frontend_editor_button' );
99 }
100
101 /**
102 * Load default localized data
103 *
104 * @since 1.0.0
105 * @return array
106 */
107 public function get_default_localized_data() {
108 $home_url = get_home_url();
109 $parsed = parse_url( $home_url );
110
111 $base_path = ( is_array( $parsed ) && isset( $parsed['path'] ) ) ? $parsed['path'] : '/';
112 $base_path = rtrim( $base_path, '/' ) . '/';
113
114 $post_id = get_the_ID();
115 $post_type = get_post_type( $post_id );
116
117 $current_page = tutor_utils()->get_current_page_slug();
118
119 /**
120 * Only required current user data.
121 *
122 * @since 2.6.2
123 */
124 $current_user = array();
125 $userdata = get_userdata( get_current_user_id() );
126
127 if ( $userdata ) {
128 $current_user = array(
129 'roles' => array_values( $userdata->roles ),
130 'data' => array(
131 'id' => $userdata->ID,
132 'display_name' => $userdata->display_name,
133 ),
134 );
135 }
136
137 $tutor_currency = array(
138 'symbol' => Settings::get_currency_symbol_by_code( tutor_utils()->get_option( OptionKeys::CURRENCY_CODE, 'USD' ) ),
139 'currency' => tutor_utils()->get_option( OptionKeys::CURRENCY_CODE ),
140 'position' => tutor_utils()->get_option( OptionKeys::CURRENCY_POSITION, 'left' ),
141 'thousand_separator' => tutor_utils()->get_option( OptionKeys::THOUSAND_SEPARATOR, ',' ),
142 'decimal_separator' => tutor_utils()->get_option( OptionKeys::DECIMAL_SEPARATOR, '.' ),
143 'no_of_decimal' => tutor_utils()->get_option( OptionKeys::NUMBER_OF_DECIMALS, '2' ),
144 );
145
146 /**
147 * Get only required options.
148 *
149 * @since 3.0.0
150 */
151 $required_options = array(
152 'monetize_by',
153 );
154
155 $tutor_settings = Options_V2::get_only( $required_options );
156
157 return array(
158 'ajaxurl' => admin_url( 'admin-ajax.php' ),
159 'home_url' => rtrim( get_home_url(), '/' ),
160 'site_url' => rtrim( get_site_url(), '/' ),
161 'site_title' => get_bloginfo( 'title' ),
162 'base_path' => tutor()->basepath,
163 'tutor_url' => tutor()->url,
164 'tutor_pro_url' => function_exists( 'tutor_pro' ) ? tutor_pro()->url : null,
165 'nonce_key' => tutor()->nonce,
166 tutor()->nonce => wp_create_nonce( tutor()->nonce_action ),
167 'loading_icon_url' => get_admin_url() . 'images/wpspin_light.gif',
168 'placeholder_img_src' => tutor_placeholder_img_src(),
169 'enable_lesson_classic_editor' => get_tutor_option( 'enable_lesson_classic_editor' ),
170 'tutor_frontend_dashboard_url' => tutor_utils()->get_tutor_dashboard_page_permalink(),
171 'wp_date_format' => tutor_js_date_format_against_wp(),
172 'start_of_week' => get_option( 'start_of_week', 1 ),
173 'is_admin' => is_admin(),
174 'is_admin_bar_showing' => is_admin_bar_showing(),
175 'addons_data' => tutor_utils()->prepare_free_addons_data(),
176 'current_user' => $current_user,
177 'content_change_event' => 'tutor_content_changed_event',
178 'is_tutor_course_edit' => isset( $_GET['action'] ) && 'edit' === $_GET['action'] && tutor()->course_post_type === get_post_type( get_the_ID() ) ? true : false,
179 'assignment_max_file_allowed' => 'tutor_assignments' === $post_type ? (int) tutor_utils()->get_assignment_option( $post_id, 'upload_files_limit' ) : 0,
180 'current_page' => $current_page,
181 'quiz_answer_display_time' => 1000 * (int) tutor_utils()->get_option( 'quiz_answer_display_time' ),
182 'is_ssl' => is_ssl(),
183 'course_list_page_url' => admin_url( 'admin.php?page=tutor' ),
184 'course_post_type' => tutor()->course_post_type,
185 'tutor_currency' => $tutor_currency,
186 'local' => get_locale(),
187 'settings' => $tutor_settings,
188 'max_upload_size' => wp_max_upload_size(),
189 'monetize_by' => tutor_utils()->get_option( 'monetize_by' ),
190 );
191 }
192
193 /**
194 * Enqueue scripts for admin
195 *
196 * @since 1.0.0
197 * @since 3.0.0 Order details & coupon scripts added.
198 *
199 * @return void
200 */
201 public function admin_scripts() {
202 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
203 wp_enqueue_style( 'tutor-admin', tutor()->url . 'assets/css/tutor-admin.min.css', array(), TUTOR_VERSION );
204 /**
205 * Scripts
206 */
207 wp_enqueue_media();
208
209 wp_enqueue_script( 'wp-color-picker' );
210 wp_enqueue_style( 'wp-color-picker' );
211
212 wp_enqueue_script( 'jquery-ui-slider' );
213 wp_enqueue_script( 'jquery-ui-datepicker' );
214
215 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
216 wp_enqueue_script( 'tutor-admin', tutor()->url . 'assets/js/tutor-admin.js', array( 'jquery', 'tutor-script', 'wp-color-picker', 'wp-i18n', 'wp-data' ), TUTOR_VERSION, true );
217
218 // Tutor order detail & coupon scripts.
219 $page = Input::get( 'page', '' );
220 $action = Input::get( 'action' );
221 $sub_page = Input::get( 'sub_page' );
222
223 $allowed_actions = array( 'add_new', 'edit' );
224
225 if ( tutor_utils()->is_monetize_by_tutor() ) {
226 if ( OrderController::PAGE_SLUG === $page && 'edit' === $action ) {
227 wp_enqueue_script( 'tutor-order-details', tutor()->url . 'assets/js/tutor-order-details.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
228 }
229
230 if ( CouponController::PAGE_SLUG === $page && in_array( $action, $allowed_actions, true ) ) {
231 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-coupon.js', array( 'wp-date', 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
232 }
233
234 // @since 3.0.0 add tax react app on the settings page.
235 if ( 'tutor_settings' === $page && ! Input::has( 'edit' ) ) {
236 wp_enqueue_editor();
237 wp_enqueue_script( 'tutor-tax-settings', tutor()->url . 'assets/js/tutor-tax-settings.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
238 wp_enqueue_script( 'tutor-payment-settings', tutor()->url . 'assets/js/tutor-payment-settings.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
239 }
240 }
241
242 if ( 'tutor-tools' === $page && 'import_export' === $sub_page ) {
243 wp_enqueue_script( 'tutor-import-export', tutor()->url . 'assets/js/tutor-import-export.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
244 }
245
246 if ( 'tutor-addons' === $page ) {
247 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-addon-list.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
248 }
249 }
250
251 /**
252 * Load frontend scripts
253 *
254 * @since 1.0.0
255 * @return void
256 */
257 public function frontend_scripts() {
258 global $post, $wp_query;
259
260 /**
261 * We checked wp_enqueue_editor() in condition because it conflicting with Divi Builder
262 * condition updated @since v.1.7.4
263 *
264 * @since 2.7.0 is_user_logged_in() check added to remove duplicate H1 tag on each single post.
265 */
266 if ( is_single() && is_user_logged_in() ) {
267 if ( function_exists( 'et_pb_is_pagebuilder_used' ) ) {
268 $is_page_builder_used = et_pb_is_pagebuilder_used( get_the_ID() );
269 if ( ! $is_page_builder_used ) {
270 wp_enqueue_editor();
271 }
272 } else {
273 wp_enqueue_editor();
274 }
275 }
276
277 /**
278 * Initializing quicktags script to use in wp_editor();
279 */
280 wp_enqueue_script( 'quicktags' );
281
282 $tutor_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
283 if ( get_the_ID() === $tutor_dashboard_page_id ) {
284 wp_enqueue_media();
285 }
286
287 /**
288 * Enabling Sorting, draggable, droppable...
289 */
290 wp_enqueue_script( 'jquery-ui-sortable' );
291 wp_enqueue_script('jquery-touch-punch', ['jquery-ui-sortable']); //phpcs:ignore
292
293 // Plyr.
294 if ( is_single_course( true ) ) {
295 wp_enqueue_style( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.css', array(), TUTOR_VERSION );
296 wp_enqueue_script( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.polyfilled.min.js', array( 'jquery' ), TUTOR_VERSION, true );
297 }
298
299 // Social Share.
300 wp_enqueue_script( 'tutor-social-share', tutor()->url . 'assets/lib/SocialShare/SocialShare.min.js', array( 'jquery' ), TUTOR_VERSION, true );
301
302 /**
303 * Chart Data
304 */
305 if ( ! empty( $wp_query->query_vars['tutor_dashboard_page'] ) ) {
306 wp_enqueue_script( 'jquery-ui-slider' );
307
308 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
309 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
310
311 if ( 'earning' === $wp_query->query_vars['tutor_dashboard_page'] ) {
312 wp_enqueue_script( 'tutor-front-chart-js', tutor()->url . 'assets/lib/Chart.bundle.min.js', array(), TUTOR_VERSION );
313 wp_enqueue_script( 'jquery-ui-datepicker' );
314 }
315 }
316 /**
317 * Dependency wp-i18n added for translate js file
318 *
319 * @since 1.9.0
320 */
321 wp_enqueue_style( 'tutor-frontend', tutor()->url . 'assets/css/tutor-front.min.css', array(), TUTOR_VERSION );
322 wp_enqueue_script( 'tutor-frontend', tutor()->url . 'assets/js/tutor-front.js', array( 'jquery', 'wp-i18n', 'wp-date' ), TUTOR_VERSION, true );
323
324 /**
325 * Load frontend dashboard style
326 *
327 * @since v1.9.8
328 */
329 $should_load_dashboard_styles = apply_filters( 'tutor_should_load_dashboard_styles', tutor_utils()->is_tutor_frontend_dashboard() );
330 if ( $should_load_dashboard_styles ) {
331 wp_enqueue_style( 'tutor-frontend-dashboard-css', tutor()->url . 'assets/css/tutor-frontend-dashboard.min.css', array(), TUTOR_VERSION );
332 }
333
334 // Load date picker for announcement at frontend.
335 wp_enqueue_script( 'jquery-ui-datepicker' );
336 $css = '.mce-notification.mce-notification-error{display: none !important;}';
337 wp_add_inline_style( 'tutor-frontend', $css );
338 }
339
340 /**
341 * Modify localize data
342 *
343 * @since 1.0.0
344 *
345 * @param array $localize_data localize data.
346 * @return array
347 */
348 public function modify_localize_data( $localize_data ) {
349 global $post;
350
351 if ( is_admin() ) {
352 $taxonomy = Input::get( 'taxonomy' );
353 if ( CourseModel::COURSE_CATEGORY === $taxonomy || CourseModel::COURSE_TAG === $taxonomy ) {
354 $localize_data['open_tutor_admin_menu'] = true;
355 }
356
357 if ( 'en_US' !== $localize_data['local'] ) {
358 $page = Input::get( 'page', '' );
359 $action = Input::get( 'action' );
360 $allowed_actions = array( 'add_new', 'edit' );
361 if ( CouponController::PAGE_SLUG === $page && in_array( $action, $allowed_actions, true ) ) {
362 $localize_data['coupon_main_content_locales'] = tutils()->get_script_locale_data( 'tutor-coupon-main-content', $localize_data['local'] );
363 }
364 }
365 } else {
366
367 // Assign quiz option.
368 if ( ! empty( $post->post_type ) && 'tutor_quiz' === $post->post_type ) {
369 $single_quiz_options = (array) tutor_utils()->get_quiz_option( $post->ID );
370 $saved_quiz_options = array(
371 'quiz_when_time_expires' => tutor_utils()->get_option( 'quiz_when_time_expires' ),
372 );
373
374 $quiz_options = array_merge( $single_quiz_options, $saved_quiz_options );
375
376 $previous_attempts = tutor_utils()->quiz_attempts();
377
378 if ( $previous_attempts && count( $previous_attempts ) ) {
379 $quiz_options['quiz_auto_start'] = 0;
380 }
381
382 $localize_data['quiz_options'] = $quiz_options;
383 }
384
385 // Including player assets if video exists.
386 if ( tutor_utils()->has_video_in_single() ) {
387 $localize_data['post_id'] = get_the_ID();
388 $localize_data['best_watch_time'] = 0;
389
390 $best_watch_time = tutor_utils()->get_lesson_reading_info( get_the_ID(), 0, 'video_best_watched_time' );
391 if ( $best_watch_time > 0 ) {
392 $localize_data['best_watch_time'] = $best_watch_time;
393 }
394 }
395 }
396
397 return $localize_data;
398 }
399
400 /**
401 * Load common scripts for frontend and backend
402 *
403 * @since 1.0.0
404 * @return void
405 */
406 public function common_scripts() {
407
408 /**
409 * Load TinyMCE for tutor settings page if tutor pro is not available.
410 *
411 * @since v2.0.8
412 */
413 $baseurl = includes_url( 'js/tinymce' );
414 $current_page = Input::get( 'page' );
415
416 // If it is settings page & tutor pro not activated.
417 if ( 'tutor_settings' === $current_page && ! wp_script_is( 'wp-tinymce-root' ) ) {
418 wp_enqueue_script( 'tutor-tiny', $baseurl . '/tinymce.min.js', array( 'jquery' ), TUTOR_VERSION, true );
419 }
420 wp_enqueue_style( 'tutor-icon', tutor()->url . 'assets/css/tutor-icon.min.css', array(), TUTOR_VERSION );
421
422 // Common css library.
423 if ( is_rtl() ) {
424 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor-rtl.min.css', array(), TUTOR_VERSION );
425 } else {
426 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.min.css', array(), TUTOR_VERSION );
427 }
428
429 /**
430 * Load tutor common scripts both backend and frontend
431 *
432 * @since v2.0.0
433 */
434 wp_enqueue_script( 'tutor-script', tutor()->url . 'assets/js/tutor.js', array( 'jquery', 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
435
436 /**
437 * Enqueue datetime countdown scripts & styles
438 *
439 * Add filter to enqueue countdown scripts & styles
440 * don't return false if it is true to prevent conflict
441 * with other filters
442 *
443 * @since v2.1.0
444 */
445 $should_enqueue = apply_filters( 'tutor_should_enqueue_countdown_scripts', false );
446 if ( $should_enqueue ) {
447 wp_enqueue_script( 'tutor-moment', tutor()->url . 'assets/lib/countdown/moment.min.js', array(), TUTOR_VERSION, true );
448
449 wp_enqueue_script( 'tutor-moment-timezone', tutor()->url . 'assets/lib/countdown/moment-timezone-with-data.min.js', array(), TUTOR_VERSION, true );
450
451 wp_enqueue_script( 'tutor-jquery-countdown', tutor()->url . 'assets/lib/countdown/jquery.countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
452
453 wp_enqueue_script( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
454
455 wp_enqueue_style( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.css', '', TUTOR_VERSION );
456 }
457 }
458
459 /**
460 * Load meta data
461 *
462 * @since 1.0.0
463 * @return void
464 */
465 public function load_meta_data() {
466 // Localize scripts.
467 $localize_data = apply_filters( 'tutor_localize_data', $this->get_default_localized_data() );
468 wp_localize_script( 'tutor-frontend', '_tutorobject', $localize_data );
469 wp_localize_script( 'tutor-admin', '_tutorobject', $localize_data );
470 wp_localize_script( 'tutor-script', '_tutorobject', $localize_data );
471 wp_localize_script( 'tutor-order-details', '_tutorobject', $localize_data );
472 wp_localize_script( 'tutor-tax-settings', '_tutorobject', $localize_data );
473 wp_localize_script( 'tutor-coupon', '_tutorobject', $localize_data );
474 wp_localize_script( 'tutor-course-builder', '_tutorobject', $localize_data );
475
476 // Inline styles.
477 wp_add_inline_style( 'tutor-frontend', $this->load_color_palette() );
478 wp_add_inline_style( 'tutor-admin', $this->load_color_palette() );
479 }
480
481 /**
482 * Load color palette
483 *
484 * @since 1.0.0
485 * @return string
486 */
487 private function load_color_palette() {
488 $colors = array(
489 'tutor_primary_color' => '--tutor-color-primary',
490 'tutor_primary_hover_color' => '--tutor-color-primary-hover',
491 'tutor_text_color' => '--tutor-body-color',
492 'tutor_border_color' => '--tutor-border-color',
493 'tutor_gray_color' => '--tutor-color-gray',
494 );
495
496 // Admin colors.
497 $admin_colors = array();
498 if ( is_admin() ) {
499 $admin_colors = array(
500 '--tutor-color-primary' => '#3E64DE',
501 '--tutor-color-primary-hover' => '#3A5CCC',
502 '--tutor-body-color' => '#212327',
503 '--tutor-border-color' => '#CDCFD5',
504 '--tutor-color-gray' => '#CDCFD5',
505 );
506 }
507
508 $fallback_colors = array(
509 'tutor_primary_color' => '#3E64DE',
510 'tutor_primary_hover_color' => '#3A5CCC',
511 'tutor_text_color' => '#212327',
512 'tutor_border_color' => '#E3E5EB',
513 'tutor_gray_color' => '#CDCFD5',
514 );
515
516 $color_string = '';
517 foreach ( $colors as $key => $property ) {
518 $fallback_color = isset( $fallback_colors[ $key ] ) ? $fallback_colors[ $key ] : '#212327';
519 $color = tutor_utils()->get_option( $key, $fallback_color );
520 $color_rgb = tutor_utils()->hex2rgb( $color );
521
522 if ( is_admin() && isset( $admin_colors[ $property ] ) ) {
523 $color = $admin_colors[ $property ];
524 $color_rgb = tutor_utils()->hex2rgb( $admin_colors[ $property ] );
525 }
526
527 if ( $color ) {
528 $color_string .= $property . ':' . $color . ';';
529 }
530
531 if ( $color_rgb ) {
532 $color_string .= $property . '-rgb:' . $color_rgb . ';';
533 }
534 }
535
536 return ':root{' . $color_string . '}';
537 }
538
539 /**
540 * Add Tinymce button for placing shortcode
541 *
542 * @since 1.0.0
543 * @return void|null
544 */
545 public function tutor_add_mce_button() {
546 // Check user permissions.
547 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
548 return;
549 }
550 // Check if WYSIWYG is enabled.
551 if ( 'true' == get_user_option( 'rich_editing' ) ) {
552 add_filter( 'mce_external_plugins', array( $this, 'tutor_add_tinymce_js' ) );
553 add_filter( 'mce_buttons', array( $this, 'tutor_register_mce_button' ) );
554 }
555 }
556
557 /**
558 * Add tinymce button
559 *
560 * @since 1.0.0
561 *
562 * @param array $plugin_array plugin array.
563 * @return array
564 */
565 public function tutor_add_tinymce_js( $plugin_array ) {
566 $plugin_array['tutor_button'] = tutor()->url . 'assets/lib/mce-button.js';
567 return $plugin_array;
568 }
569
570 /**
571 * Register new button in the editor
572 *
573 * @since 1.0.0
574 *
575 * @param array $buttons buttons.
576 * @return array
577 */
578 public function tutor_register_mce_button( $buttons ) {
579 array_push( $buttons, 'tutor_button' );
580 return $buttons;
581 }
582
583 /**
584 * Output generator tag to aid debugging.
585 *
586 * @since 1.0.0
587 *
588 * @param string $gen Generator.
589 * @param string $type Type.
590 *
591 * @return string
592 */
593 public function tutor_generator_tag( $gen, $type ) {
594 switch ( $type ) {
595 case 'html':
596 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '">';
597 break;
598 case 'xhtml':
599 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '" />';
600 break;
601 }
602 return $gen;
603 }
604
605 /**
606 * Load text domain handled script after all enqueue_scripts
607 * registered functions
608 *
609 * @since 1.9.0
610 * @since 3.9.2 Refactored to dynamically detect scripts instead of hardcoded list.
611 *
612 * @return void
613 */
614 public function tutor_script_text_domain() {
615 global $wp_scripts;
616
617 if ( empty( $wp_scripts->registered ) ) {
618 return;
619 }
620
621 foreach ( $wp_scripts->registered as $handle => $data ) {
622 $src = $data->src ?? '';
623 $is_from_tutor = str_contains( $src, 'tutor/assets/js' );
624
625 if ( ! $is_from_tutor ) {
626 continue;
627 }
628
629 wp_set_script_translations( $handle, 'tutor', tutor()->path . 'languages/' );
630 }
631 }
632
633 /**
634 * Add translation support for external tinyMCE button
635 *
636 * @since 1.9.7
637 * @return array
638 */
639 public function tutor_tinymce_translate() {
640 $locales['tutor_button'] = tutor()->path . 'includes/tinymce_translate.php';
641 return $locales;
642 }
643
644 /**
645 * Add an identifier class to body
646 *
647 * @since 1.0.0
648 *
649 * @param mixed $classes classes.
650 * @return mixed
651 */
652 public function add_identifier_class_to_body( $classes ) {
653 $course_builder_screen = tutor_utils()->get_course_builder_screen();
654 $to_add = array( 'tutor-lms' );
655
656 // Add backend course editor identifier class to body.
657 if ( $course_builder_screen ) {
658 $to_add[] = is_admin() ? 'tutor-backend' : 'tutor-frontend';
659 $to_add[] = ' tutor-screen-course-builder tutor-screen-course-builder-' . $course_builder_screen . ' ';
660 }
661
662 // Add frontend course builder identifier class.
663 if ( ! $course_builder_screen && tutor_utils()->is_tutor_frontend_dashboard() ) {
664 $to_add[] = 'tutor-screen-frontend-dashboard';
665 }
666
667 if ( is_post_type_archive( tutor()->course_post_type ) ) {
668 $to_add[] = 'tutor-frontend';
669 }
670
671 if ( tutor_utils()->is_tutor_frontend_dashboard() ) {
672 $to_add[] = 'tutor-frontend';
673 }
674
675 if ( is_single() ) {
676 global $post;
677
678 $post_types = array(
679 tutor()->course_post_type,
680 tutor()->lesson_post_type,
681 tutor()->quiz_post_type,
682 tutor()->assignment_post_type,
683 tutor()->zoom_post_type,
684 tutor()->meet_post_type,
685 );
686
687 if ( isset( $post->post_type ) && in_array( $post->post_type, $post_types, true ) ) {
688 $to_add[] = 'tutor-frontend';
689 }
690 }
691
692 if ( is_admin() ) {
693 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
694 $base = ( $screen && is_object( $screen ) && property_exists( $screen, 'base' ) ) ? $screen->base : '';
695 $index = strpos( $base, 'tutor' );
696
697 if ( 0 === $index || $index > 0 ) {
698 $to_add[] = 'tutor-backend';
699
700 $page = Input::get( 'page' );
701 if ( 'tutor_settings' === $page ) {
702 $to_add[] = 'tutor-screen-backend-settings ';
703 }
704 if ( ! empty( $page ) ) {
705 $to_add[] = 'tutor-backend-' . $page;
706 }
707 }
708 }
709
710 // Remove duplicate classes if any.
711 $to_add = array_unique( $to_add );
712
713 if ( is_array( $classes ) ) {
714 $classes = array_merge( $classes, $to_add );
715 } else {
716 $classes .= implode( ' ', $to_add );
717 }
718
719 return $classes;
720 }
721
722 /**
723 * Enqueue script for adding edit with frontend course builder button
724 * on the Gutenberg editor
725 *
726 * @since 2.0.5
727 * @return void
728 */
729 public static function add_frontend_editor_button() {
730 $wp_screen = get_current_screen();
731
732 if ( is_a( $wp_screen, 'WP_Screen' ) && tutor()->course_post_type === $wp_screen->post_type ) {
733 wp_enqueue_script( 'tutor-gutenberg', tutor()->url . 'assets/js/tutor-gutenberg.js', array(), TUTOR_VERSION, true );
734 $data = array(
735 'frontend_dashboard_url' => esc_url( trailingslashit( tutor_utils()->tutor_dashboard_url( 'create-course' ) ) ) . '?course_id=' . get_the_ID(),
736 );
737
738 wp_add_inline_script(
739 'tutor-gutenberg',
740 'const tutorInlineData =' . json_encode( $data ),
741 'before'
742 );
743 }
744 }
745 }
746