Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/includes/widgets/rating.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 + namespace Elementor;
3 +
4 + use Elementor\Icons_Manager;
5 +
6 + if ( ! defined( 'ABSPATH' ) ) {
7 + exit; // Exit if accessed directly.
8 + }
9 +
10 + /**
11 + * Elementor (new) rating widget.
12 + *
13 + * @since 3.17.0
14 + */
15 + class Widget_Rating extends Widget_Base {
16 +
17 + public function get_name() {
18 + return 'rating';
19 + }
20 +
21 + public function get_title() {
22 + return esc_html__( 'Rating', 'elementor' );
23 + }
24 +
25 + public function get_icon() {
26 + return 'eicon-rating';
27 + }
28 +
29 + public function get_keywords() {
30 + return [ 'star', 'rating', 'review', 'score', 'scale' ];
31 + }
32 +
33 + protected function is_dynamic_content(): bool {
34 + return false;
35 + }
36 +
37 + public function get_style_depends(): array {
38 + return [ 'widget-rating' ];
39 + }
40 +
41 + public function has_widget_inner_wrapper(): bool {
42 + return ! Plugin::$instance->experiments->is_feature_active( 'e_optimized_markup' );
43 + }
44 +
45 + /**
46 + * @return void
47 + */
48 + private function add_style_tab() {
49 + $this->start_controls_section(
50 + 'section_icon_style',
51 + [
52 + 'label' => esc_html__( 'Icon', 'elementor' ),
53 + 'tab' => Controls_Manager::TAB_STYLE,
54 + ]
55 + );
56 +
57 + $this->add_responsive_control(
58 + 'icon_size',
59 + [
60 + 'label' => esc_html__( 'Size', 'elementor' ),
61 + 'type' => Controls_Manager::SLIDER,
62 + 'size_units' => [ 'px', 'em', 'rem', 'vw', 'custom' ],
63 + 'range' => [
64 + 'px' => [
65 + 'max' => 100,
66 + ],
67 + 'em' => [
68 + 'min' => 0,
69 + 'max' => 10,
70 + ],
71 + 'rem' => [
72 + 'min' => 0,
73 + 'max' => 10,
74 + ],
75 + ],
76 + 'selectors' => [
77 + '{{WRAPPER}}' => '--e-rating-icon-font-size: {{SIZE}}{{UNIT}}',
78 + ],
79 + ]
80 + );
81 +
82 + $this->add_responsive_control(
83 + 'icon_gap',
84 + [
85 + 'label' => esc_html__( 'Spacing', 'elementor' ),
86 + 'type' => Controls_Manager::SLIDER,
87 + 'size_units' => [ 'px', 'em', 'rem', 'vw', 'custom' ],
88 + 'range' => [
89 + 'px' => [
90 + 'max' => 100,
91 + ],
92 + 'em' => [
93 + 'min' => 0,
94 + 'max' => 10,
95 + ],
96 + 'rem' => [
97 + 'min' => 0,
98 + 'max' => 10,
99 + ],
100 + ],
101 + 'selectors' => [
102 + '{{WRAPPER}}' => '--e-rating-gap: {{SIZE}}{{UNIT}}',
103 + ],
104 + ]
105 + );
106 +
107 + $this->add_control(
108 + 'icon_color',
109 + [
110 + 'label' => esc_html__( 'Color', 'elementor' ),
111 + 'type' => Controls_Manager::COLOR,
112 + 'selectors' => [
113 + '{{WRAPPER}}' => '--e-rating-icon-marked-color: {{VALUE}}',
114 + ],
115 + 'separator' => 'before',
116 + ]
117 + );
118 +
119 + $this->add_control(
120 + 'icon_unmarked_color',
121 + [
122 + 'label' => esc_html__( 'Unmarked Color', 'elementor' ),
123 + 'type' => Controls_Manager::COLOR,
124 + 'selectors' => [
125 + '{{WRAPPER}}' => '--e-rating-icon-color: {{VALUE}}',
126 + ],
127 + ]
128 + );
129 +
130 + $this->end_controls_section();
131 + }
132 +
133 + protected function register_controls() {
134 + $start_logical = is_rtl() ? 'end' : 'start';
135 + $end_logical = is_rtl() ? 'start' : 'end';
136 +
137 + $this->start_controls_section(
138 + 'section_rating',
139 + [
140 + 'label' => esc_html__( 'Rating', 'elementor' ),
141 + ]
142 + );
143 +
144 + $this->add_control(
145 + 'rating_scale',
146 + [
147 + 'label' => esc_html__( 'Rating Scale', 'elementor' ),
148 + 'type' => Controls_Manager::SLIDER,
149 + 'range' => [
150 + 'px' => [
151 + 'min' => 1,
152 + 'max' => 10,
153 + ],
154 + ],
155 + 'default' => [
156 + 'size' => 5,
157 + ],
158 + ]
159 + );
160 +
161 + $this->add_control(
162 + 'rating_value',
163 + [
164 + 'label' => esc_html__( 'Rating', 'elementor' ),
165 + 'type' => Controls_Manager::NUMBER,
166 + 'min' => 0,
167 + 'step' => 0.5,
168 + 'dynamic' => [
169 + 'active' => true,
170 + ],
171 + ]
172 + );
173 +
174 + $this->add_control(
175 + 'rating_icon',
176 + [
177 + 'label' => esc_html__( 'Icon', 'elementor' ),
178 + 'type' => Controls_Manager::ICONS,
179 + 'fa4compatibility' => 'icon',
180 + 'skin' => 'inline',
181 + 'label_block' => false,
182 + 'skin_settings' => [
183 + 'inline' => [
184 + 'icon' => [
185 + 'icon' => 'eicon-star',
186 + ],
187 + ],
188 + ],
189 + 'default' => [
190 + 'value' => 'eicon-star',
191 + 'library' => 'eicons',
192 + ],
193 + 'separator' => 'before',
194 + 'exclude_inline_options' => [ 'none' ],
195 + ]
196 + );
197 +
198 + $this->add_responsive_control( 'icon_alignment', [
199 + 'label' => esc_html__( 'Alignment', 'elementor' ),
200 + 'type' => Controls_Manager::CHOOSE,
201 + 'options' => [
202 + 'start' => [
203 + 'title' => esc_html__( 'Start', 'elementor' ),
204 + 'icon' => "eicon-align-$start_logical-h",
205 + ],
206 + 'center' => [
207 + 'title' => esc_html__( 'Center', 'elementor' ),
208 + 'icon' => 'eicon-align-center-h',
209 + ],
210 + 'end' => [
211 + 'title' => esc_html__( 'End', 'elementor' ),
212 + 'icon' => "eicon-align-$end_logical-h",
213 + ],
214 + ],
215 + 'selectors_dictionary' => [
216 + 'start' => '--e-rating-justify-content: flex-start;',
217 + 'center' => '--e-rating-justify-content: center;',
218 + 'end' => '--e-rating-justify-content: flex-end;',
219 + ],
220 + 'selectors' => [
221 + '{{WRAPPER}}' => '{{VALUE}}',
222 + ],
223 + 'separator' => 'before',
224 + ] );
225 +
226 + $this->end_controls_section();
227 +
228 + $this->add_style_tab();
229 + }
230 +
231 + protected function get_rating_value(): float {
232 + $initial_value = $this->get_rating_scale();
233 + $rating_value = $this->get_settings_for_display( 'rating_value' );
234 +
235 + if ( '' === $rating_value ) {
236 + $rating_value = $initial_value;
237 + }
238 +
239 + $rating_value = floatval( $rating_value );
240 +
241 + return round( $rating_value, 2 );
242 + }
243 +
244 + protected function get_rating_scale(): int {
245 + return intval( $this->get_settings_for_display( 'rating_scale' )['size'] );
246 + }
247 +
248 + protected function get_icon_marked_width( $icon_index ): string {
249 + $rating_value = $this->get_rating_value();
250 +
251 + $width = '0%';
252 +
253 + if ( $rating_value >= $icon_index ) {
254 + $width = '100%';
255 + } elseif ( intval( ceil( $rating_value ) ) === $icon_index ) {
256 + $width = ( $rating_value - ( $icon_index - 1 ) ) * 100 . '%';
257 + }
258 +
259 + return $width;
260 + }
261 +
262 + protected function get_icon_markup(): string {
263 + $icon = $this->get_settings_for_display( 'rating_icon' );
264 + $rating_scale = $this->get_rating_scale();
265 +
266 + ob_start();
267 +
268 + for ( $index = 1; $index <= $rating_scale; $index++ ) {
269 + $this->add_render_attribute( 'icon_marked_' . $index, [
270 + 'class' => 'e-icon-wrapper e-icon-marked',
271 + ] );
272 +
273 + $icon_marked_width = $this->get_icon_marked_width( $index );
274 +
275 + if ( '100%' !== $icon_marked_width ) {
276 + $this->add_render_attribute( 'icon_marked_' . $index, [
277 + 'style' => '--e-rating-icon-marked-width: ' . $icon_marked_width . ';',
278 + ] );
279 + }
280 + ?>
281 + <div class="e-icon">
282 + <div <?php $this->print_render_attribute_string( 'icon_marked_' . $index ); ?>>
283 + <?php echo Icons_Manager::try_get_icon_html( $icon, [ 'aria-hidden' => 'true' ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
284 + </div>
285 + <div class="e-icon-wrapper e-icon-unmarked">
286 + <?php echo Icons_Manager::try_get_icon_html( $icon, [ 'aria-hidden' => 'true' ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
287 + </div>
288 + </div>
289 + <?php
290 + }
291 +
292 + return ob_get_clean();
293 + }
294 +
295 + protected function render() {
296 + $this->add_render_attribute( 'widget', [
297 + 'class' => 'e-rating',
298 + 'itemtype' => 'https://schema.org/Rating',
299 + 'itemscope' => '',
300 + 'itemprop' => 'reviewRating',
301 + ] );
302 +
303 + $this->add_render_attribute( 'widget_wrapper', [
304 + 'class' => 'e-rating-wrapper',
305 + 'itemprop' => 'ratingValue',
306 + 'content' => $this->get_rating_value(),
307 + 'role' => 'img',
308 + 'aria-label' => sprintf(
309 + /* translators: 1: Rating value, 2: Rating scale. */
310 + esc_html__( 'Rated %1$s out of %2$s', 'elementor' ),
311 + $this->get_rating_value(),
312 + $this->get_rating_scale()
313 + ),
314 + ] );
315 + ?>
316 + <div <?php $this->print_render_attribute_string( 'widget' ); ?>>
317 + <meta itemprop="worstRating" content="0">
318 + <meta itemprop="bestRating" content="<?php echo $this->get_rating_scale(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>">
319 + <div <?php $this->print_render_attribute_string( 'widget_wrapper' ); ?>>
320 + <?php echo $this->get_icon_markup(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
321 + </div>
322 + </div>
323 + <?php
324 + }
325 + }
326 +