PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.3.0
Tutor LMS – eLearning and online course solution v3.3.0
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 1 year ago Admin.php 1 year ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 1 year ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Course.php 1 year ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 1 year 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 1 year ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Input.php 1 year ago Instructor.php 1 year ago Instructors_List.php 1 year ago Lesson.php 1 year ago Options_V2.php 1 year ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 1 year ago Question_Answers_List.php 3 years ago Quiz.php 1 year ago QuizBuilder.php 1 year ago Quiz_Attempts_List.php 1 year ago RestAPI.php 2 years ago Reviews.php 3 years ago Rewrite_Rules.php 2 years ago Shortcode.php 1 year ago Singleton.php 1 year ago Student.php 1 year ago Students_List.php 3 years ago Taxonomies.php 1 year ago Template.php 1 year ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 1 year ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 1 year ago User.php 1 year ago Utils.php 1 year ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 1 year ago Withdraw_Requests_List.php 1 year ago WooCommerce.php 1 year ago
Assets.php
717 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 'is_admin' => is_admin(),
173 'is_admin_bar_showing' => is_admin_bar_showing(),
174 'addons_data' => tutor_utils()->prepare_free_addons_data(),
175 'current_user' => $current_user,
176 'content_change_event' => 'tutor_content_changed_event',
177 'is_tutor_course_edit' => isset( $_GET['action'] ) && 'edit' === $_GET['action'] && tutor()->course_post_type === get_post_type( get_the_ID() ) ? true : false,
178 'assignment_max_file_allowed' => 'tutor_assignments' === $post_type ? (int) tutor_utils()->get_assignment_option( $post_id, 'upload_files_limit' ) : 0,
179 'current_page' => $current_page,
180 'quiz_answer_display_time' => 1000 * (int) tutor_utils()->get_option( 'quiz_answer_display_time' ),
181 'is_ssl' => is_ssl(),
182 'course_list_page_url' => admin_url( 'admin.php?page=tutor' ),
183 'course_post_type' => tutor()->course_post_type,
184 'tutor_currency' => $tutor_currency,
185 'local' => get_locale(),
186 'settings' => $tutor_settings,
187 );
188 }
189
190 /**
191 * Enqueue scripts for admin
192 *
193 * @since 1.0.0
194 * @since 3.0.0 Order details & coupon scripts added.
195 *
196 * @return void
197 */
198 public function admin_scripts() {
199 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
200 wp_enqueue_style( 'tutor-admin', tutor()->url . 'assets/css/tutor-admin.min.css', array(), TUTOR_VERSION );
201 /**
202 * Scripts
203 */
204 wp_enqueue_media();
205
206 wp_enqueue_script( 'wp-color-picker' );
207 wp_enqueue_style( 'wp-color-picker' );
208
209 wp_enqueue_script( 'jquery-ui-slider' );
210 wp_enqueue_script( 'jquery-ui-datepicker' );
211
212 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
213 wp_enqueue_script( 'tutor-admin', tutor()->url . 'assets/js/tutor-admin.min.js', array( 'jquery', 'tutor-script', 'wp-color-picker', 'wp-i18n', 'wp-data' ), TUTOR_VERSION, true );
214
215 // Tutor order detail & coupon scripts.
216 $page = Input::get( 'page', '' );
217 $action = Input::get( 'action' );
218
219 $allowed_actions = array( 'add_new', 'edit' );
220
221 if ( tutor_utils()->is_monetize_by_tutor() ) {
222 if ( OrderController::PAGE_SLUG === $page && 'edit' === $action ) {
223 wp_enqueue_script( 'tutor-shared', tutor()->url . 'assets/js/tutor-shared.min.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
224 wp_enqueue_script( 'tutor-order-details', tutor()->url . 'assets/js/tutor-order-details.min.js', array( 'wp-i18n', 'wp-element', 'tutor-shared' ), TUTOR_VERSION, true );
225 }
226
227 if ( CouponController::PAGE_SLUG === $page && in_array( $action, $allowed_actions, true ) ) {
228 wp_enqueue_script( 'tutor-shared', tutor()->url . 'assets/js/tutor-shared.min.js', array( 'wp-date', 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
229 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-coupon.min.js', array( 'tutor-shared' ), TUTOR_VERSION, true );
230 }
231
232 // @since 3.0.0 add tax react app on the settings page.
233 if ( 'tutor_settings' === $page && ! Input::has( 'edit' ) ) {
234 wp_enqueue_script( 'tutor-shared', tutor()->url . 'assets/js/tutor-shared.min.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
235 wp_enqueue_script( 'tutor-tax-settings', tutor()->url . 'assets/js/tutor-tax-settings.min.js', array( 'tutor-shared' ), TUTOR_VERSION, true );
236 wp_enqueue_script( 'tutor-payment-settings', tutor()->url . 'assets/js/tutor-payment-settings.min.js', array( 'tutor-shared' ), TUTOR_VERSION, true );
237 }
238 }
239
240 if ( 'tutor-addons' === $page ) {
241 wp_enqueue_script( 'tutor-shared', tutor()->url . 'assets/js/tutor-shared.min.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
242 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-addon-list.min.js', array( 'wp-i18n', 'wp-element', 'tutor-shared' ), TUTOR_VERSION, true );
243 }
244 }
245
246 /**
247 * Load frontend scripts
248 *
249 * @since 1.0.0
250 * @return void
251 */
252 public function frontend_scripts() {
253 global $post, $wp_query;
254
255 /**
256 * We checked wp_enqueue_editor() in condition because it conflicting with Divi Builder
257 * condition updated @since v.1.7.4
258 *
259 * @since 2.7.0 is_user_logged_in() check added to remove duplicate H1 tag on each single post.
260 */
261 if ( is_single() && is_user_logged_in() ) {
262 if ( function_exists( 'et_pb_is_pagebuilder_used' ) ) {
263 $is_page_builder_used = et_pb_is_pagebuilder_used( get_the_ID() );
264 if ( ! $is_page_builder_used ) {
265 wp_enqueue_editor();
266 }
267 } else {
268 wp_enqueue_editor();
269 }
270 }
271
272 /**
273 * Initializing quicktags script to use in wp_editor();
274 */
275 wp_enqueue_script( 'quicktags' );
276
277 $tutor_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
278 if ( get_the_ID() === $tutor_dashboard_page_id ) {
279 wp_enqueue_media();
280 }
281
282 /**
283 * Enabling Sorting, draggable, droppable...
284 */
285 wp_enqueue_script( 'jquery-ui-sortable' );
286 wp_enqueue_script('jquery-touch-punch', ['jquery-ui-sortable']); //phpcs:ignore
287
288 // Plyr.
289 if ( is_single_course( true ) ) {
290 wp_enqueue_style( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.css', array(), TUTOR_VERSION );
291 wp_enqueue_script( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.polyfilled.min.js', array( 'jquery' ), TUTOR_VERSION, true );
292 }
293
294 // Social Share.
295 wp_enqueue_script( 'tutor-social-share', tutor()->url . 'assets/lib/SocialShare/SocialShare.min.js', array( 'jquery' ), TUTOR_VERSION, true );
296
297 /**
298 * Chart Data
299 */
300 if ( ! empty( $wp_query->query_vars['tutor_dashboard_page'] ) ) {
301 wp_enqueue_script( 'jquery-ui-slider' );
302
303 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
304 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
305
306 if ( 'earning' === $wp_query->query_vars['tutor_dashboard_page'] ) {
307 wp_enqueue_script( 'tutor-front-chart-js', tutor()->url . 'assets/lib/Chart.bundle.min.js', array(), TUTOR_VERSION );
308 wp_enqueue_script( 'jquery-ui-datepicker' );
309 }
310 }
311 /**
312 * Dependency wp-i18n added for translate js file
313 *
314 * @since 1.9.0
315 */
316 wp_enqueue_style( 'tutor-frontend', tutor()->url . 'assets/css/tutor-front.min.css', array(), TUTOR_VERSION );
317 wp_enqueue_script( 'tutor-frontend', tutor()->url . 'assets/js/tutor-front.min.js', array( 'jquery', 'wp-i18n', 'wp-date' ), TUTOR_VERSION, true );
318
319 /**
320 * Load frontend dashboard style
321 *
322 * @since v1.9.8
323 */
324 $should_load_dashboard_styles = apply_filters( 'tutor_should_load_dashboard_styles', tutor_utils()->is_tutor_frontend_dashboard() );
325 if ( $should_load_dashboard_styles ) {
326 wp_enqueue_style( 'tutor-frontend-dashboard-css', tutor()->url . 'assets/css/tutor-frontend-dashboard.min.css', array(), TUTOR_VERSION );
327 }
328
329 // Load date picker for announcement at frontend.
330 wp_enqueue_script( 'jquery-ui-datepicker' );
331 $css = '.mce-notification.mce-notification-error{display: none !important;}';
332 wp_add_inline_style( 'tutor-frontend', $css );
333 }
334
335 /**
336 * Modify localize data
337 *
338 * @since 1.0.0
339 *
340 * @param array $localize_data localize data.
341 * @return array
342 */
343 public function modify_localize_data( $localize_data ) {
344 global $post;
345
346 if ( is_admin() ) {
347 $taxonomy = Input::get( 'taxonomy' );
348 if ( CourseModel::COURSE_CATEGORY === $taxonomy || CourseModel::COURSE_TAG === $taxonomy ) {
349 $localize_data['open_tutor_admin_menu'] = true;
350 }
351 } else {
352
353 // Assign quiz option.
354 if ( ! empty( $post->post_type ) && 'tutor_quiz' === $post->post_type ) {
355 $single_quiz_options = (array) tutor_utils()->get_quiz_option( $post->ID );
356 $saved_quiz_options = array(
357 'quiz_when_time_expires' => tutor_utils()->get_option( 'quiz_when_time_expires' ),
358 );
359
360 $quiz_options = array_merge( $single_quiz_options, $saved_quiz_options );
361
362 $previous_attempts = tutor_utils()->quiz_attempts();
363
364 if ( $previous_attempts && count( $previous_attempts ) ) {
365 $quiz_options['quiz_auto_start'] = 0;
366 }
367
368 $localize_data['quiz_options'] = $quiz_options;
369 }
370
371 // Including player assets if video exists.
372 if ( tutor_utils()->has_video_in_single() ) {
373 $localize_data['post_id'] = get_the_ID();
374 $localize_data['best_watch_time'] = 0;
375
376 $best_watch_time = tutor_utils()->get_lesson_reading_info( get_the_ID(), 0, 'video_best_watched_time' );
377 if ( $best_watch_time > 0 ) {
378 $localize_data['best_watch_time'] = $best_watch_time;
379 }
380 }
381 }
382
383 return $localize_data;
384 }
385
386 /**
387 * Load common scripts for frontend and backend
388 *
389 * @since 1.0.0
390 * @return void
391 */
392 public function common_scripts() {
393
394 /**
395 * Load TinyMCE for tutor settings page if tutor pro is not available.
396 *
397 * @since v2.0.8
398 */
399 $baseurl = includes_url( 'js/tinymce' );
400 $current_page = Input::get( 'page' );
401
402 // If it is settings page & tutor pro not activated.
403 if ( 'tutor_settings' === $current_page && ! wp_script_is( 'wp-tinymce-root' ) ) {
404 wp_enqueue_script( 'tutor-tiny', $baseurl . '/tinymce.min.js', array( 'jquery' ), TUTOR_VERSION, true );
405 }
406 wp_enqueue_style( 'tutor-icon', tutor()->url . 'assets/css/tutor-icon.min.css', array(), TUTOR_VERSION );
407
408 // Common css library.
409 if ( is_rtl() ) {
410 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.rtl.min.css', array(), TUTOR_VERSION );
411 } else {
412 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.min.css', array(), TUTOR_VERSION );
413 }
414
415 /**
416 * Load tutor common scripts both backend and frontend
417 *
418 * @since v2.0.0
419 */
420 wp_enqueue_script( 'tutor-script', tutor()->url . 'assets/js/tutor.min.js', array( 'jquery', 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
421
422 /**
423 * Enqueue datetime countdown scripts & styles
424 *
425 * Add filter to enqueue countdown scripts & styles
426 * don't return false if it is true to prevent conflict
427 * with other filters
428 *
429 * @since v2.1.0
430 */
431 $should_enqueue = apply_filters( 'tutor_should_enqueue_countdown_scripts', false );
432 if ( $should_enqueue ) {
433 wp_enqueue_script( 'tutor-moment', tutor()->url . 'assets/lib/countdown/moment.min.js', array(), TUTOR_VERSION, true );
434
435 wp_enqueue_script( 'tutor-moment-timezone', tutor()->url . 'assets/lib/countdown/moment-timezone-with-data.min.js', array(), TUTOR_VERSION, true );
436
437 wp_enqueue_script( 'tutor-jquery-countdown', tutor()->url . 'assets/lib/countdown/jquery.countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
438
439 wp_enqueue_script( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
440
441 wp_enqueue_style( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.css', '', TUTOR_VERSION );
442 }
443 }
444
445 /**
446 * Load meta data
447 *
448 * @since 1.0.0
449 * @return void
450 */
451 public function load_meta_data() {
452 // Localize scripts.
453 $localize_data = apply_filters( 'tutor_localize_data', $this->get_default_localized_data() );
454 wp_localize_script( 'tutor-frontend', '_tutorobject', $localize_data );
455 wp_localize_script( 'tutor-admin', '_tutorobject', $localize_data );
456 wp_localize_script( 'tutor-script', '_tutorobject', $localize_data );
457 wp_localize_script( 'tutor-order-details', '_tutorobject', $localize_data );
458 wp_localize_script( 'tutor-tax-settings', '_tutorobject', $localize_data );
459 wp_localize_script( 'tutor-coupon', '_tutorobject', $localize_data );
460 wp_localize_script( 'tutor-course-builder', '_tutorobject', $localize_data );
461
462 // Inline styles.
463 wp_add_inline_style( 'tutor-frontend', $this->load_color_palette() );
464 wp_add_inline_style( 'tutor-admin', $this->load_color_palette() );
465 }
466
467 /**
468 * Load color palette
469 *
470 * @since 1.0.0
471 * @return string
472 */
473 private function load_color_palette() {
474 $colors = array(
475 'tutor_primary_color' => '--tutor-color-primary',
476 'tutor_primary_hover_color' => '--tutor-color-primary-hover',
477 'tutor_text_color' => '--tutor-body-color',
478 'tutor_border_color' => '--tutor-border-color',
479 'tutor_gray_color' => '--tutor-color-gray',
480 );
481
482 // Admin colors.
483 $admin_colors = array();
484 if ( is_admin() ) {
485 $admin_colors = array(
486 '--tutor-color-primary' => '#3E64DE',
487 '--tutor-color-primary-hover' => '#3A5CCC',
488 '--tutor-body-color' => '#212327',
489 '--tutor-border-color' => '#CDCFD5',
490 '--tutor-color-gray' => '#CDCFD5',
491 );
492 }
493
494 $fallback_colors = array(
495 'tutor_primary_color' => '#3E64DE',
496 'tutor_primary_hover_color' => '#3A5CCC',
497 'tutor_text_color' => '#212327',
498 'tutor_border_color' => '#E3E5EB',
499 'tutor_gray_color' => '#CDCFD5',
500 );
501
502 $color_string = '';
503 foreach ( $colors as $key => $property ) {
504 $fallback_color = isset( $fallback_colors[ $key ] ) ? $fallback_colors[ $key ] : '#212327';
505 $color = tutor_utils()->get_option( $key, $fallback_color );
506 $color_rgb = tutor_utils()->hex2rgb( $color );
507
508 if ( is_admin() && isset( $admin_colors[ $property ] ) ) {
509 $color = $admin_colors[ $property ];
510 $color_rgb = tutor_utils()->hex2rgb( $admin_colors[ $property ] );
511 }
512
513 if ( $color ) {
514 $color_string .= $property . ':' . $color . ';';
515 }
516
517 if ( $color_rgb ) {
518 $color_string .= $property . '-rgb:' . $color_rgb . ';';
519 }
520 }
521
522 return ':root{' . $color_string . '}';
523 }
524
525 /**
526 * Add Tinymce button for placing shortcode
527 *
528 * @since 1.0.0
529 * @return void|null
530 */
531 public function tutor_add_mce_button() {
532 // Check user permissions.
533 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
534 return;
535 }
536 // Check if WYSIWYG is enabled.
537 if ( 'true' == get_user_option( 'rich_editing' ) ) {
538 add_filter( 'mce_external_plugins', array( $this, 'tutor_add_tinymce_js' ) );
539 add_filter( 'mce_buttons', array( $this, 'tutor_register_mce_button' ) );
540 }
541 }
542
543 /**
544 * Add tinymce button
545 *
546 * @since 1.0.0
547 *
548 * @param array $plugin_array plugin array.
549 * @return array
550 */
551 public function tutor_add_tinymce_js( $plugin_array ) {
552 $plugin_array['tutor_button'] = tutor()->url . 'assets/lib/mce-button.js';
553 return $plugin_array;
554 }
555
556 /**
557 * Register new button in the editor
558 *
559 * @since 1.0.0
560 *
561 * @param array $buttons buttons.
562 * @return array
563 */
564 public function tutor_register_mce_button( $buttons ) {
565 array_push( $buttons, 'tutor_button' );
566 return $buttons;
567 }
568
569 /**
570 * Output generator tag to aid debugging.
571 *
572 * @since 1.0.0
573 *
574 * @param string $gen Generator.
575 * @param string $type Type.
576 *
577 * @return string
578 */
579 public function tutor_generator_tag( $gen, $type ) {
580 switch ( $type ) {
581 case 'html':
582 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '">';
583 break;
584 case 'xhtml':
585 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '" />';
586 break;
587 }
588 return $gen;
589 }
590
591 /**
592 * Load text domain handled script after all enqueue_scripts
593 * registered functions
594 *
595 * @since 1.9.0
596 * @return void
597 */
598 public function tutor_script_text_domain() {
599 wp_set_script_translations( 'tutor-frontend', 'tutor', tutor()->path . 'languages/' );
600 wp_set_script_translations( 'tutor-admin', 'tutor', tutor()->path . 'languages/' );
601 wp_set_script_translations( 'tutor-course-builder', 'tutor', tutor()->path . 'languages/' );
602 }
603
604 /**
605 * Add translation support for external tinyMCE button
606 *
607 * @since 1.9.7
608 * @return array
609 */
610 public function tutor_tinymce_translate() {
611 $locales['tutor_button'] = tutor()->path . 'includes/tinymce_translate.php';
612 return $locales;
613 }
614
615 /**
616 * Add an identifier class to body
617 *
618 * @since 1.0.0
619 *
620 * @param mixed $classes classes.
621 * @return mixed
622 */
623 public function add_identifier_class_to_body( $classes ) {
624 $course_builder_screen = tutor_utils()->get_course_builder_screen();
625 $to_add = array( 'tutor-lms' );
626
627 // Add backend course editor identifier class to body.
628 if ( $course_builder_screen ) {
629 $to_add[] = is_admin() ? 'tutor-backend' : 'tutor-frontend';
630 $to_add[] = ' tutor-screen-course-builder tutor-screen-course-builder-' . $course_builder_screen . ' ';
631 }
632
633 // Add frontend course builder identifier class.
634 if ( ! $course_builder_screen && tutor_utils()->is_tutor_frontend_dashboard() ) {
635 $to_add[] = 'tutor-screen-frontend-dashboard';
636 }
637
638 if ( is_post_type_archive( tutor()->course_post_type ) ) {
639 $to_add[] = 'tutor-frontend';
640 }
641
642 if ( tutor_utils()->is_tutor_frontend_dashboard() ) {
643 $to_add[] = 'tutor-frontend';
644 }
645
646 if ( is_single() ) {
647 global $post;
648
649 $post_types = array(
650 tutor()->course_post_type,
651 tutor()->lesson_post_type,
652 tutor()->quiz_post_type,
653 tutor()->assignment_post_type,
654 tutor()->zoom_post_type,
655 tutor()->meet_post_type,
656 );
657
658 if ( isset( $post->post_type ) && in_array( $post->post_type, $post_types, true ) ) {
659 $to_add[] = 'tutor-frontend';
660 }
661 }
662
663 if ( is_admin() ) {
664 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
665 $base = ( $screen && is_object( $screen ) && property_exists( $screen, 'base' ) ) ? $screen->base : '';
666 $index = strpos( $base, 'tutor' );
667
668 if ( 0 === $index || $index > 0 ) {
669 $to_add[] = 'tutor-backend';
670
671 $page = Input::get( 'page' );
672 if ( 'tutor_settings' === $page ) {
673 $to_add[] = 'tutor-screen-backend-settings ';
674 }
675 if ( ! empty( $page ) ) {
676 $to_add[] = 'tutor-backend-' . $page;
677 }
678 }
679 }
680
681 // Remove duplicate classes if any.
682 $to_add = array_unique( $to_add );
683
684 if ( is_array( $classes ) ) {
685 $classes = array_merge( $classes, $to_add );
686 } else {
687 $classes .= implode( ' ', $to_add );
688 }
689
690 return $classes;
691 }
692
693 /**
694 * Enqueue script for adding edit with frontend course builder button
695 * on the Gutenberg editor
696 *
697 * @since 2.0.5
698 * @return void
699 */
700 public static function add_frontend_editor_button() {
701 $wp_screen = get_current_screen();
702
703 if ( is_a( $wp_screen, 'WP_Screen' ) && tutor()->course_post_type === $wp_screen->post_type ) {
704 wp_enqueue_script( 'tutor-gutenberg', tutor()->url . 'assets/js/tutor-gutenberg.min.js', array(), TUTOR_VERSION, true );
705 $data = array(
706 'frontend_dashboard_url' => esc_url( trailingslashit( tutor_utils()->tutor_dashboard_url( 'create-course' ) ) ) . '?course_id=' . get_the_ID(),
707 );
708
709 wp_add_inline_script(
710 'tutor-gutenberg',
711 'const tutorInlineData =' . json_encode( $data ),
712 'before'
713 );
714 }
715 }
716 }
717