| @@ -214,10 +214,10 @@ | ||
| 214 | 214 | [ |
| 215 | 215 | 'label' => esc_html__( 'Alignment', 'elementor' ), |
| 216 | 216 | 'type' => Controls_Manager::CHOOSE, |
| 217 | 217 | 'options' => [ |
| 218 | - 'start' => [ | |
| 219 | - 'title' => esc_html__( 'Start', 'elementor' ), | |
| 218 | + 'left' => [ | |
| 219 | + 'title' => esc_html__( 'Left', 'elementor' ), | |
| 220 | 220 | 'icon' => 'eicon-text-align-left', |
| 221 | 221 | ], |
| 222 | 222 | 'center' => [ |
| 223 | 223 | 'title' => esc_html__( 'Center', 'elementor' ), |
| @@ -222,10 +222,10 @@ | ||
| 222 | 222 | 'center' => [ |
| 223 | 223 | 'title' => esc_html__( 'Center', 'elementor' ), |
| 224 | 224 | 'icon' => 'eicon-text-align-center', |
| 225 | 225 | ], |
| 226 | - 'end' => [ | |
| 227 | - 'title' => esc_html__( 'End', 'elementor' ), | |
| 226 | + 'right' => [ | |
| 227 | + 'title' => esc_html__( 'Right', 'elementor' ), | |
| 228 | 228 | 'icon' => 'eicon-text-align-right', |
| 229 | 229 | ], |
| 230 | 230 | 'justify' => [ |
| 231 | 231 | 'title' => esc_html__( 'Justified', 'elementor' ), |
| @@ -231,17 +231,8 @@ | ||
| 231 | 231 | 'title' => esc_html__( 'Justified', 'elementor' ), |
| 232 | 232 | 'icon' => 'eicon-text-align-justify', |
| 233 | 233 | ], |
| 234 | 234 | ], |
| 235 | - 'classes' => 'elementor-control-start-end', | |
| 236 | - 'classes_dictionary' => [ | |
| 237 | - 'left' => is_rtl() ? 'end' : 'start', | |
| 238 | - 'right' => is_rtl() ? 'start' : 'end', | |
| 239 | - ], | |
| 240 | - 'selectors_dictionary' => [ | |
| 241 | - 'left' => is_rtl() ? 'end' : 'start', | |
| 242 | - 'right' => is_rtl() ? 'start' : 'end', | |
| 243 | - ], | |
| 244 | 235 | 'prefix_class' => 'elementor-star-rating%s--align-', |
| 245 | 236 | 'selectors' => [ |
| 246 | 237 | '{{WRAPPER}}' => 'text-align: {{VALUE}}', |
| 247 | 238 | ], |
| @@ -313,9 +304,10 @@ | ||
| 313 | 304 | 'max' => 5, |
| 314 | 305 | ], |
| 315 | 306 | ], |
| 316 | 307 | 'selectors' => [ |
| 317 | - '{{WRAPPER}}:not(.elementor-star-rating--align-justify) .elementor-star-rating__title' => 'margin-inline-end: {{SIZE}}{{UNIT}}', | |
| 308 | + 'body:not(.rtl) {{WRAPPER}}:not(.elementor-star-rating--align-justify) .elementor-star-rating__title' => 'margin-right: {{SIZE}}{{UNIT}}', | |
| 309 | + 'body.rtl {{WRAPPER}}:not(.elementor-star-rating--align-justify) .elementor-star-rating__title' => 'margin-left: {{SIZE}}{{UNIT}}', | |
| 318 | 310 | ], |
| 319 | 311 | ] |
| 320 | 312 | ); |
| 321 | 313 | |
| @@ -373,9 +365,10 @@ | ||
| 373 | 365 | 'max' => 5, |
| 374 | 366 | ], |
| 375 | 367 | ], |
| 376 | 368 | 'selectors' => [ |
| 377 | - '{{WRAPPER}} .elementor-star-rating i:not(:last-of-type)' => 'margin-inline-end: {{SIZE}}{{UNIT}}', | |
| 369 | + 'body:not(.rtl) {{WRAPPER}} .elementor-star-rating i:not(:last-of-type)' => 'margin-right: {{SIZE}}{{UNIT}}', | |
| 370 | + 'body.rtl {{WRAPPER}} .elementor-star-rating i:not(:last-of-type)' => 'margin-left: {{SIZE}}{{UNIT}}', | |
| 378 | 371 | ], |
| 379 | 372 | ] |
| 380 | 373 | ); |
| 381 | 374 | |
| @@ -411,9 +404,9 @@ | ||
| 411 | 404 | */ |
| 412 | 405 | protected function get_rating() { |
| 413 | 406 | $settings = $this->get_settings_for_display(); |
| 414 | 407 | $rating_scale = (int) $settings['rating_scale']; |
| 415 | - $rating = min( (float) $settings['rating'], $rating_scale ); | |
| 408 | + $rating = (float) $settings['rating'] > $rating_scale ? $rating_scale : $settings['rating']; | |
| 416 | 409 | |
| 417 | 410 | return [ $rating, $rating_scale ]; |
| 418 | 411 | } |
| 419 | 412 | |
| @@ -434,17 +427,17 @@ | ||
| 434 | 427 | $stars_html = ''; |
| 435 | 428 | |
| 436 | 429 | for ( $stars = 1.0; $stars <= $rating_data[1]; $stars++ ) { |
| 437 | 430 | if ( $stars <= $floored_rating ) { |
| 438 | - $stars_html .= '<i class="elementor-star-full" aria-hidden="true">' . $icon . '</i>'; | |
| 431 | + $stars_html .= '<i class="elementor-star-full">' . $icon . '</i>'; | |
| 439 | 432 | } elseif ( $floored_rating + 1 === $stars && $rating !== $floored_rating ) { |
| 440 | - $stars_html .= '<i class="elementor-star-' . ( $rating - $floored_rating ) * 10 . '" aria-hidden="true">' . $icon . '</i>'; | |
| 433 | + $stars_html .= '<i class="elementor-star-' . ( $rating - $floored_rating ) * 10 . '">' . $icon . '</i>'; | |
| 441 | 434 | } else { |
| 442 | - $stars_html .= '<i class="elementor-star-empty" aria-hidden="true">' . $icon . '</i>'; | |
| 435 | + $stars_html .= '<i class="elementor-star-empty">' . $icon . '</i>'; | |
| 443 | 436 | } |
| 444 | 437 | } |
| 445 | 438 | |
| 446 | - Utils::print_unescaped_internal_string( $stars_html ); | |
| 439 | + return $stars_html; | |
| 447 | 440 | } |
| 448 | 441 | |
| 449 | 442 | /** |
| 450 | 443 | * @since 2.3.0 |
| @@ -452,14 +445,9 @@ | ||
| 452 | 445 | */ |
| 453 | 446 | protected function render() { |
| 454 | 447 | $settings = $this->get_settings_for_display(); |
| 455 | 448 | $rating_data = $this->get_rating(); |
| 456 | - $textual_rating = sprintf( | |
| 457 | - /* translators: 1: Rating value. 2: Rating scale. */ | |
| 458 | - esc_html__( 'Rated %1$s out of %2$s', 'elementor' ), | |
| 459 | - $rating_data[0], | |
| 460 | - $rating_data[1] | |
| 461 | - ); | |
| 449 | + $textual_rating = $rating_data[0] . '/' . $rating_data[1]; | |
| 462 | 450 | $icon = ''; |
| 463 | 451 | |
| 464 | 452 | if ( 'star_fontawesome' === $settings['star_style'] ) { |
| 465 | 453 | if ( 'outline' === $settings['unmarked_star_style'] ) { |
| @@ -474,48 +462,28 @@ | ||
| 474 | 462 | } |
| 475 | 463 | |
| 476 | 464 | $this->add_render_attribute( 'icon_wrapper', [ |
| 477 | 465 | 'class' => 'elementor-star-rating', |
| 466 | + 'title' => $textual_rating, | |
| 478 | 467 | 'itemtype' => 'http://schema.org/Rating', |
| 479 | 468 | 'itemscope' => '', |
| 480 | 469 | 'itemprop' => 'reviewRating', |
| 481 | 470 | ] ); |
| 471 | + | |
| 472 | + $schema_rating = '<span itemprop="ratingValue" class="elementor-screen-only">' . $textual_rating . '</span>'; | |
| 473 | + $stars_element = '<div ' . $this->get_render_attribute_string( 'icon_wrapper' ) . '>' . $this->render_stars( $icon ) . ' ' . $schema_rating . '</div>'; | |
| 482 | 474 | ?> |
| 475 | + | |
| 483 | 476 | <div class="elementor-star-rating__wrapper"> |
| 484 | 477 | <?php if ( ! Utils::is_empty( $settings['title'] ) ) : ?> |
| 485 | 478 | <div class="elementor-star-rating__title"><?php echo esc_html( $settings['title'] ); ?></div> |
| 486 | - <?php endif; ?> | |
| 487 | - <div <?php $this->print_render_attribute_string( 'icon_wrapper' ); ?>> | |
| 488 | - <?php $this->render_stars( $icon ); ?> | |
| 489 | - <span itemprop="ratingValue" class="elementor-screen-only"><?php echo esc_html( $textual_rating ); ?></span> | |
| 490 | - </div> | |
| 479 | + <?php endif; | |
| 480 | + // PHPCS - $stars_element contains an HTML string that cannot be escaped. ?> | |
| 481 | + <?php echo $stars_element; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> | |
| 491 | 482 | </div> |
| 492 | 483 | <?php |
| 493 | 484 | } |
| 494 | 485 | |
| 495 | - public function render_markdown(): string { | |
| 496 | - $settings = $this->get_settings_for_display(); | |
| 497 | - $title = Utils::html_to_plain_text( $settings['title'] ?? '' ); | |
| 498 | - $rating = floatval( $settings['rating'] ?? 0 ); | |
| 499 | - $scale = intval( $settings['rating_scale'] ?? 5 ); | |
| 500 | - | |
| 501 | - if ( empty( $rating ) ) { | |
| 502 | - return ''; | |
| 503 | - } | |
| 504 | - | |
| 505 | - $full_stars = intval( floor( $rating ) ); | |
| 506 | - $empty_stars = $scale - $full_stars; | |
| 507 | - $stars = str_repeat( '★', $full_stars ) . str_repeat( '☆', max( 0, $empty_stars ) ); | |
| 508 | - | |
| 509 | - $md = $stars . ' ' . $rating . '/' . $scale; | |
| 510 | - | |
| 511 | - if ( ! empty( $title ) ) { | |
| 512 | - $md .= "\n\n" . $title; | |
| 513 | - } | |
| 514 | - | |
| 515 | - return $md; | |
| 516 | - } | |
| 517 | - | |
| 518 | 486 | /** |
| 519 | 487 | * @since 2.9.0 |
| 520 | 488 | * @access protected |
| 521 | 489 | */ |
| @@ -529,9 +497,9 @@ | ||
| 529 | 497 | return [ rating, ratingScale ]; |
| 530 | 498 | }, |
| 531 | 499 | ratingData = getRating(), |
| 532 | 500 | rating = ratingData[0], |
| 533 | - textualRating = 'Rated ' + ratingData[0] + ' out of ' + ratingData[1], | |
| 501 | + textualRating = ratingData[0] + '/' + ratingData[1], | |
| 534 | 502 | renderStars = function( icon ) { |
| 535 | 503 | var starsHtml = '', |
| 536 | 504 | flooredRating = Math.floor( rating ); |
| 537 | 505 | |
| @@ -536,13 +504,13 @@ | ||
| 536 | 504 | flooredRating = Math.floor( rating ); |
| 537 | 505 | |
| 538 | 506 | for ( var stars = 1; stars <= ratingData[1]; stars++ ) { |
| 539 | 507 | if ( stars <= flooredRating ) { |
| 540 | - starsHtml += '<i class="elementor-star-full" aria-hidden="true">' + icon + '</i>'; | |
| 508 | + starsHtml += '<i class="elementor-star-full">' + icon + '</i>'; | |
| 541 | 509 | } else if ( flooredRating + 1 === stars && rating !== flooredRating ) { |
| 542 | - starsHtml += '<i class="elementor-star-' + ( rating - flooredRating ).toFixed( 1 ) * 10 + '" aria-hidden="true">' + icon + '</i>'; | |
| 510 | + starsHtml += '<i class="elementor-star-' + ( rating - flooredRating ).toFixed( 1 ) * 10 + '">' + icon + '</i>'; | |
| 543 | 511 | } else { |
| 544 | - starsHtml += '<i class="elementor-star-empty" aria-hidden="true">' + icon + '</i>'; | |
| 512 | + starsHtml += '<i class="elementor-star-empty">' + icon + '</i>'; | |
| 545 | 513 | } |
| 546 | 514 | } |
| 547 | 515 | |
| 548 | 516 | return starsHtml; |
| @@ -562,13 +530,15 @@ | ||
| 562 | 530 | } |
| 563 | 531 | |
| 564 | 532 | view.addRenderAttribute( 'iconWrapper', 'class', 'elementor-star-rating' ); |
| 565 | 533 | view.addRenderAttribute( 'iconWrapper', 'itemtype', 'http://schema.org/Rating' ); |
| 534 | + view.addRenderAttribute( 'iconWrapper', 'title', textualRating ); | |
| 566 | 535 | view.addRenderAttribute( 'iconWrapper', 'itemscope', '' ); |
| 567 | 536 | view.addRenderAttribute( 'iconWrapper', 'itemprop', 'reviewRating' ); |
| 568 | 537 | |
| 569 | 538 | var stars = renderStars( icon ); |
| 570 | 539 | #> |
| 540 | + | |
| 571 | 541 | <div class="elementor-star-rating__wrapper"> |
| 572 | 542 | <# if ( ! _.isEmpty( settings.title ) ) { #> |
| 573 | 543 | <div class="elementor-star-rating__title">{{ settings.title }}</div> |
| 574 | 544 | <# } #> |
| @@ -576,7 +546,8 @@ | ||
| 576 | 546 | {{{ stars }}} |
| 577 | 547 | <span itemprop="ratingValue" class="elementor-screen-only">{{ textualRating }}</span> |
| 578 | 548 | </div> |
| 579 | 549 | </div> |
| 550 | + | |
| 580 | 551 | <?php |
| 581 | 552 | } |
| 582 | 553 | } |