Shortcodes.php
3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
/**
* Shortcode setup.
*
* @copyright (c) 2023, Code Atlantic LLC.
* @package ContentControl
*/
namespace ContentControl\Controllers;
use ContentControl\Base\Controller;
use function ContentControl\user_meets_requirements;
defined( 'ABSPATH' ) || exit;
/**
* Class Shortcodes
*
* @package ContentControl
*/
class Shortcodes extends Controller {
/**
* Initialize Widgets
*/
public function init() {
add_shortcode( 'content_control', [ $this, 'content_control' ] );
}
/**
* Process the [content_control] shortcode.
*
* @param array<string,string|int|null> $atts Array or shortcode attributes.
* @param string $content Content inside shortcode.
*
* @return string
*/
public function content_control( $atts, $content = '' ) {
// Deprecated.
$deprecated_atts = shortcode_atts( [
'logged_out' => null, // @deprecated 2.0.
'roles' => null, // @deprecated 2.0.
], $atts );
$atts = shortcode_atts( [
'status' => 'logged_in', // 'logged_in' or 'logged_out
'allowed_roles' => null,
'excluded_roles' => null,
'class' => '',
'message' => $this->container->get_option( 'defaultDenialMessage', '' ),
], $this->normalize_empty_atts( $atts ), 'content_control' );
// Handle old args.
if ( isset( $deprecated_atts['logged_out'] ) ) {
$atts['status'] = (bool) $deprecated_atts['logged_out'] ? 'logged_out' : 'logged_in';
}
if ( isset( $deprecated_atts['roles'] ) && ! empty( $deprecated_atts['roles'] ) ) {
$atts['allowed_roles'] = $deprecated_atts['roles'];
}
$user_roles = [];
$match_type = 'any';
// Normalize args.
if ( ! empty( $atts['excluded_roles'] ) ) {
$user_roles = $atts['excluded_roles'];
$match_type = 'exclude';
} elseif ( ! empty( $atts['allowed_roles'] ) ) {
$user_roles = $atts['allowed_roles'];
$match_type = 'match';
}
// Convert classes to array.
$classes = ! empty( $atts['class'] ) ? explode( ' ', $atts['class'] ) : [];
$classes[] = 'content-control-container';
// @deprecated 2.0.0
$classes[] = 'jp-cc';
if ( user_meets_requirements( $atts['status'], $user_roles, $match_type ) ) {
$classes[] = 'content-control-accessible';
// @deprecated 2.0.0
$classes[] = 'jp-cc-accessible';
$container = '<div class="%1$s">%2$s</div>';
} else {
$classes[] = 'content-control-not-accessible';
// @deprecated 2.0.0
$classes[] = 'jp-cc-not-accessible';
$container = '<div class="%1$s">%3$s</div>';
}
$classes = implode( ' ', $classes );
return sprintf( $container, esc_attr( $classes ), do_shortcode( $content ), do_shortcode( $atts['message'] ) );
}
/**
* Takes set but empty attributes and sets them to true.
*
* These are typically valueless boolean attributes.
*
* @param array<string|int,string|int|null> $atts Array of shortcode attributes.
*
* @return (int|null|string|true)[]
*
* @psalm-return array<int|string, int|null|string|true>
*/
public function normalize_empty_atts( $atts = [] ) {
if ( ! is_array( $atts ) || empty( $atts ) ) {
$atts = [];
}
foreach ( $atts as $attribute => $value ) {
if ( is_int( $attribute ) ) {
$atts[ strtolower( $value ) ] = true;
unset( $atts[ $attribute ] );
}
}
return $atts;
}
}