PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.2.3
Tutor LMS – eLearning and online course solution v3.2.3
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 3 years 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
715 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-i18n', 'wp-element' ), TUTOR_VERSION, true );
229 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-coupon.min.js', array( 'wp-i18n', 'wp-element', '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' ), 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
461 // Inline styles.
462 wp_add_inline_style( 'tutor-frontend', $this->load_color_palette() );
463 wp_add_inline_style( 'tutor-admin', $this->load_color_palette() );
464 }
465
466 /**
467 * Load color palette
468 *
469 * @since 1.0.0
470 * @return string
471 */
472 private function load_color_palette() {
473 $colors = array(
474 'tutor_primary_color' => '--tutor-color-primary',
475 'tutor_primary_hover_color' => '--tutor-color-primary-hover',
476 'tutor_text_color' => '--tutor-body-color',
477 'tutor_border_color' => '--tutor-border-color',
478 'tutor_gray_color' => '--tutor-color-gray',
479 );
480
481 // Admin colors.
482 $admin_colors = array();
483 if ( is_admin() ) {
484 $admin_colors = array(
485 '--tutor-color-primary' => '#3E64DE',
486 '--tutor-color-primary-hover' => '#3A5CCC',
487 '--tutor-body-color' => '#212327',
488 '--tutor-border-color' => '#CDCFD5',
489 '--tutor-color-gray' => '#CDCFD5',
490 );
491 }
492
493 $fallback_colors = array(
494 'tutor_primary_color' => '#3E64DE',
495 'tutor_primary_hover_color' => '#3A5CCC',
496 'tutor_text_color' => '#212327',
497 'tutor_border_color' => '#E3E5EB',
498 'tutor_gray_color' => '#CDCFD5',
499 );
500
501 $color_string = '';
502 foreach ( $colors as $key => $property ) {
503 $fallback_color = isset( $fallback_colors[ $key ] ) ? $fallback_colors[ $key ] : '#212327';
504 $color = tutor_utils()->get_option( $key, $fallback_color );
505 $color_rgb = tutor_utils()->hex2rgb( $color );
506
507 if ( is_admin() && isset( $admin_colors[ $property ] ) ) {
508 $color = $admin_colors[ $property ];
509 $color_rgb = tutor_utils()->hex2rgb( $admin_colors[ $property ] );
510 }
511
512 if ( $color ) {
513 $color_string .= $property . ':' . $color . ';';
514 }
515
516 if ( $color_rgb ) {
517 $color_string .= $property . '-rgb:' . $color_rgb . ';';
518 }
519 }
520
521 return ':root{' . $color_string . '}';
522 }
523
524 /**
525 * Add Tinymce button for placing shortcode
526 *
527 * @since 1.0.0
528 * @return void|null
529 */
530 public function tutor_add_mce_button() {
531 // Check user permissions.
532 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
533 return;
534 }
535 // Check if WYSIWYG is enabled.
536 if ( 'true' == get_user_option( 'rich_editing' ) ) {
537 add_filter( 'mce_external_plugins', array( $this, 'tutor_add_tinymce_js' ) );
538 add_filter( 'mce_buttons', array( $this, 'tutor_register_mce_button' ) );
539 }
540 }
541
542 /**
543 * Add tinymce button
544 *
545 * @since 1.0.0
546 *
547 * @param array $plugin_array plugin array.
548 * @return array
549 */
550 public function tutor_add_tinymce_js( $plugin_array ) {
551 $plugin_array['tutor_button'] = tutor()->url . 'assets/lib/mce-button.js';
552 return $plugin_array;
553 }
554
555 /**
556 * Register new button in the editor
557 *
558 * @since 1.0.0
559 *
560 * @param array $buttons buttons.
561 * @return array
562 */
563 public function tutor_register_mce_button( $buttons ) {
564 array_push( $buttons, 'tutor_button' );
565 return $buttons;
566 }
567
568 /**
569 * Output generator tag to aid debugging.
570 *
571 * @since 1.0.0
572 *
573 * @param string $gen Generator.
574 * @param string $type Type.
575 *
576 * @return string
577 */
578 public function tutor_generator_tag( $gen, $type ) {
579 switch ( $type ) {
580 case 'html':
581 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '">';
582 break;
583 case 'xhtml':
584 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '" />';
585 break;
586 }
587 return $gen;
588 }
589
590 /**
591 * Load text domain handled script after all enqueue_scripts
592 * registered functions
593 *
594 * @since 1.9.0
595 * @return void
596 */
597 public function tutor_script_text_domain() {
598 wp_set_script_translations( 'tutor-frontend', 'tutor', tutor()->path . 'languages/' );
599 wp_set_script_translations( 'tutor-admin', 'tutor', tutor()->path . 'languages/' );
600 }
601
602 /**
603 * Add translation support for external tinyMCE button
604 *
605 * @since 1.9.7
606 * @return array
607 */
608 public function tutor_tinymce_translate() {
609 $locales['tutor_button'] = tutor()->path . 'includes/tinymce_translate.php';
610 return $locales;
611 }
612
613 /**
614 * Add an identifier class to body
615 *
616 * @since 1.0.0
617 *
618 * @param mixed $classes classes.
619 * @return mixed
620 */
621 public function add_identifier_class_to_body( $classes ) {
622 $course_builder_screen = tutor_utils()->get_course_builder_screen();
623 $to_add = array( 'tutor-lms' );
624
625 // Add backend course editor identifier class to body.
626 if ( $course_builder_screen ) {
627 $to_add[] = is_admin() ? 'tutor-backend' : 'tutor-frontend';
628 $to_add[] = ' tutor-screen-course-builder tutor-screen-course-builder-' . $course_builder_screen . ' ';
629 }
630
631 // Add frontend course builder identifier class.
632 if ( ! $course_builder_screen && tutor_utils()->is_tutor_frontend_dashboard() ) {
633 $to_add[] = 'tutor-screen-frontend-dashboard';
634 }
635
636 if ( is_post_type_archive( tutor()->course_post_type ) ) {
637 $to_add[] = 'tutor-frontend';
638 }
639
640 if ( tutor_utils()->is_tutor_frontend_dashboard() ) {
641 $to_add[] = 'tutor-frontend';
642 }
643
644 if ( is_single() ) {
645 global $post;
646
647 $post_types = array(
648 tutor()->course_post_type,
649 tutor()->lesson_post_type,
650 tutor()->quiz_post_type,
651 tutor()->assignment_post_type,
652 tutor()->zoom_post_type,
653 tutor()->meet_post_type,
654 );
655
656 if ( isset( $post->post_type ) && in_array( $post->post_type, $post_types, true ) ) {
657 $to_add[] = 'tutor-frontend';
658 }
659 }
660
661 if ( is_admin() ) {
662 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
663 $base = ( $screen && is_object( $screen ) && property_exists( $screen, 'base' ) ) ? $screen->base : '';
664 $index = strpos( $base, 'tutor' );
665
666 if ( 0 === $index || $index > 0 ) {
667 $to_add[] = 'tutor-backend';
668
669 $page = Input::get( 'page' );
670 if ( 'tutor_settings' === $page ) {
671 $to_add[] = 'tutor-screen-backend-settings ';
672 }
673 if ( ! empty( $page ) ) {
674 $to_add[] = 'tutor-backend-' . $page;
675 }
676 }
677 }
678
679 // Remove duplicate classes if any.
680 $to_add = array_unique( $to_add );
681
682 if ( is_array( $classes ) ) {
683 $classes = array_merge( $classes, $to_add );
684 } else {
685 $classes .= implode( ' ', $to_add );
686 }
687
688 return $classes;
689 }
690
691 /**
692 * Enqueue script for adding edit with frontend course builder button
693 * on the Gutenberg editor
694 *
695 * @since 2.0.5
696 * @return void
697 */
698 public static function add_frontend_editor_button() {
699 $wp_screen = get_current_screen();
700
701 if ( is_a( $wp_screen, 'WP_Screen' ) && tutor()->course_post_type === $wp_screen->post_type ) {
702 wp_enqueue_script( 'tutor-gutenberg', tutor()->url . 'assets/js/tutor-gutenberg.min.js', array(), TUTOR_VERSION, true );
703 $data = array(
704 'frontend_dashboard_url' => esc_url( trailingslashit( tutor_utils()->tutor_dashboard_url( 'create-course' ) ) ) . '?course_id=' . get_the_ID(),
705 );
706
707 wp_add_inline_script(
708 'tutor-gutenberg',
709 'const tutorInlineData =' . json_encode( $data ),
710 'before'
711 );
712 }
713 }
714 }
715