Issues (461)

Branch: master

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  Header Injection
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

includes/extras.php (34 issues)

1
<?php
2
/**
3
 * LSX functions and definitions - Integrations - Extras
4
 *
5
 * @package    lsx
6
 * @subpackage extras
7
 */
8
9
if ( ! defined( 'ABSPATH' ) ) {
10
	exit;
11
}
12
13
/**
14
 * Enable shortcode for text widget.
15
 *
16
 * @package    lsx
17
 * @subpackage extras
18
 */
19
add_filter( 'widget_text', 'shortcode_unautop' );
20
add_filter( 'widget_text', 'do_shortcode' );
21
22
if ( ! function_exists( 'lsx_kses_allowed_html' ) ) :
23
24
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$allowedtags" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$context" missing
Loading history...
25
	 * Enable extra attributes (srcset, sizes) in img tag.
26
	 *
27
	 * @package    lsx
28
	 * @subpackage extras
29
	 */
30
	function lsx_kses_allowed_html( $allowedtags, $context ) {
0 ignored issues
show
The parameter $context is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

30
	function lsx_kses_allowed_html( $allowedtags, /** @scrutinizer ignore-unused */ $context ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
31
		$allowedtags['img']['srcset'] = true;
32
		$allowedtags['img']['sizes']  = true;
33
34
		$allowedtags['input']['name']  = true;
35
		$allowedtags['input']['type']  = true;
36
		$allowedtags['input']['value'] = true;
37
		$allowedtags['input']['class'] = true;
38
		$allowedtags['input']['id']    = true;
39
		$allowedtags['script']['type'] = true;
40
		return $allowedtags;
41
	}
42
43
endif;
44
45
add_filter( 'wp_kses_allowed_html', 'lsx_kses_allowed_html', 10, 2 );
46
47
if ( ! function_exists( 'lsx_body_class' ) ) :
48
49
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$classes" missing
Loading history...
50
	 * Add and remove body_class() classes.
51
	 *
52
	 * @package    lsx
53
	 * @subpackage extras
54
	 */
55
	function lsx_body_class( $classes ) {
56
		global $post;
57
58
		$header_layout = get_theme_mod( 'lsx_header_layout', 'inline' );
59
		$classes[]     = 'header-' . $header_layout;
60
61
		$mobile_header_layout = get_theme_mod( 'lsx_header_mobile_layout', 'navigation-bar' );
62
		$classes[]            = 'mobile-header-' . $mobile_header_layout;
63
64
		if ( isset( $post ) ) {
65
			$classes[] = $post->post_name;
66
		}
67
68
		if ( class_exists( 'LSX_Banners' ) && empty( apply_filters( 'lsx_banner_plugin_disable', false ) ) ) {
69
			$post_types = array( 'page', 'post' );
70
			$post_types = apply_filters( 'lsx_allowed_post_type_banners', $post_types );
71
72
			$img_group = get_post_meta( $post->ID, 'image_group', true );
73
74
			if ( is_singular( $post_types ) && ! empty( $img_group ) && is_array( $img_group ) && ! empty( $img_group['banner_image'] ) ) {
75
				$classes[] = 'page-has-banner';
76
			}
77
78
			if ( is_singular( $post_types ) && empty( $img_group['banner_image'] ) && ( ! has_post_thumbnail( $post->ID ) ) ) {
79
				$classes[] = 'page-has-no-banner';
80
			}
81
		}
82
83
		if ( function_exists( 'tour_operator' ) ) {
84
			$post_types = array( 'page', 'post' );
85
86
			$classes[] = 'to-active';
87
		}
88
89
		if ( has_nav_menu( 'top-menu' ) || has_nav_menu( 'top-menu-left' ) ) {
90
			$classes[] = 'has-top-menu';
91
		}
92
93
		$fixed_header = get_theme_mod( 'lsx_header_fixed', false );
94
95
		if ( ( false !== $fixed_header ) && ( ! is_page_template( 'page-templates/template-cover.php' ) ) ) {
96
			$classes[] = 'top-menu-fixed';
97
		}
98
99
		$search_form = get_theme_mod( 'lsx_header_search', false );
100
101
		if ( false !== $search_form ) {
102
			$classes[] = 'has-header-search';
103
		}
104
105
		$register_enabled = get_option( 'users_can_register', false );
106
		if ( ( $register_enabled ) && is_page( 'my-account' ) && is_singular() ) {
107
			$classes[] = 'register-enabled';
108
		}
109
110
		return $classes;
111
	}
112
113
endif;
114
115
add_filter( 'body_class', 'lsx_body_class' );
116
117
if ( ! function_exists( 'lsx_embed_wrap' ) ) :
118
119
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$cache" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$url" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$attr" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$post_id" missing
Loading history...
120
	 * Wrap embedded media as suggested by Readability.
121
	 *
122
	 * @package    lsx
123
	 * @subpackage extras
124
	 *
125
	 * @link https://gist.github.com/965956
126
	 * @link http://www.readability.com/publishers/guidelines#publisher
127
	 */
128
	function lsx_embed_wrap( $cache, $url, $attr = '', $post_id = '' ) {
0 ignored issues
show
The parameter $url is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

128
	function lsx_embed_wrap( $cache, /** @scrutinizer ignore-unused */ $url, $attr = '', $post_id = '' ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
The parameter $post_id is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

128
	function lsx_embed_wrap( $cache, $url, $attr = '', /** @scrutinizer ignore-unused */ $post_id = '' ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
The parameter $attr is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

128
	function lsx_embed_wrap( $cache, $url, /** @scrutinizer ignore-unused */ $attr = '', $post_id = '' ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
129
		if ( false !== strpos( $cache, '<iframe' ) ) {
130
			return '<div class="entry-content-asset">' . $cache . '</div>';
131
		}
132
133
		return $cache;
134
	}
135
136
endif;
137
138
add_filter( 'embed_oembed_html', 'lsx_embed_wrap', 10, 4 );
139
140
if ( ! function_exists( 'lsx_remove_self_closing_tags' ) ) :
141
142
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$input" missing
Loading history...
143
	 * Remove unnecessary self-closing tags.
144
	 *
145
	 * @package    lsx
146
	 * @subpackage extras
147
	 */
148
	function lsx_remove_self_closing_tags( $input ) {
149
		return str_replace( ' />', '>', $input );
150
	}
151
152
endif;
153
154
add_filter( 'get_avatar', 'lsx_remove_self_closing_tags' ); // <img />
155
add_filter( 'comment_id_fields', 'lsx_remove_self_closing_tags' ); // <input />
156
add_filter( 'post_thumbnail_html', 'lsx_remove_self_closing_tags' ); // <img />
157
158
if ( ! function_exists( 'lsx_is_element_empty' ) ) :
159
160
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$element" missing
Loading history...
161
	 * Checks if a Nav $element is empty or not.
162
	 *
163
	 * @package    lsx
164
	 * @subpackage extras
165
	 */
166
	function lsx_is_element_empty( $element ) {
167
		$element = trim( $element );
168
		return empty( $element ) ? false : true;
169
	}
170
171
endif;
172
173
if ( ! function_exists( 'lsx_get_thumbnail' ) ) :
174
175
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$size" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$image_src" missing
Loading history...
176
	 * return the responsive images.
0 ignored issues
show
Doc comment short description must start with a capital letter
Loading history...
177
	 *
178
	 * @package    lsx
179
	 * @subpackage extras
180
	 */
181
	function lsx_get_thumbnail( $size, $image_src = false ) {
182
		global $wp_version;
183
184
		if ( false === $image_src ) {
185
			$post_id           = get_the_ID();
186
			$post_thumbnail_id = get_post_thumbnail_id( $post_id );
0 ignored issues
show
It seems like $post_id can also be of type false; however, parameter $post of get_post_thumbnail_id() does only seem to accept WP_Post|integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

186
			$post_thumbnail_id = get_post_thumbnail_id( /** @scrutinizer ignore-type */ $post_id );
Loading history...
187
			if ( empty( $post_thumbnail_id ) ) {
188
				$post_thumbnail_id = apply_filters( 'lsx_get_thumbnail_post_placeholder_id', $post_thumbnail_id, $post_id );
189
			}
190
		} elseif ( false !== $image_src ) {
191
			if ( is_numeric( $image_src ) ) {
192
				$post_thumbnail_id = $image_src;
193
			} else {
194
				$post_thumbnail_id = lsx_get_attachment_id_from_src( $image_src );
195
				if ( empty( $post_thumbnail_id ) ) {
196
					$post_thumbnail_id = apply_filters( 'lsx_get_thumbnail_post_placeholder_id', $post_thumbnail_id, $post_id );
197
				}
198
			}
199
		}
200
201
		$size      = apply_filters( 'lsx_thumbnail_size', $size );
202
		$img       = '';
203
		$lazy_img  = '';
204
		$image_url = '';
205
206
		if ( 'lsx-thumbnail-single' === $size || 'lsx-thumbnail-wide' === $size || 'lsx-thumbnail-square' === $size || 'thumbnail' === $size ) {
207
			$srcset = false;
208
			if ( ( ( 'team' === get_post_type() ) || ( 'testimonial' === get_post_type() ) ) && is_search() ) {
209
				$img = get_the_post_thumbnail_url( get_the_ID(), 'lsx-thumbnail-wide' );
210
			} else {
211
				$temp_img = wp_get_attachment_image_src( $post_thumbnail_id, $size );
212
				if ( ! empty( $temp_img ) ) {
213
					$img = $temp_img[0];
214
				}
215
			}
216
		} else {
217
			$srcset = true;
218
			$img    = wp_get_attachment_image_srcset( $post_thumbnail_id, $size );
219
220
			$temp_lazy = wp_get_attachment_image_src( $post_thumbnail_id, $size );
221
			if ( ! empty( $temp_lazy ) ) {
222
				$lazy_img = $temp_lazy[0];
223
			}
224
225
			if ( empty( $img ) ) {
226
				$srcset = false;
227
				if ( ! empty( $lazy_img ) ) {
228
					$img = $lazy_img;
229
				}
230
			}
231
		}
232
233
		if ( '' !== $img ) {
234
235
			$image_url = $img;
236
237
			$img = '<img title="' . the_title_attribute( 'echo=0' ) . '" alt="' . the_title_attribute( 'echo=0' ) . '" class="attachment-responsive wp-post-image lsx-responsive" ';
238
239
			if ( version_compare( $wp_version, '5.5', '>=' ) ) {
240
				$img = '<img loading="lazy" title="' . the_title_attribute( 'echo=0' ) . '" alt="' . the_title_attribute( 'echo=0' ) . '" class="attachment-responsive wp-post-image lsx-responsive wp-lazy" ';
241
			}
242
243
			if ( $srcset ) {
244
				$img .= 'srcset="' . esc_attr( $image_url ) . '" ';
245
			} else {
246
				$img .= 'src="' . esc_url( $image_url ) . '" ';
247
			}
248
			$img .= '/>';
249
250
			if ( ! version_compare( $wp_version, '5.5', '>=' ) ) {
251
				$img = apply_filters( 'lsx_lazyload_filter_images', $img );
252
				$img = apply_filters( 'lsx_lazyload_slider_images', $img, $post_thumbnail_id, $size, $srcset, $image_url );
253
			}
254
		}
255
256
		return $img;
257
	}
258
259
endif;
260
261
if ( ! function_exists( 'lsx_thumbnail' ) ) :
262
263
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$size" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$image_src" missing
Loading history...
264
	 * Output the Resonsive Images.
265
	 *
266
	 * @package    lsx
267
	 * @subpackage extras
268
	 */
269
	function lsx_thumbnail( $size = 'thumbnail', $image_src = false ) {
270
		echo wp_kses_post( lsx_get_thumbnail( $size, $image_src ) );
271
	}
272
273
endif;
274
275
if ( ! function_exists( 'lsx_get_attachment_id_from_src' ) ) :
276
277
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$image_src" missing
Loading history...
278
	 * Gets the attachments ID from the src.
279
	 *
280
	 * @package    lsx
281
	 * @subpackage extras
282
	 */
283
	function lsx_get_attachment_id_from_src( $image_src ) {
284
		$post_id = wp_cache_get( $image_src, 'lsx_get_attachment_id_from_src' );
285
286
		if ( false === $post_id ) {
287
			global $wpdb;
288
			$post_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE guid='%s' LIMIT 1", $image_src ) );
0 ignored issues
show
Usage of a direct database call is discouraged.
Loading history...
Simple placeholders should not be quoted in the query string in $wpdb->prepare(). Found: '%s'.
Loading history...
289
			wp_cache_set( $image_src, $post_id, 'lsx_get_attachment_id_from_src', 3600 );
290
		}
291
292
		return $post_id;
293
	}
294
295
endif;
296
297
if ( ! function_exists( 'lsx_page_banner' ) ) :
298
299
	/**
300
	 * Add Featured Image as Banner on Single Pages.
301
	 *
302
	 * @package    lsx
303
	 * @subpackage extras
304
	 */
305
	function lsx_page_banner() {
306
		if ( true === apply_filters( 'lsx_page_banner_disable', false ) ) {
0 ignored issues
show
The call to __return_true() has too many arguments starting with false. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

306
		if ( true === /** @scrutinizer ignore-call */ apply_filters( 'lsx_page_banner_disable', false ) ) {

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
The condition true === apply_filters('...banner_disable', false) is always true.
Loading history...
307
			return;
308
		}
309
310
		$post_types = array( 'page', 'post' );
311
		$post_types = apply_filters( 'lsx_allowed_post_type_banners', $post_types );
312
313
		if ( is_singular( $post_types ) && has_post_thumbnail() ) :
314
			$bg_image = '';
315
316
			if ( has_post_thumbnail() ) {
317
				$temp_bg_image = wp_get_attachment_image_src( get_post_thumbnail_id( get_the_ID() ), 'full' );
318
				if ( ! empty( $temp_bg_image ) ) {
319
					$bg_image = $temp_bg_image[0];
320
				}
321
			}
322
323
			if ( '' !== $bg_image ) :
324
				?>
325
					<div class="page-banner-wrap">
326
						<div class="page-banner">
327
							<?php lsx_banner_inner_top(); ?>
328
329
							<div class="page-banner-image" style="background-image:url(<?php echo esc_attr( $bg_image ); ?>);"></div>
330
331
							<div class="container">
332
								<header class="page-header">
333
									<h1 class="page-title"><?php the_title(); ?></h1>
334
									<?php lsx_banner_content(); ?>
335
								</header>
336
							</div>
337
338
							<?php lsx_banner_inner_bottom(); ?>
339
						</div>
340
					</div>
341
				<?php
342
			endif;
343
		endif;
344
	}
345
346
endif;
347
348
add_filter( 'lsx_banner_disable', 'lsx_disable_banner_for_blocks' );
349
add_filter( 'lsx_global_header_disable', 'lsx_disable_banner_for_blocks' );
350
351
352
if ( ! function_exists( 'lsx_disable_banner_for_blocks' ) ) :
353
354
	/**
355
	 * Disable the Banner if the page is using Blocks
356
	 *
357
	 * @package    lsx
358
	 * @subpackage extras
359
	 *
360
	 * @param  $disable boolean
361
	 * @return boolean
362
	 */
363
	function lsx_disable_banner_for_blocks( $disable ) {
364
		$queried_object = get_queried_object_id();
365
		$show_on_front  = get_option( 'show_on_front' );
366
367
		if ( 'page' === $show_on_front && (int) get_option( 'page_for_posts' ) === $queried_object ) {
368
			return $disable;
369
		}
370
371
		if ( function_exists( 'has_blocks' ) && has_blocks() && ( ! is_archive() ) ) {
372
			$disable = true;
373
			
374
375
			if ( function_exists( 'lsx_to_get_post_types' ) ) {
376
				$post_types      = array_keys( lsx_to_get_post_types() );
377
				if ( is_singular( $post_types ) ) {
378
					$disable = false;
379
				}
380
			}
381
		}
382
383
		// Single projects will still have banners.
384
		if ( function_exists( 'has_blocks' ) && has_blocks() && ( is_singular( 'project' ) ) ) {
385
			$disable = false;
386
		}
387
		return $disable;
388
	}
389
390
endif;
391
392
add_action( 'lsx_header_after', 'lsx_page_banner' );
393
394
395
if ( ! function_exists( 'lsx_excerpt_more' ) ) :
396
397
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$more" missing
Loading history...
398
	 * Replaces the excerpt "more" text by a link.
399
	 *
400
	 * @package    lsx
401
	 * @subpackage extras
402
	 */
403
	function lsx_excerpt_more( $more ) {
0 ignored issues
show
The parameter $more is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

403
	function lsx_excerpt_more( /** @scrutinizer ignore-unused */ $more ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
404
		return '...';
405
	}
406
407
endif;
408
409
add_filter( 'excerpt_more', 'lsx_excerpt_more' );
410
411
if ( ! function_exists( 'lsx_the_excerpt_filter' ) ) :
412
413
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$excerpt" missing
Loading history...
414
	 * Add a continue reading link to the excerpt.
415
	 *
416
	 * @package    lsx
417
	 * @subpackage extras
418
	 */
419
	function lsx_the_excerpt_filter( $excerpt ) {
420
421
		$post_formats = array(
422
			'aside'   => 'aside',
423
			'gallery' => 'gallery',
424
			'link'    => 'link',
425
			'image'   => 'image',
426
			'quote'   => 'quote',
427
			'status'  => 'status',
428
			'video'   => 'video',
429
			'audio'   => 'audio',
430
		);
431
432
		$show_full_content = has_post_format( apply_filters( 'lsx_the_excerpt_filter_post_types', $post_formats ) );
433
434
		if ( ! $show_full_content ) {
435
			if ( '' !== $excerpt && ! stristr( $excerpt, 'moretag' ) ) {
436
				$pagination = wp_link_pages(
437
					array(
438
						'before'      => '<div class="lsx-postnav-wrapper"><div class="lsx-postnav">',
439
						'after'       => '</div></div>',
440
						'link_before' => '<span>',
441
						'link_after'  => '</span>',
442
						'echo'        => 0,
443
					)
444
				);
445
446
				if ( ! empty( $pagination ) ) {
447
					$excerpt .= $pagination;
448
				} else {
449
					$excerpt_more = '<p><a class="moretag" href="' . esc_url( get_permalink() ) . '">' . esc_html__( 'Read More', 'lsx' ) . '</a></p>';
450
					$excerpt .= apply_filters( 'excerpt_more_p', $excerpt_more );
451
				}
452
			}
453
		}
454
455
		return $excerpt;
456
	}
457
458
endif;
459
460
add_filter( 'the_excerpt', 'lsx_the_excerpt_filter', 1, 20 );
461
462
if ( ! function_exists( 'lsx_full_width_widget_classes' ) ) :
463
464
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$params" missing
Loading history...
465
	 * Filter sidebar widget params, to add the widget_lsx_full_width_alt or widget_lsx_full_width classes to the text widget.
466
	 *
467
	 * @package    lsx
468
	 * @subpackage extras
469
	 */
470
	function lsx_full_width_widget_classes( $params ) {
471
		if ( is_admin() ) {
472
			return $params;
473
		}
474
475
		global $wp_registered_widgets;
476
477
		$widget_id   = $params[0]['widget_id'];
478
		$widget_name = $params[0]['widget_name'];
479
480
		if ( 'Text' === $widget_name ) {
481
			$wp_registered_widgets[ $widget_id ]['original_callback'] = $wp_registered_widgets[ $widget_id ]['callback'];
0 ignored issues
show
Overriding WordPress globals is prohibited. Found assignment to $wp_registered_widgets
Loading history...
482
			$wp_registered_widgets[ $widget_id ]['callback']          = 'lsx_full_width_widget_custom_callback';
483
		}
484
485
		return $params;
486
	}
487
488
endif;
489
490
add_filter( 'dynamic_sidebar_params', 'lsx_full_width_widget_classes' );
491
492
if ( ! function_exists( 'lsx_full_width_widget_custom_callback' ) ) :
493
494
	/**
495
	 * Filter sidebar widget params, to add the widget_lsx_full_width_alt or widget_lsx_full_width classes to the text widget.
496
	 *
497
	 * @package    lsx
498
	 * @subpackage extras
499
	 */
500
	function full_width_widget_custom_callback() {
501
		global $wp_registered_widgets;
502
503
		$original_callback_params = func_get_args();
504
		$widget_id                = $original_callback_params[0]['widget_id'];
505
506
		$original_callback                               = $wp_registered_widgets[ $widget_id ]['original_callback'];
507
		$wp_registered_widgets[ $widget_id ]['callback'] = $original_callback;
0 ignored issues
show
Overriding WordPress globals is prohibited. Found assignment to $wp_registered_widgets
Loading history...
508
509
		$widget_id_base = $wp_registered_widgets[ $widget_id ]['callback'][0]->id_base;
510
511
		$widget_classname = '';
512
513
		if ( is_callable( $original_callback ) ) {
514
			ob_start();
515
			call_user_func_array( $original_callback, $original_callback_params );
516
			$widget_output = ob_get_clean();
517
518
			echo wp_kses_post( apply_filters( 'lsx_widget_output', $widget_output, $widget_id_base, $widget_classname, $widget_id ) );
519
		}
520
	}
521
522
endif;
523
524
if ( ! function_exists( 'lsx_full_width_widget_output' ) ) :
525
526
	/**
0 ignored issues
show
Coding Style Documentation introduced by
Doc comment for parameter "$widget_id" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$widget_id_base" missing
Loading history...
Coding Style Documentation introduced by
Doc comment for parameter "$widget_output" missing
Loading history...
527
	 * Filter sidebar widget params, to add the widget_lsx_full_width_alt or widget_lsx_full_width classes to the text widget.
528
	 *
529
	 * @package    lsx
530
	 * @subpackage extras
531
	 */
532
	function lsx_full_width_widget_output( $widget_output, $widget_id_base, $widget_id ) {
0 ignored issues
show
The parameter $widget_id is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

532
	function lsx_full_width_widget_output( $widget_output, $widget_id_base, /** @scrutinizer ignore-unused */ $widget_id ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
533
		if ( 'text' === $widget_id_base ) {
534
			if ( false !== strpos( $widget_output, '<div class="lsx-full-width-alt">' ) ) {
535
				$widget_output = str_replace( 'class="widget widget_text"', 'class="widget widget_text widget_lsx_full_width_alt"', $widget_output );
536
			} elseif ( false !== strpos( $widget_output, '<div class="lsx-full-width">' ) ) {
537
				$widget_output = str_replace( 'class="widget widget_text"', 'class="widget widget_text widget_lsx_full_width"', $widget_output );
538
			}
539
		}
540
541
		return $widget_output;
542
	}
543
544
endif;
545
546
add_filter( 'lsx_widget_output', 'lsx_full_width_widget_output', 10, 3 );
547
548
/**
549
 * Check if the content has a restricted post format that needs to show a full excerpt.
550
 */
551
function lsx_post_format_force_content_on_list() {
552
	$post_formats = apply_filters( 'lsx_post_format_force_content_on_list',
553
		array(
554
			'video' => 'video',
555
			'audio' => 'audio',
556
			'quote' => 'quote',
557
			'link'  => 'link',
558
		)
559
	);
560
	$return       = false;
561
	if ( ! has_post_format( $post_formats ) ) {
562
		$return = true;
563
	}
564
	return $return;
565
}
566
567
/**
568
 * Remove the Hentry Class Every
569
 */
570
function lsx_remove_hentry( $classes ) {
571
	if ( 'post' !== get_post_type() ) {
572
		$classes = array_diff( $classes, array( 'hentry' ) );
573
	}
574
	return $classes;
575
}
576
add_filter( 'post_class', 'lsx_remove_hentry' );
577
578
/**
579
 * Strip Excerpts.
580
 */
581
function lsx_strip_excerpt( $content ) {
582
	if ( is_search() || is_archive() || ( is_blog_installed() && ! is_single() && ! is_page() ) ) {
583
		$content = strip_shortcodes( $content );
584
		$content = str_replace( ']]>', ']]&gt;', $content );
585
		$content = strip_tags( $content );
586
	}
587
	return $content;
588
}
589
add_filter( 'the_content', 'lsx_strip_excerpt' );
590
591
/**
592
 * Disable Gutenberg for LSX Custom Post Types.
593
 */
594
function lsx_disable_gutenberg_product_type( $is_enabled, $post_type ) {
595
	if ( 'testimonial' === $post_type || 'team' === $post_type || 'project' === $post_type ) {
596
		return false;
597
	}
598
599
	return $is_enabled;
600
}
601
add_filter( 'gutenberg_add_edit_link_for_post_type', 'lsx_disable_gutenberg_product_type', 10, 2 );
602
603
/**
604
 * Add the "Blog" link to the breadcrumbs
605
 *
606
 * @param $crumbs
607
 * @return array
608
 */
609
function lsx_breadcrumbs_blog_link( $crumbs ) {
610
611
	$show_on_front = get_option( 'show_on_front' );
612
613
	if ( 'page' === $show_on_front && ( is_category() || is_tag() ) ) {
614
615
		$blog_page = get_option( 'page_for_posts' );
616
		if ( false !== $blog_page && '' !== $blog_page ) {
617
618
			$new_crumbs    = array();
619
			$new_crumbs[0] = $crumbs[0];
620
621
			if ( function_exists( 'woocommerce_breadcrumb' ) ) {
622
				$new_crumbs[1] = array(
623
					0 => get_the_title( $blog_page ),
624
					1 => get_permalink( $blog_page ),
625
				);
626
			} else {
627
				$new_crumbs[1] = array(
628
					'text' => get_the_title( $blog_page ),
629
					'url'  => get_permalink( $blog_page ),
630
				);
631
			}
632
			$new_crumbs[2] = $crumbs[1];
633
			$crumbs        = $new_crumbs;
634
635
		}
636
	}
637
	return $crumbs;
638
}
639
add_filter( 'wpseo_breadcrumb_links', 'lsx_breadcrumbs_blog_link', 30, 1 );
640
add_filter( 'woocommerce_get_breadcrumb', 'lsx_breadcrumbs_blog_link', 30, 1 );
641
642
/**
643
 * Cover template custom styles
644
 *
645
 * @return void
646
 */
647
function lsx_cover_template_custom_enqueue() {
648
649
	if ( ! is_page_template( 'page-templates/template-cover.php' ) ) {
650
		return;
651
	}
652
	$color_overlay_classes = '';
653
654
	$cover_text_color  = get_theme_mod( 'lsx_cover_template_overlay_text_color' );
655
	$cover_menu_color  = get_theme_mod( 'lsx_cover_template_menu_text_color' );
656
	$cover_hover_color = get_theme_mod( 'lsx_cover_template_text_hover_color' );
657
658
	$cover_bg_color         = get_theme_mod( 'lsx_cover_template_cover_background_color' );
659
	$cover_bg_overlay_color = get_theme_mod( 'lsx_cover_template_overlay_background_color' );
660
661
	$color_overlay_opacity = get_theme_mod( 'lsx_cover_template_overlay_opacity' );
662
	$color_overlay_opacity = ( false === $color_overlay_opacity ) ? 80 : $color_overlay_opacity;
663
	$color_overlay_opacity = $color_overlay_opacity / 100;
664
665
	$color_overlay_opacity_header = $color_overlay_opacity - 0.3;
666
667
	$color_overlay_classes .= $color_overlay_opacity;
668
669
	$custom_css = ".page-template-template-cover.mobile-header-hamburger #masthead.masthead-open >.container, .post-template-template-cover.mobile-header-hamburger #masthead.masthead-open >.container { background: {$cover_bg_color};color: transparent; } .page-template-template-cover.mobile-header-hamburger #masthead.masthead-open >.container:before, .post-template-template-cover.mobile-header-hamburger #masthead.masthead-open >.container:before { background: currentColor; content: ''; opacity: {$color_overlay_opacity_header}; position: absolute; bottom: 0; left: 0; right: 0; top: 0; display: block; } .page-template-template-cover .entry-header .entry-title, .post-template-template-cover .entry-header .entry-title, .post-template-template-cover #primary #main .entry-categories-inner a, .page-template-template-cover #primary #main .entry-header *, .post-template-template-cover #primary #main .entry-header * {color: {$cover_text_color};} .page-template-template-cover .entry-header .entry-title, .post-template-template-cover .entry-header .entry-title, .page-template-template-cover #primary #main .entry-header a:hover, .post-template-template-cover #primary #main .entry-header a:hover {color: {$cover_hover_color};} .page-template-template-cover .cover-header .cover-header-inner-wrapper .cover-header-inner .cover-color-overlay, .page-template-template-cover .cover-header .cover-header-inner-wrapper .cover-header-inner .cover-color-overlay::before, .post-template-template-cover .cover-header .cover-header-inner-wrapper .cover-header-inner .cover-color-overlay, .post-template-template-cover .cover-header .cover-header-inner-wrapper .cover-header-inner .cover-color-overlay::before {opacity: {$color_overlay_opacity};} .page-template-template-cover.mobile-header-hamburger #masthead .wrapper-toggle .navbar-toggle:hover .icon-bar, .post-template-template-cover.mobile-header-hamburger #masthead .wrapper-toggle .navbar-toggle:hover .icon-bar {background-color: {$cover_hover_color};} @media (min-width: 1200px) {.page-template-template-cover .header-wrap #masthead .primary-navbar > .nav > .menu-item > a, .page-template-template-cover .header-wrap #masthead .primary-navbar > .nav > .menu-item.active > a, .post-template-template-cover .header-wrap #masthead .primary-navbar > .nav > .menu-item > a, .post-template-template-cover .header-wrap #masthead .primary-navbar > .nav > .menu-item.active > a { color: {$cover_menu_color};} }";
670
		wp_add_inline_style( 'lsx_main', $custom_css );
671
672
}
673
add_action( 'wp_enqueue_scripts', 'lsx_cover_template_custom_enqueue' );
674
675
/**
676
 * Determines if the request is an REST API request.
677
 *
678
 * @return bool True if it's a REST API request, false otherwise.
679
 */
680
function lsx_is_rest_api_request() {
681
	$rest_helper = LSX_Rest_Helper::get_instance();
682
	return $rest_helper->is_rest_api_request();
683
}
684
685
/**
686
 * Remove lazy loading on Custom logo.
687
 *
688
 * @param [type] $attributes
689
 * @return void
690
 */
691
function lsx_custom_logo_attributes( $attributes ) {
692
	$attributes['loading'] = 'eager';
693
	return $attributes;
694
}
695
add_filter( 'get_custom_logo_image_attributes', 'lsx_custom_logo_attributes' );
696
697
/**
698
 * Redirects non admin users to home.
699
 *
700
 * @return void
701
 */
702
function lsx_blockusers_init() {
703
	if ( is_admin() && ( current_user_can( 'teacher' ) || current_user_can( 'customer' ) ) && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
704
		wp_safe_redirect( home_url() );
705
		exit;
706
	}
707
}
708
add_action( 'init', 'lsx_blockusers_init' );
709