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