From 3331fd957c7555595e8a121d53f6509c353d57ce Mon Sep 17 00:00:00 2001 From: Jenisha Munikar Date: Fri, 24 Apr 2026 08:37:14 +0545 Subject: [PATCH 1/7] refactor: prefix global variable to comply with WordPress coding standards --- templates/content-widget-blog.php | 104 ++++++----- templates/content-widget-button.php | 58 +++--- templates/content-widget-counter.php | 44 ++--- templates/content-widget-cta.php | 56 +++--- templates/content-widget-featured-posts.php | 98 +++++----- templates/content-widget-iconbox.php | 64 +++---- templates/content-widget-image.php | 10 +- templates/content-widget-logo.php | 26 +-- templates/content-widget-portfolio.php | 189 ++++++++++++-------- templates/content-widget-slider.php | 30 ++-- templates/content-widget-team.php | 39 ++-- templates/content-widget-testimonial.php | 30 ++-- templates/content-widget-title.php | 20 +-- 13 files changed, 419 insertions(+), 349 deletions(-) diff --git a/templates/content-widget-blog.php b/templates/content-widget-blog.php index 28afa88..5df6078 100644 --- a/templates/content-widget-blog.php +++ b/templates/content-widget-blog.php @@ -20,40 +20,44 @@ exit; } -$number = isset( $instance['number'] ) ? $instance['number'] : '6'; -$source = isset( $instance['source'] ) ? $instance['source'] : ''; -$category = isset( $instance['category'] ) ? $instance['category'] : ''; -$style = isset( $instance['style'] ) ? $instance['style'] : ''; -$column = isset( $instance['column'] ) ? $instance['column'] : 3; - -if ( 'latest' === $source ) { - $get_featured_posts = new WP_Query( array( - 'posts_per_page' => $number, - 'post_type' => 'post', - 'ignore_sticky_posts' => true, - ) ); +$suffice_toolkit_number = isset( $instance['number'] ) ? $instance['number'] : '6'; +$suffice_toolkit_source = isset( $instance['source'] ) ? $instance['source'] : ''; +$suffice_toolkit_category = isset( $instance['category'] ) ? $instance['category'] : ''; +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : ''; +$suffice_toolkit_column = isset( $instance['column'] ) ? $instance['column'] : 3; + +if ( 'latest' === $suffice_toolkit_source ) { + $suffice_toolkit_get_featured_posts = new WP_Query( + array( + 'posts_per_page' => $suffice_toolkit_number, + 'post_type' => 'post', + 'ignore_sticky_posts' => true, + ) + ); } else { - $get_featured_posts = new WP_Query( array( - 'posts_per_page' => $number, - 'post_type' => 'post', - 'category__in' => $category, - ) ); + $suffice_toolkit_get_featured_posts = new WP_Query( + array( + 'posts_per_page' => $suffice_toolkit_number, + 'post_type' => 'post', + 'category__in' => $suffice_toolkit_category, + ) + ); } -$thumbnail_size = 'suffice-thumbnail-grid'; +$suffice_toolkit_thumbnail_size = 'suffice-thumbnail-grid'; // Choose image size. -if ( 'post-style-grid' === $style && '1' === $column ) { - $thumbnail_size = 'full'; -} elseif ( 'post-style-list' === $style ) { - $thumbnail_size = 'thumbnail'; +if ( 'post-style-grid' === $suffice_toolkit_style && '1' === $suffice_toolkit_column ) { + $suffice_toolkit_thumbnail_size = 'full'; +} elseif ( 'post-style-list' === $suffice_toolkit_style ) { + $suffice_toolkit_thumbnail_size = 'thumbnail'; } ?>
- +
@@ -61,21 +65,21 @@
have_posts() ) : - $get_featured_posts->the_post(); + while ( $suffice_toolkit_get_featured_posts->have_posts() ) : + $suffice_toolkit_get_featured_posts->the_post(); ?> -
+
- - + +
- +
@@ -83,14 +87,16 @@

- + - +
- - +
diff --git a/templates/content-widget-button.php b/templates/content-widget-button.php index 214b5f4..5a98442 100644 --- a/templates/content-widget-button.php +++ b/templates/content-widget-button.php @@ -23,50 +23,54 @@ /** * General. */ -$widget_id = isset( $args['widget_id'] ) ? $args['widget_id'] : ''; -$btn_text = isset( $instance['btn-text'] ) ? $instance['btn-text'] : ''; -$btn_url = isset( $instance['btn-url'] ) ? $instance['btn-url'] : ''; -$icon = isset( $instance['icon'] ) ? $instance['icon'] : ''; +$suffice_toolkit_widget_id = isset( $args['widget_id'] ) ? $args['widget_id'] : ''; +$suffice_toolkit_btn_text = isset( $instance['btn-text'] ) ? $instance['btn-text'] : ''; +$suffice_toolkit_btn_url = isset( $instance['btn-url'] ) ? $instance['btn-url'] : ''; +$suffice_toolkit_icon = isset( $instance['icon'] ) ? $instance['icon'] : ''; /** * Styling. */ -$icon_position = isset( $instance['icon-position'] ) ? $instance['icon-position'] : 'icon-left'; -$target = isset( $instance['target'] ) ? $instance['target'] : 'same-window'; -$btn_style = isset( $instance['button-style'] ) ? $instance['button-style'] : 'btn-default'; -$btn_edge = isset( $instance['button-edge'] ) ? $instance['button-edge'] : 'btn-flat'; -$btn_width = isset( $instance['button-width'] ) ? $instance['button-width'] : 'btn-medium'; -$btn_align = isset( $instance['button-align'] ) ? $instance['button-align'] : 'btn-left'; +$suffice_toolkit_icon_position = isset( $instance['icon-position'] ) ? $instance['icon-position'] : 'icon-left'; +$suffice_toolkit_target = isset( $instance['target'] ) ? $instance['target'] : 'same-window'; +$suffice_toolkit_btn_style = isset( $instance['button-style'] ) ? $instance['button-style'] : 'btn-default'; +$suffice_toolkit_btn_edge = isset( $instance['button-edge'] ) ? $instance['button-edge'] : 'btn-flat'; +$suffice_toolkit_btn_width = isset( $instance['button-width'] ) ? $instance['button-width'] : 'btn-medium'; +$suffice_toolkit_btn_align = isset( $instance['button-align'] ) ? $instance['button-align'] : 'btn-left'; /** * Color. */ -$icon_color = isset( $instance['icon-color'] ) ? $instance['icon-color'] : ''; -$text_color = isset( $instance['text-color'] ) ? $instance['text-color'] : ''; -$background_color = isset( $instance['background-color'] ) ? $instance['background-color'] : ''; +$suffice_toolkit_icon_color = isset( $instance['icon-color'] ) ? $instance['icon-color'] : ''; +$suffice_toolkit_text_color = isset( $instance['text-color'] ) ? $instance['text-color'] : ''; +$suffice_toolkit_background_color = isset( $instance['background-color'] ) ? $instance['background-color'] : ''; -$custom_icon_style = suffice_toolkit_inline_style( array( - 'color' => $icon_color, -) ); +$suffice_toolkit_custom_icon_style = suffice_toolkit_inline_style( + array( + 'color' => $suffice_toolkit_icon_color, + ) +); -$custom_text_style = suffice_toolkit_inline_style( array( - 'color' => $text_color, - 'background_color' => $background_color, -) ); +$suffice_toolkit_custom_text_style = suffice_toolkit_inline_style( + array( + 'color' => $suffice_toolkit_text_color, + 'background_color' => $suffice_toolkit_background_color, + ) +); ?> -
+
- class="btn " href=""> - - > + class="btn " href=""> + + > diff --git a/templates/content-widget-counter.php b/templates/content-widget-counter.php index 2356235..1c70336 100644 --- a/templates/content-widget-counter.php +++ b/templates/content-widget-counter.php @@ -23,42 +23,46 @@ /** * General. */ -$title = isset( $instance['counter-title'] ) ? $instance['counter-title'] : ''; -$icon = isset( $instance['icon'] ) ? $instance['icon'] : ''; -$number = isset( $instance['number'] ) ? $instance['number'] : ''; -$prefix = isset( $instance['prefix'] ) ? $instance['prefix'] : ''; -$suffix = isset( $instance['suffix'] ) ? $instance['suffix'] : ''; +$suffice_toolkit_title = isset( $instance['counter-title'] ) ? $instance['counter-title'] : ''; +$suffice_toolkit_icon = isset( $instance['icon'] ) ? $instance['icon'] : ''; +$suffice_toolkit_number = isset( $instance['number'] ) ? $instance['number'] : ''; +$suffice_toolkit_prefix = isset( $instance['prefix'] ) ? $instance['prefix'] : ''; +$suffice_toolkit_suffix = isset( $instance['suffix'] ) ? $instance['suffix'] : ''; /** * Styling. */ -$style = isset( $instance['style'] ) ? $instance['style'] : 'counter-style-hexagon'; +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : 'counter-style-hexagon'; /** * Color. */ -$icon_color = isset( $instance['icon-color'] ) ? $instance['icon-color'] : ''; -$text_color = isset( $instance['text-color'] ) ? $instance['text-color'] : ''; -$background_color = isset( $instance['background-color'] ) ? $instance['background-color'] : ''; +$suffice_toolkit_icon_color = isset( $instance['icon-color'] ) ? $instance['icon-color'] : ''; +$suffice_toolkit_text_color = isset( $instance['text-color'] ) ? $instance['text-color'] : ''; +$suffice_toolkit_background_color = isset( $instance['background-color'] ) ? $instance['background-color'] : ''; // Add inline styles. -$custom_icon_style = suffice_toolkit_inline_style( array( - 'color' => $icon_color, -) ); +$suffice_toolkit_custom_icon_style = suffice_toolkit_inline_style( + array( + 'color' => $suffice_toolkit_icon_color, + ) +); -$custom_text_style = suffice_toolkit_inline_style( array( - 'color' => $text_color, - 'background_color' => $background_color, -) ); +$suffice_toolkit_custom_text_style = suffice_toolkit_inline_style( + array( + 'color' => $suffice_toolkit_text_color, + 'background_color' => $suffice_toolkit_background_color, + ) +); ?> -
+
- > + >
-
>
-
+
>
+
diff --git a/templates/content-widget-cta.php b/templates/content-widget-cta.php index 44a1ea9..74ee01f 100644 --- a/templates/content-widget-cta.php +++ b/templates/content-widget-cta.php @@ -19,59 +19,59 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -$title = isset( $instance['cta-title'] ) ? $instance['cta-title'] : ''; -$icon = isset( $instance['icon'] ) ? $instance['icon'] : ''; -$text = isset( $instance['text'] ) ? $instance['text'] : ''; -$more_text = isset( $instance['more-text'] ) ? $instance['more-text'] : ''; -$more_url = isset( $instance['more-url'] ) ? $instance['more-url'] : ''; -$more_text2 = isset( $instance['more-text2'] ) ? $instance['more-text2'] : ''; -$more_url2 = isset( $instance['more-url2'] ) ? $instance['more-url2'] : ''; -$linktarget = isset( $instance['link-target'] ) ? $instance['link-target'] : ''; -$style = isset( $instance['style'] ) ? $instance['style'] : 'cta-boxed-one'; +$suffice_toolkit_title = isset( $instance['cta-title'] ) ? $instance['cta-title'] : ''; +$suffice_toolkit_icon = isset( $instance['icon'] ) ? $instance['icon'] : ''; +$suffice_toolkit_text = isset( $instance['text'] ) ? $instance['text'] : ''; +$suffice_toolkit_more_text = isset( $instance['more-text'] ) ? $instance['more-text'] : ''; +$suffice_toolkit_more_url = isset( $instance['more-url'] ) ? $instance['more-url'] : ''; +$suffice_toolkit_more_text2 = isset( $instance['more-text2'] ) ? $instance['more-text2'] : ''; +$suffice_toolkit_more_url2 = isset( $instance['more-url2'] ) ? $instance['more-url2'] : ''; +$suffice_toolkit_linktarget = isset( $instance['link-target'] ) ? $instance['link-target'] : ''; +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : 'cta-boxed-one'; // Sets the button class as per style. -$btn_class = array( +$suffice_toolkit_btn_class = array( 'one' => 'btn', 'two' => 'btn', ); -if ( 'cta-boxed-one' === $style ) { - $btn_class = array( +if ( 'cta-boxed-one' === $suffice_toolkit_style ) { + $suffice_toolkit_btn_class = array( 'one' => 'btn btn-medium btn-primary btn-rounded', 'two' => 'btn hide', ); -} elseif ( 'cta-big-bordered' === $style ) { - $btn_class = array( +} elseif ( 'cta-big-bordered' === $suffice_toolkit_style ) { + $suffice_toolkit_btn_class = array( 'one' => 'btn btn-medium btn-ghost btn-primary', 'two' => 'btn btn-medium btn-ghost btn-primary', ); -} elseif ( 'cta-background' === $style ) { - $btn_class = array( +} elseif ( 'cta-background' === $suffice_toolkit_style ) { + $suffice_toolkit_btn_class = array( 'one' => 'btn btn-wide btn-rounded-edges btn-white', 'two' => 'btn btn-wide btn-rounded-edges btn-black', ); } ?> -
+
- +
- +
- -

+ +

- +
-

+

@@ -79,17 +79,15 @@
- + > - + >
diff --git a/templates/content-widget-featured-posts.php b/templates/content-widget-featured-posts.php index bebb8e9..ec1232e 100644 --- a/templates/content-widget-featured-posts.php +++ b/templates/content-widget-featured-posts.php @@ -20,86 +20,90 @@ exit; } -$source = isset( $instance['source'] ) ? $instance['source'] : 'latest'; -$category = isset( $instance['category'] ) ? $instance['category'] : ''; -$style = isset( $instance['style'] ) ? $instance['style'] : 'feature-post-style-one'; +$suffice_toolkit_source = isset( $instance['source'] ) ? $instance['source'] : 'latest'; +$suffice_toolkit_category = isset( $instance['category'] ) ? $instance['category'] : ''; +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : 'feature-post-style-one'; // Image Size. -$image_size = ''; -if ( 'feature-post-style-one' === $style ) { - $image_size = 'suffice-thumbnail-featured-one'; -} elseif ( 'feature-post-style-two' === $style ) { - $image_size = 'suffice-thumbnail-post-large'; +$suffice_toolkit_image_size = ''; +if ( 'feature-post-style-one' === $suffice_toolkit_style ) { + $suffice_toolkit_image_size = 'suffice-thumbnail-featured-one'; +} elseif ( 'feature-post-style-two' === $suffice_toolkit_style ) { + $suffice_toolkit_image_size = 'suffice-thumbnail-post-large'; } else { - $image_size = 'suffice-thumbnail-post-large'; + $suffice_toolkit_image_size = 'suffice-thumbnail-post-large'; } // Number. -$post_number = ''; -if ( 'feature-post-style-one' === $style ) { - $post_number = 4; -} elseif ( 'feature-post-style-two' === $style ) { - $post_number = 4; +$suffice_toolkit_post_number = ''; +if ( 'feature-post-style-one' === $suffice_toolkit_style ) { + $suffice_toolkit_post_number = 4; +} elseif ( 'feature-post-style-two' === $suffice_toolkit_style ) { + $suffice_toolkit_post_number = 4; } else { - $post_number = 6; + $suffice_toolkit_post_number = 6; } // Row class. -$row_class = 'row'; -if ( 'feature-post-style-one' === $style ) { - $row_class = 'row no-gutter'; -} elseif ( 'feature-post-style-two' === $style ) { - $row_class = 'no-row'; +$suffice_toolkit_row_class = 'row'; +if ( 'feature-post-style-one' === $suffice_toolkit_style ) { + $suffice_toolkit_row_class = 'row no-gutter'; +} elseif ( 'feature-post-style-two' === $suffice_toolkit_style ) { + $suffice_toolkit_row_class = 'no-row'; } // Featured post class. -$feature_post_class = ''; -if ( 'feature-post-style-one' === $style ) { - $feature_post_class = 'col-md-3'; -} elseif ( 'feature-post-style-three' === $style ) { - $feature_post_class = 'col-md-4'; +$suffice_toolkit_feature_post_class = ''; +if ( 'feature-post-style-one' === $suffice_toolkit_style ) { + $suffice_toolkit_feature_post_class = 'col-md-3'; +} elseif ( 'feature-post-style-three' === $suffice_toolkit_style ) { + $suffice_toolkit_feature_post_class = 'col-md-4'; } -if ( 'latest' === $source ) { - $get_featured_posts = new WP_Query( array( - 'posts_per_page' => $post_number, - 'post_type' => 'post', - 'ignore_sticky_posts' => true, - ) ); +if ( 'latest' === $suffice_toolkit_source ) { + $suffice_toolkit_get_featured_posts = new WP_Query( + array( + 'posts_per_page' => $suffice_toolkit_post_number, + 'post_type' => 'post', + 'ignore_sticky_posts' => true, + ) + ); } else { - $get_featured_posts = new WP_Query( array( - 'posts_per_page' => $post_number, - 'post_type' => 'post', - 'category__in' => $category, - ) ); + $suffice_toolkit_get_featured_posts = new WP_Query( + array( + 'posts_per_page' => $suffice_toolkit_post_number, + 'post_type' => 'post', + 'category__in' => $suffice_toolkit_category, + ) + ); } ?> -
-
+
+
have_posts() ) : - $get_featured_posts->the_post(); + while ( $suffice_toolkit_get_featured_posts->have_posts() ) : + $suffice_toolkit_get_featured_posts->the_post(); ?> - current_post && 'feature-post-style-two' === $style ) : ?> + current_post && 'feature-post-style-two' === $suffice_toolkit_style ) : ?>
-
+
- current_post && 'feature-post-style-two' === $style ? 'suffice-thumbnail-featured-two' : $image_size ) ); ?> + current_post && 'feature-post-style-two' === $suffice_toolkit_style ? 'suffice-thumbnail-featured-two' : $suffice_toolkit_image_size ) ); ?> - +
- current_post === $get_featured_posts->post_count - 1 && 'feature-post-style-two' === $style ) : ?> + current_post === $suffice_toolkit_get_featured_posts->post_count - 1 && 'feature-post-style-two' === $suffice_toolkit_style ) : ?>
- $icon_color, - 'font_size' => $icon_font_size, - 'background_color' => $icon_background_color, -) ); +$suffice_toolkit_custom_icon_style = suffice_toolkit_inline_style( + array( + 'color' => $suffice_toolkit_icon_color, + 'font_size' => $suffice_toolkit_icon_font_size, + 'background_color' => $suffice_toolkit_icon_background_color, + ) +); ?> -
- -
> +
+ +
>
- +
- -
diff --git a/templates/content-widget-image.php b/templates/content-widget-image.php index 307acf1..b0985cc 100644 --- a/templates/content-widget-image.php +++ b/templates/content-widget-image.php @@ -20,11 +20,11 @@ exit; } -$image = isset( $instance['image'] ) ? $instance['image'] : ''; -$link = isset( $instance['image_link'] ) ? $instance['image_link'] : ''; +$suffice_toolkit_image = isset( $instance['image'] ) ? $instance['image'] : ''; +$suffice_toolkit_link = isset( $instance['image_link'] ) ? $instance['image_link'] : ''; ?> - - + + - + diff --git a/templates/content-widget-logo.php b/templates/content-widget-logo.php index 938ba05..81dd874 100644 --- a/templates/content-widget-logo.php +++ b/templates/content-widget-logo.php @@ -19,28 +19,28 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -$logos = isset( $instance['repeatable_logos'] ) ? $instance['repeatable_logos'] : array(); -$style = isset( $instance['style'] ) ? $instance['style'] : 'logos-slider-style-clean'; -$linktarget = isset( $instance['link-target'] ) ? $instance['link-target'] : 'same-window'; -$columns = isset( $instance['columns'] ) ? $instance['columns'] : '3'; +$suffice_toolkit_logos = isset( $instance['repeatable_logos'] ) ? $instance['repeatable_logos'] : array(); +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : 'logos-slider-style-clean'; +$suffice_toolkit_linktarget = isset( $instance['link-target'] ) ? $instance['link-target'] : 'same-window'; +$suffice_toolkit_columns = isset( $instance['columns'] ) ? $instance['columns'] : '3'; ?>
-
+
diff --git a/templates/content-widget-portfolio.php b/templates/content-widget-portfolio.php index af6025e..f0e31a3 100644 --- a/templates/content-widget-portfolio.php +++ b/templates/content-widget-portfolio.php @@ -20,87 +20,136 @@ exit; } -$categories = isset( $instance['categories'] ) ? $instance['categories'] : ''; -$number = isset( $instance['number'] ) ? $instance['number'] : ''; -$filter = empty( $instance['filter'] ) ? 0 : 1; -$style = isset( $instance['style'] ) ? $instance['style'] : 'portfolio-with-text'; -$column = isset( $instance['column'] ) ? $instance['column'] : '4'; +$suffice_toolkit_categories = isset( $instance['categories'] ) ? $instance['categories'] : ''; +$suffice_toolkit_number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 0; +$suffice_toolkit_filter = ! empty( $instance['filter'] ); +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : 'portfolio-with-text'; +$suffice_toolkit_column = isset( $instance['column'] ) ? $instance['column'] : '4'; ?> -'; +
-if ( $filter && ! $categories ) { - $terms = get_terms( 'portfolio_cat' ); + + 'portfolio_cat', + ) + ); + ?> - // Filter. - $output .= ''; -} + + -// Grid. -$output .= '
    '; + 'portfolio', - 'posts_per_page' => $number, - 'tax_query' => array( + if ( '0' === $suffice_toolkit_categories ) { + $suffice_toolkit_terms = get_terms( array( 'taxonomy' => 'portfolio_cat', - 'field' => 'id', - 'terms' => $included_terms, - ), - ), - ) -); + ) + ); -while ( $project_query->have_posts() ) : - $project_query->the_post(); + if ( ! is_wp_error( $suffice_toolkit_terms ) ) { + $suffice_toolkit_included_terms = wp_list_pluck( $suffice_toolkit_terms, 'term_id' ); + } + } else { + $suffice_toolkit_included_terms = (array) $suffice_toolkit_categories; + } + ?> - global $post; + -$output .= '
'; -$output .= '
'; -echo $output; +
diff --git a/templates/content-widget-slider.php b/templates/content-widget-slider.php index 477d9d3..a926669 100644 --- a/templates/content-widget-slider.php +++ b/templates/content-widget-slider.php @@ -20,39 +20,39 @@ exit; } -$repeatable_slider = isset( $instance['repeatable_slider'] ) ? $instance['repeatable_slider'] : array(); -$controls = isset( $instance['controls'] ) ? $instance['controls'] : 'slider-controls-rounded'; -$height = isset( $instance['height'] ) ? $instance['height'] : 'slider-height--default'; +$suffice_toolkit_repeatable_slider = isset( $instance['repeatable_slider'] ) ? $instance['repeatable_slider'] : array(); +$suffice_toolkit_controls = isset( $instance['controls'] ) ? $instance['controls'] : 'slider-controls-rounded'; +$suffice_toolkit_height = isset( $instance['height'] ) ? $instance['height'] : 'slider-height--default'; ?> - -
+ +
-
+
- -

+ +

- -

+ +

- - + +
- <?php echo esc_html( $slider['title'] ); ?> + <?php echo esc_html( $suffice_toolkit_slider['title'] ); ?>
-
+
- +
- <?php echo esc_attr( $name ); ?> + <?php echo esc_attr( $suffice_toolkit_name ); ?>
- +
- -
+ +
- - + + - + diff --git a/templates/content-widget-testimonial.php b/templates/content-widget-testimonial.php index 3dcde4a..399d3d7 100644 --- a/templates/content-widget-testimonial.php +++ b/templates/content-widget-testimonial.php @@ -19,35 +19,35 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -$repeatable_testimonial = isset( $instance['repeatable_testimonial'] ) ? $instance['repeatable_testimonial'] : array(); -$style = isset( $instance['style'] ) ? $instance['style'] : ''; -$columns = isset( $instance['columns'] ) ? $instance['columns'] : '2'; +$suffice_toolkit_repeatable_testimonial = isset( $instance['repeatable_testimonial'] ) ? $instance['repeatable_testimonial'] : array(); +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : ''; +$suffice_toolkit_columns = isset( $instance['columns'] ) ? $instance['columns'] : '2'; ?>
-
    - -
  • - -

    +
      + +
    • + +

      - +
      - +
      - <?php echo esc_attr( $testimonial['name'] ); ?> + <?php echo esc_attr( $suffice_toolkit_testimonial['name'] ); ?>
      - -

      + +

      -
      - +
      +
    • diff --git a/templates/content-widget-title.php b/templates/content-widget-title.php index 4195afc..ecc58ca 100644 --- a/templates/content-widget-title.php +++ b/templates/content-widget-title.php @@ -19,24 +19,24 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -$title = isset( $instance['tg-title'] ) ? $instance['tg-title'] : ''; -$sub_title = isset( $instance['tg-sub-title'] ) ? $instance['tg-sub-title'] : ''; -$position = isset( $instance['position'] ) ? $instance['position'] : ''; -$style = isset( $instance['style'] ) ? $instance['style'] : ''; +$suffice_toolkit_title = isset( $instance['tg-title'] ) ? $instance['tg-title'] : ''; +$suffice_toolkit_sub_title = isset( $instance['tg-sub-title'] ) ? $instance['tg-sub-title'] : ''; +$suffice_toolkit_position = isset( $instance['position'] ) ? $instance['position'] : ''; +$suffice_toolkit_style = isset( $instance['style'] ) ? $instance['style'] : ''; ?> -
      -

      +
      +

      - -

      + +

      - +
      - +


      From ebeba1c7ee57f0ea057333f3ee1ab17c00d7e0e8 Mon Sep 17 00:00:00 2001 From: Jenisha Munikar Date: Fri, 24 Apr 2026 08:40:12 +0545 Subject: [PATCH 2/7] fix: correct text domain and add ABSPATH check to prevent direct access --- includes/class-suffice-inline-style.php | 1 + includes/functions-suffice-widget.php | 2 +- includes/libraries/wp-async-request.php | 2 ++ includes/widgets/class-suffice-widget-iconbox.php | 12 ++++++------ includes/widgets/class-suffice-widget-team.php | 2 +- includes/widgets/class-suffice-widget-title.php | 2 +- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/includes/class-suffice-inline-style.php b/includes/class-suffice-inline-style.php index 925c2fb..8381d1c 100644 --- a/includes/class-suffice-inline-style.php +++ b/includes/class-suffice-inline-style.php @@ -7,6 +7,7 @@ * License: GPLv2 or later * License URI: http://www.gnu.org/licenses/gpl-2.0.html */ +if ( ! defined( 'ABSPATH' ) ) exit; class Suffice_Toolkit_Inline_Style { private $style; diff --git a/includes/functions-suffice-widget.php b/includes/functions-suffice-widget.php index 012f8cb..e6888ac 100644 --- a/includes/functions-suffice-widget.php +++ b/includes/functions-suffice-widget.php @@ -84,7 +84,7 @@ function suffice_toolkit_widgets($widgets) { /* Add a tab for the theme widgets in the page builder */ function suffice_toolkit_widgets_tab($tabs){ $tabs[] = array( - 'title' => __('Suffice Toolkit Widgets', 'suffice'), + 'title' => __('Suffice Toolkit Widgets', 'suffice-toolkit'), 'filter' => array( 'groups' => array('suffice-toolkit') ) diff --git a/includes/libraries/wp-async-request.php b/includes/libraries/wp-async-request.php index af5b052..a0e534e 100644 --- a/includes/libraries/wp-async-request.php +++ b/includes/libraries/wp-async-request.php @@ -5,6 +5,8 @@ * @package WP-Background-Processing */ +if ( ! defined( 'ABSPATH' ) ) exit; + if ( ! class_exists( 'WP_Async_Request' ) ) { /** diff --git a/includes/widgets/class-suffice-widget-iconbox.php b/includes/widgets/class-suffice-widget-iconbox.php index 8952841..5627e37 100644 --- a/includes/widgets/class-suffice-widget-iconbox.php +++ b/includes/widgets/class-suffice-widget-iconbox.php @@ -95,20 +95,20 @@ public function __construct() { 'icon-color' => array( 'type' => 'color_picker', 'std' => '', - 'label' => esc_html__( 'Icon Color', 'suffice' ), - 'group' => esc_html__( 'Color', 'suffice' ), + 'label' => esc_html__( 'Icon Color', 'suffice-toolkit' ), + 'group' => esc_html__( 'Color', 'suffice-toolkit' ), ), 'icon-background-color' => array( 'type' => 'color_picker', 'std' => '', - 'label' => esc_html__( 'Icon Background Color', 'suffice' ), - 'group' => esc_html__( 'Color', 'suffice' ), + 'label' => esc_html__( 'Icon Background Color', 'suffice-toolkit' ), + 'group' => esc_html__( 'Color', 'suffice-toolkit' ), ), 'icon-font-size' => array( 'type' => 'text', 'std' => '', - 'label' => esc_html__( 'Icon Font Size', 'suffice' ), - 'group' => esc_html__( 'Color', 'suffice' ), + 'label' => esc_html__( 'Icon Font Size', 'suffice-toolkit' ), + 'group' => esc_html__( 'Color', 'suffice-toolkit' ), ), 'link-target' => array( 'type' => 'select', diff --git a/includes/widgets/class-suffice-widget-team.php b/includes/widgets/class-suffice-widget-team.php index 045bf5c..ba4e176 100644 --- a/includes/widgets/class-suffice-widget-team.php +++ b/includes/widgets/class-suffice-widget-team.php @@ -32,7 +32,7 @@ public function __construct() { $this->settings = apply_filters( 'suffice_toolkit_widget_settings_' . $this->widget_id, array( 'name' => array( 'type' => 'text', - 'std' => __( '', 'suffice-toolkit' ), + 'std' => '', 'label' => __( 'Team Member Name', 'suffice-toolkit' ), 'group' => __( 'General', 'suffice-toolkit' ), ), diff --git a/includes/widgets/class-suffice-widget-title.php b/includes/widgets/class-suffice-widget-title.php index 491c242..d5344b1 100644 --- a/includes/widgets/class-suffice-widget-title.php +++ b/includes/widgets/class-suffice-widget-title.php @@ -38,7 +38,7 @@ public function __construct() { ), 'tg-sub-title' => array( 'type' => 'text', - 'std' => __( '', 'suffice-toolkit' ), + 'std' => '', 'label' => __( 'Sub Title', 'suffice-toolkit' ), 'group' => __( 'General', 'suffice-toolkit' ), ), From 8a5506987db245000c63556bd4e52ef19653e85c Mon Sep 17 00:00:00 2001 From: Jenisha Munikar Date: Fri, 24 Apr 2026 08:41:25 +0545 Subject: [PATCH 3/7] fix: use local jquery-ui stylesheet instead of remote CDN --- .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 429 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 301 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 359 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 360 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 426 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 361 bytes assets/css/images/ui-icons_222222_256x240.png | Bin 0 -> 7051 bytes assets/css/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4615 bytes assets/css/images/ui-icons_454545_256x240.png | Bin 0 -> 7107 bytes assets/css/images/ui-icons_888888_256x240.png | Bin 0 -> 7115 bytes assets/css/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4615 bytes assets/css/jquery-ui.css | 5 ++ includes/admin/class-suffice-admin-assets.php | 78 +++++++++++------- 13 files changed, 53 insertions(+), 30 deletions(-) create mode 100644 assets/css/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 assets/css/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 assets/css/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 assets/css/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 assets/css/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 assets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 assets/css/images/ui-icons_222222_256x240.png create mode 100644 assets/css/images/ui-icons_2e83ff_256x240.png create mode 100644 assets/css/images/ui-icons_454545_256x240.png create mode 100644 assets/css/images/ui-icons_888888_256x240.png create mode 100644 assets/css/images/ui-icons_cd0a0a_256x240.png create mode 100644 assets/css/jquery-ui.css diff --git a/assets/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/assets/css/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..de4fa90eba7d1b0eb65c2d761de254e625e993a6 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCYQVtoDuIE)Y6b&?c)^@qfi^%1wj^(Nm;YeE8S(uNP=vk2)7O>#6^kf~g_`zt zrq4hj)e_f;l9a@fRIB8oR3OD*WME{bYha>lWEf&#Vr6P(Wo)5sU|?ln@aEw8izpg$ z^HVa@DsgL=JEuGss6hj6LrG?CYH>+oZUJsRr#izn0rm8Hx;Tb-9DjRWk&DSuq~T%x zyd;5~=8g@E*&HPdt2thWt&TLvy!*R?`CxNJt7uvGW9fsBL|qPh$N#wOzwhNTOKt{< zwnT~hY*(kensul4+q<|AEMAExde#~wy(@Eae4-+vb2o6thDA#8CMF**pWwIM5?q)p y_NLNx?>5g5Ea6v`8EG3BSQ!}9%%3TSq9Hdw zB{QuOw+7xrimQMcG~hOrWag$8mn7yE;MNm$ouL${N6^#7F+}5haz=tg>*4~DM-2>9 XGfpsGHrbd7lw|O9^>bP0l+XkKS>j8s literal 0 HcmV?d00001 diff --git a/assets/css/images/ui-bg_glass_75_dadada_1x400.png b/assets/css/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..0f06aafdea2a503a33876b933ace92cf50ce18ba GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq!f}pf_xbms?-=58d?|_egTCV zUNA6}8Za=tN?>5Hn!&&zUNC1@pbb!hDaqU2<^O+?)rMz*JoXY#Usv{5EF#R3<^|kt zOh6&k64!{5l*E!$tK_0oAjM#0U}UCiV4`be5Mp3#Wn^k)YN~BuU}azsl{fD`iiX_$ zl+3hB+#0lv)slf4G~hOrWag$8mn7yE;MP;4#=Zxr$J^7zF~s6@a>cLtosEeiy-He( z*Ke21t2Q+JmzX4yo@A1^<9~anX8Xg7>}t!(+LrfA&iid>$Yx+T%fRqoT2joxBMQbJ f_~cxj85tR5-U%zj+vV2-jb-q3^>bP0l+XkKSF>aE literal 0 HcmV?d00001 diff --git a/assets/css/images/ui-bg_glass_75_e6e6e6_1x400.png b/assets/css/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9bcb6c7d361d5831d01d5809d2a7c8cecf0b1e GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq!f}pf_xbms?-=58d?|_egTCV zUNA6}8Za=tN?>5Hn!&&zUNC1@pbb!hDaqU2<^O+?)rMz*JoXY#Usv{5EF#R3X6!s= zQ-DIMC9V-ADTyViR>?)FK#IZ0z{pJ3z(m)`AjH7f%E;8p)I{6Bz{TllfLnj4>*o1faTe4n29nG*8GH7RLH5l26G_H{Z| g9FVo?YGYwyxMCn=b?<}1381+Qp00i_>zopr0JGC)UH||9 literal 0 HcmV?d00001 diff --git a/assets/css/images/ui-bg_glass_95_fef1ec_1x400.png b/assets/css/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..38a5af7eadd56343cf871766686cb60c47e8942b GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCYQVtoDuIE)Y6b&?c)^@qfi^%1wj^(Nm;YeE8S(uNP=vk2)7O>#6^kf~g_`zt zrq4hj)e_f;l9a@fRIB8oR3OD*WME{bYha>lWEf&#Vr6P(Wo)5sU|?ln@aEw8izpg$ z^HVa@DsgL=JEuGss6hj6LrG?CYH>+oZUJsRr#izn0rhlwx;Tb-9DjR$BQIm3MEl3* z|HXu!$0&vg^j_ohQjR#lFzv#HZkJkNi3VQ1v>$dSWjo*5v2JV(*mHG##j5r#6=&WF zGcz17lzD#p!nRUbrjxS@=SiiWdt;U!YHwOR>EiX-;fq5|ir(&& wm}zDu85?FLA^S{+S3}~@(JhZH&hb|=x$A1A%$m>X0dy6Er>mdKI;Vst01-Zq82|tP literal 0 HcmV?d00001 diff --git a/assets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/assets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae851c1b4f07e211d616d8436e7bddabe8c025d GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q!f}pf_xbms?-=58d?|_egTCV zUNA6}8Za=tN?>5Hn!&&zUNC1@pbb!hDaqU2<^O+?)rMz*JoXY#Usv{5ETSwHYTDPC zJ_ChROI#yLQW8s2t&)pUffR$0fsvW6fr+k>VTgf=m8qGPv4ysQft7*5n}g>sqG-s? zPsvQH#I0fOobp_t1`W6kC7HRY#U+Wk1-SK`>I~Zi)Z^>v;us=vdGEP}ybTTltQY6M ze6;Fj-iw~BJkv)iA`Y7t{M3;7HA&sQr;j(YYvEs)MrQMv9UoeEAM3UDo3rEdnjHm? kew{kNt9xor>F>v^a(mSNZhOez0W_Gw)78&qol`;+08P$xHUIzs literal 0 HcmV?d00001 diff --git a/assets/css/images/ui-icons_222222_256x240.png b/assets/css/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..b30f93c2632354bcba90970c66286c9037d3b127 GIT binary patch literal 7051 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 ScgoL-a6kuZs8Otj3;ho*P?A9a literal 0 HcmV?d00001 diff --git a/assets/css/images/ui-icons_454545_256x240.png b/assets/css/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ebf84aec73f494e4f3c8a1542092793bb60811 GIT binary patch literal 7107 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 literal 0 HcmV?d00001 diff --git a/assets/css/images/ui-icons_888888_256x240.png b/assets/css/images/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2b85be35a14a96354f82e47f5cd58cf2169b99de GIT binary patch literal 7115 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.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw,.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:pointer;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:700}.ui-widget-header a{color:#222}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:400;color:#555}.ui-button,.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button{color:#555;text-decoration:none}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:400;color:#212121}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,a.ui-button:focus,a.ui-button:hover{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:400;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;background-image:none}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-button:active .ui-icon,.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-button .ui-state-highlight.ui-icon,.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank.ui-icon-blank.ui-icon-blank{background-image:none}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:4px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3}.ui-widget-shadow{box-shadow:-8px -8px 8px #aaa} \ No newline at end of file diff --git a/includes/admin/class-suffice-admin-assets.php b/includes/admin/class-suffice-admin-assets.php index b4c6618..c3fa985 100644 --- a/includes/admin/class-suffice-admin-assets.php +++ b/includes/admin/class-suffice-admin-assets.php @@ -37,11 +37,11 @@ public function admin_styles() { $screen = get_current_screen(); $screen_id = $screen ? $screen->id : ''; - $jquery_version = isset( $wp_scripts->registered['jquery-ui-core']->ver ) ? $wp_scripts->registered['jquery-ui-core']->ver : '1.9.2'; + $jquery_version = isset( $wp_scripts->registered['jquery-ui-core']->ver ) ? $wp_scripts->registered['jquery-ui-core']->ver : '1.14.2'; // Register admin styles. wp_register_style( 'font-awesome', ST()->plugin_url() . '/assets/css/fontawesome.css', array(), '4.6.3' ); - wp_register_style( 'jquery-ui-style', '//code.jquery.com/ui/' . $jquery_version . '/themes/smoothness/jquery-ui.css', array(), $jquery_version ); + wp_register_style( 'jquery-ui-style', ST()->plugin_url() . '/assets/css/jquery-ui.css', array(), $jquery_version ); wp_register_style( 'suffice-toolkit-menu', ST()->plugin_url() . '/assets/css/menu.css', array(), ST_VERSION ); wp_register_style( 'suffice-toolkit-admin', ST()->plugin_url() . '/assets/css/admin.css', array(), ST_VERSION ); wp_register_style( 'suffice-toolkit-admin-widgets', ST()->plugin_url() . '/assets/css/widgets.css', array( 'font-awesome', 'wp-color-picker' ), ST_VERSION ); @@ -70,30 +70,44 @@ public function admin_scripts() { $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; // Register admin scripts. - wp_register_script( 'suffice-toolkit-admin', ST()->plugin_url() . '/assets/js/admin/admin' . $suffix . '.js', array( 'jquery', 'jquery-ui-sortable', 'jquery-ui-widget', 'jquery-ui-core', 'jquery-tiptip' ), ST_VERSION ); - wp_register_script( 'suffice-toolkit-admin-widgets', ST()->plugin_url() . '/assets/js/admin/widgets' . $suffix . '.js', array( 'jquery', 'jquery-ui-sortable', 'wp-util', 'underscore', 'backbone', 'suffice-enhanced-select', 'wp-color-picker' ), ST_VERSION ); - wp_register_script( 'suffice-toolkit-admin-sidebars', ST()->plugin_url() . '/assets/js/admin/sidebars' . $suffix . '.js', array( 'jquery' ), ST_VERSION ); + wp_register_script( 'suffice-toolkit-admin', ST()->plugin_url() . '/assets/js/admin/admin' . $suffix . '.js', array( 'jquery', 'jquery-ui-sortable', 'jquery-ui-widget', 'jquery-ui-core', 'jquery-tiptip' ), ST_VERSION, true ); + wp_register_script( 'suffice-toolkit-admin-widgets', ST()->plugin_url() . '/assets/js/admin/widgets' . $suffix . '.js', array( 'jquery', 'jquery-ui-sortable', 'wp-util', 'underscore', 'backbone', 'suffice-enhanced-select', 'wp-color-picker' ), ST_VERSION, true ); + wp_register_script( 'suffice-toolkit-admin-sidebars', ST()->plugin_url() . '/assets/js/admin/sidebars' . $suffix . '.js', array( 'jquery' ), ST_VERSION, true ); wp_register_script( 'jquery-tiptip', ST()->plugin_url() . '/assets/js/jquery-tiptip/jquery.tipTip' . $suffix . '.js', array( 'jquery' ), ST_VERSION, true ); - wp_register_script( 'select2', ST()->plugin_url() . '/assets/js/select2/select2' . $suffix . '.js', array( 'jquery' ), '4.0.3' ); - wp_register_script( 'suffice-enhanced-select', ST()->plugin_url() . '/assets/js/admin/enhanced-select' . $suffix . '.js', array( 'jquery', 'select2' ), ST_VERSION ); - wp_localize_script( 'suffice-enhanced-select', 'suffice_enhanced_select_params', array( - 'i18n_matches_1' => _x( 'One result is available, press enter to select it.', 'enhanced select', 'suffice-toolkit' ), - 'i18n_matches_n' => _x( '%qty% results are available, use up and down arrow keys to navigate.', 'enhanced select', 'suffice-toolkit' ), - 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'suffice-toolkit' ), - 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'suffice-toolkit' ), - 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'suffice-toolkit' ), - 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'suffice-toolkit' ), - 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'suffice-toolkit' ), - 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'suffice-toolkit' ), - 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'suffice-toolkit' ), - 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'suffice-toolkit' ), - 'i18n_load_more' => _x( 'Loading more results…', 'enhanced select', 'suffice-toolkit' ), - 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'suffice-toolkit' ) - ) ); - wp_localize_script( 'suffice-toolkit-admin-widgets', 'sufficeToolkitLocalizeScript', array( - 'i18n_max_field_entries' => apply_filters( 'suffice_toolkit_maximum_repeater_field_entries', 5 ), - 'i18n_max_field_message' => esc_js( sprintf( __( 'You can add upto %s fields.', 'suffice-toolkit' ), apply_filters( 'suffice_toolkit_maximum_repeater_field_entries', 5 ) ) ), - ) ); + wp_register_script( 'select2', ST()->plugin_url() . '/assets/js/select2/select2' . $suffix . '.js', array( 'jquery' ), '4.0.3', true ); + wp_register_script( 'suffice-enhanced-select', ST()->plugin_url() . '/assets/js/admin/enhanced-select' . $suffix . '.js', array( 'jquery', 'select2' ), ST_VERSION, true ); + wp_localize_script( + 'suffice-enhanced-select', + 'suffice_enhanced_select_params', + array( + 'i18n_matches_1' => _x( 'One result is available, press enter to select it.', 'enhanced select', 'suffice-toolkit' ), + 'i18n_matches_n' => _x( '%qty% results are available, use up and down arrow keys to navigate.', 'enhanced select', 'suffice-toolkit' ), + 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'suffice-toolkit' ), + 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'suffice-toolkit' ), + 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'suffice-toolkit' ), + 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'suffice-toolkit' ), + 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'suffice-toolkit' ), + 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'suffice-toolkit' ), + 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'suffice-toolkit' ), + 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'suffice-toolkit' ), + 'i18n_load_more' => _x( 'Loading more results…', 'enhanced select', 'suffice-toolkit' ), + 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'suffice-toolkit' ), + ) + ); + wp_localize_script( + 'suffice-toolkit-admin-widgets', + 'sufficeToolkitLocalizeScript', + array( + 'i18n_max_field_entries' => apply_filters( 'suffice_toolkit_maximum_repeater_field_entries', 5 ), + 'i18n_max_field_message' => esc_js( + sprintf( + /* translators: %s: maximum number of fields allowed */ + __( 'You can add up to %s fields.', 'suffice-toolkit' ), + apply_filters( 'suffice_toolkit_maximum_repeater_field_entries', 5 ) + ) + ), + ) + ); // SufficeToolkit admin pages. if ( in_array( $screen_id, suffice_toolkit_get_screen_ids() ) ) { @@ -109,11 +123,15 @@ public function admin_scripts() { if ( 'widgets' === $screen_id && is_suffice_pro_active() ) { wp_enqueue_script( 'suffice-toolkit-admin-sidebars' ); - wp_localize_script( 'suffice-toolkit-admin-sidebars', 'suffice_toolkit_admin_sidebars', array( - 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'delete_custom_sidebar_nonce' => wp_create_nonce( 'delete-custom-sidebar' ), - 'i18n_confirm_delete_custom_sidebar' => __( 'Delete this Sidebar Permanently and store all widgets in Inactive Sidebar. Are you positive you want to delete this Sidebar?', 'suffice-toolkit' ), - ) ); + wp_localize_script( + 'suffice-toolkit-admin-sidebars', + 'suffice_toolkit_admin_sidebars', + array( + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'delete_custom_sidebar_nonce' => wp_create_nonce( 'delete-custom-sidebar' ), + 'i18n_confirm_delete_custom_sidebar' => __( 'Delete this Sidebar Permanently and store all widgets in Inactive Sidebar. Are you positive you want to delete this Sidebar?', 'suffice-toolkit' ), + ) + ); } } } From 94409abb9fc27859a2d847442f4b6e8b7018f481 Mon Sep 17 00:00:00 2001 From: Jenisha Munikar Date: Fri, 24 Apr 2026 08:46:24 +0545 Subject: [PATCH 4/7] fix: implement nonce verification, sanitize and escape data, and add translators comments for compliance --- .../abstracts/abstract-suffice-widget.php | 349 +++++++++--------- .../views/html-admin-tmpl-repeater.php | 16 +- .../admin/class-suffice-admin-notices.php | 16 +- ...class-suffice-admin-permalink-settings.php | 38 +- .../admin/class-suffice-admin-post-types.php | 96 ++++- includes/admin/class-suffice-admin.php | 27 +- includes/admin/functions-suffice-meta-box.php | 38 +- .../class-suffice-meta-box-layout-data.php | 125 +++++-- .../class-suffice-meta-box-portfolio-data.php | 120 +++--- .../admin/views/html-admin-tmpl-sidebars.php | 4 +- includes/admin/views/html-notice-custom.php | 2 +- includes/admin/views/html-notice-update.php | 4 +- includes/admin/views/html-notice-updated.php | 4 +- includes/admin/views/html-notice-updating.php | 2 +- includes/class-suffice-install.php | 16 +- includes/class-suffice-sidebars.php | 32 +- includes/functions-suffice-core.php | 96 ++--- includes/functions-suffice-formatting.php | 29 +- includes/libraries/wp-background-process.php | 106 ++++-- suffice-toolkit.php | 334 ++++++++--------- 20 files changed, 860 insertions(+), 594 deletions(-) diff --git a/includes/abstracts/abstract-suffice-widget.php b/includes/abstracts/abstract-suffice-widget.php index 426aef4..5a63d42 100644 --- a/includes/abstracts/abstract-suffice-widget.php +++ b/includes/abstracts/abstract-suffice-widget.php @@ -9,6 +9,11 @@ * @category Widgets * @author ThemeGrill */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + abstract class ST_Widget extends WP_Widget { /** @@ -59,8 +64,8 @@ abstract class ST_Widget extends WP_Widget { public function __construct() { $widget_ops = array( - 'classname' => $this->widget_cssclass, - 'description' => $this->widget_description, + 'classname' => $this->widget_cssclass, + 'description' => $this->widget_description, 'customize_selective_refresh' => true, ); @@ -86,7 +91,7 @@ public function get_cached_widget( $args ) { } if ( isset( $cache[ $args['widget_id'] ] ) ) { - echo $cache[ $args['widget_id'] ]; + echo $cache[ $args['widget_id'] ]; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped return true; } @@ -120,10 +125,10 @@ public function flush_widget_cache() { * @return string */ public function widget_start( $args, $instance ) { - echo $args['before_widget']; + echo $args['before_widget']; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped if ( $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ) ) { - echo $args['before_title'] . $title . $args['after_title']; + echo $args['before_title'] . esc_html( $title ) . $args['after_title']; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } @@ -134,7 +139,7 @@ public function widget_start( $args, $instance ) { * @return string */ public function widget_end( $args ) { - echo $args['after_widget']; + echo $args['after_widget']; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** @@ -161,7 +166,7 @@ public function update( $new_instance, $old_instance ) { // Format the value based on settings type. switch ( $setting['type'] ) { - case 'number' : + case 'number': $instance[ $key ] = absint( $new_instance[ $key ] ); if ( isset( $setting['min'] ) && '' !== $setting['min'] ) { @@ -171,30 +176,30 @@ public function update( $new_instance, $old_instance ) { if ( isset( $setting['max'] ) && '' !== $setting['max'] ) { $instance[ $key ] = min( $instance[ $key ], $setting['max'] ); } - break; - case 'textarea' : + break; + case 'textarea': if ( current_user_can( 'unfiltered_html' ) ) { $instance[ $key ] = $new_instance[ $key ]; } else { $instance[ $key ] = wp_kses( trim( wp_unslash( $new_instance[ $key ] ) ), wp_kses_allowed_html( 'post' ) ); } - break; - case 'checkbox' : + break; + case 'checkbox': $instance[ $key ] = empty( $new_instance[ $key ] ) ? 0 : 1; - break; - case 'select_categories' : - if( is_array($new_instance[$key][0]) ){ + break; + case 'select_categories': + if ( is_array( $new_instance[ $key ][0] ) ) { $instance[ $key ] = $new_instance[ $key ][0]; } else { $instance[ $key ] = isset( $new_instance[ $key ] ) ? suffice_clean( $new_instance[ $key ] ) : ''; } - break; - case 'color_picker' : + break; + case 'color_picker': $instance[ $key ] = $new_instance[ $key ]; - break; + break; default: $instance[ $key ] = isset( $new_instance[ $key ] ) ? suffice_clean( $new_instance[ $key ] ) : ''; - break; + break; } /** @@ -224,96 +229,102 @@ public function form( $instance ) {
      - settings as $key => $setting ) { $group_name = isset( $setting['group'] ) ? $setting['group'] : ''; - if( !in_array( $group_name, $group_name_array ) ) { + if ( ! in_array( $group_name, $group_name_array ) ) { $group_name_array[] = $group_name; - if( $group_name_array[0] != '' ) { ?> - - - - + + + + + } + ?>
      - -
      + foreach ( $group_name_array as $group ) { + ?> +
      - settings as $key => $setting ) { - $current_setting_group = isset( $setting['group'] ) ? $setting['group'] : ''; + settings as $key => $setting ) { + $current_setting_group = isset( $setting['group'] ) ? $setting['group'] : ''; - if( $current_setting_group == $group || empty( $group_name_array ) ) { - $class = isset( $setting['class'] ) ? $setting['class'] : ''; - $value = isset( $instance[ $key ] ) ? $instance[ $key ] : $setting['std']; - $field_width = isset( $setting['field_width'] ) ? $setting['field_width'] : 'col-full'; + if ( $current_setting_group == $group || empty( $group_name_array ) ) { + $class = isset( $setting['class'] ) ? $setting['class'] : ''; + $value = isset( $instance[ $key ] ) ? $instance[ $key ] : $setting['std']; + $field_width = isset( $setting['field_width'] ) ? $setting['field_width'] : 'col-full'; - switch ( $setting['type'] ) { + switch ( $setting['type'] ) { - case 'text' : - ?> + case 'text': + ?>

      - - + +

      - + case 'number': + ?>

      - - + +

      - + case 'select': + ?>

      - - $option_value ) : ?>

      - + case 'radio-image': + ?>

      - + $option_image ) : ?>

      - + case 'select_pages': + case 'select_categories': + ?>

      - - get_field_id( $key ) ); ?>"> + $this->get_field_id( $key ), 'name' => $this->get_field_name( $key ), @@ -327,114 +338,116 @@ public function form( $instance ) { // Display dropdown based on settings type. if ( 'select_pages' === $setting['type'] ) { - wp_dropdown_pages( $args ); + wp_dropdown_pages( $args ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } elseif ( 'select_categories' === $setting['type'] ) { wp_dropdown_categories( $args ); } - ?> + ?>

      - + case 'textarea': + ?>

      - - - + + +

      - + case 'checkbox': + ?>

      /> - +

      - + case 'image': + ?>
      -

      -
      +

      +
      - +

      - - + +

      - + case 'icon_picker': + ?>
      -

      - $option_value ) : ?>
      - + case 'color_picker': + ?>

      - - + +

      - + case 'font_picker': + ?>

      - - $option_value ) : ?>

      - -
      -
      - -
      - +
      +
      + +
      + get_field_name( $setting_key ) . '[' . $field_key . '][' . $key . ']'; switch ( $setting['type'] ) { - case 'text' : + case 'text': ?>

      - - + +

      - - + +

      - - $option_value ) : ?>

      - + $field_id, @@ -504,59 +517,59 @@ public function output_repeater_field( $settings = array(), $instance, $setting_ // Display dropdown based on settings type. if ( 'select_pages' === $setting['type'] ) { - wp_dropdown_pages( $args ); + wp_dropdown_pages( $args ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } elseif ( 'select_categories' === $setting['type'] ) { wp_dropdown_categories( $args ); } - ?> + ?>

      - - + +

      - /> - + /> +

      -

      -
      +

      +

      - - + +

      -

      - $option_value ) : ?> @@ -564,7 +577,7 @@ public function output_repeater_field( $settings = array(), $instance, $setting_
      = apply_filters( 'suffice_toolkit_maximum_repeater_field_entries', 5 ) ? 'disabled' : 'enabled'; +$suffice_toolkit_repeater_field_id = strtolower( str_replace( ' ', '-', $setting['title'] ) ) . '-{{ data.field_id }}'; +$suffice_toolkit_max_field_entries = count( (array) $value ) >= apply_filters( 'suffice_toolkit_maximum_repeater_field_entries', 5 ) ? 'disabled' : 'enabled'; ?>
      -

      +

        $field ) : ?> @@ -33,7 +33,7 @@
      -

      +

      @@ -41,13 +41,13 @@
      diff --git a/includes/admin/class-suffice-admin-notices.php b/includes/admin/class-suffice-admin-notices.php index d14038a..0e48aff 100644 --- a/includes/admin/class-suffice-admin-notices.php +++ b/includes/admin/class-suffice-admin-notices.php @@ -99,15 +99,15 @@ public static function has_notice( $name ) { */ public static function hide_notices() { if ( isset( $_GET['suffice-toolkit-hide-notice'] ) && isset( $_GET['_suffice_toolkit_notice_nonce'] ) ) { - if ( ! wp_verify_nonce( $_GET['_suffice_toolkit_notice_nonce'], 'suffice_toolkit_hide_notices_nonce' ) ) { - wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); + if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_suffice_toolkit_notice_nonce'] ) ), 'suffice_toolkit_hide_notices_nonce' ) ) { + wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } if ( ! current_user_can( 'manage_suffice_toolkit' ) ) { - wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); + wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } - $hide_notice = sanitize_text_field( $_GET['suffice-toolkit-hide-notice'] ); + $hide_notice = sanitize_text_field( wp_unslash( $_GET['suffice-toolkit-hide-notice'] ) ); self::remove_notice( $hide_notice ); do_action( 'suffice_toolkit_hide_' . $hide_notice . '_notice' ); } @@ -153,7 +153,7 @@ public static function output_custom_notices() { $notice_html = get_option( 'suffice_toolkit_admin_notice_' . $notice ); if ( $notice_html ) { - include( 'views/html-notice-custom.php' ); + include 'views/html-notice-custom.php'; } } } @@ -167,12 +167,12 @@ public static function update_notice() { if ( version_compare( get_option( 'suffice_toolkit_db_version' ), ST_VERSION, '<' ) ) { $updater = new ST_Background_Updater(); if ( $updater->is_updating() || ! empty( $_GET['do_update_suffice_toolkit'] ) ) { - include( 'views/html-notice-updating.php' ); + include 'views/html-notice-updating.php'; } else { - include( 'views/html-notice-update.php' ); + include 'views/html-notice-update.php'; } } else { - include( 'views/html-notice-updated.php' ); + include 'views/html-notice-updated.php'; } } } diff --git a/includes/admin/class-suffice-admin-permalink-settings.php b/includes/admin/class-suffice-admin-permalink-settings.php index b3b8420..ac7c9af 100644 --- a/includes/admin/class-suffice-admin-permalink-settings.php +++ b/includes/admin/class-suffice-admin-permalink-settings.php @@ -56,7 +56,12 @@ public function settings_init() { public function portfolio_category_slug_input() { $permalinks = get_option( 'suffice_toolkit_permalinks' ); ?> - + - + '', 1 => '/' . trailingslashit( $base_slug ), - 2 => '/' . trailingslashit( $base_slug ) . trailingslashit( '%portfolio_cat%' ) + 2 => '/' . trailingslashit( $base_slug ) . trailingslashit( '%portfolio_cat%' ), ); ?> + - + - + - + + @@ -144,9 +155,16 @@ public function settings_save() { if ( ! is_admin() ) { return; } - // We need to save the options ourselves; settings api does not trigger save for the permalinks page. if ( isset( $_POST['permalink_structure'] ) ) { + if ( ! isset( $_POST['suffice_toolkit_permalink_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['suffice_toolkit_permalink_nonce'] ) ), 'suffice_toolkit_permalink_action' ) ) { + wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + $permalinks = get_option( 'suffice_toolkit_permalinks' ); if ( ! $permalinks ) { diff --git a/includes/admin/class-suffice-admin-post-types.php b/includes/admin/class-suffice-admin-post-types.php index 0e70063..fbb3cc1 100644 --- a/includes/admin/class-suffice-admin-post-types.php +++ b/includes/admin/class-suffice-admin-post-types.php @@ -47,18 +47,42 @@ public function post_updated_messages( $messages ) { global $post, $post_ID; $messages['portfolio'] = array( - 0 => '', // Unused. Messages start at index 1. - 1 => sprintf( __( 'Project updated. View Project', 'suffice-toolkit' ), esc_url( get_permalink( $post_ID ) ) ), - 2 => __( 'Custom field updated.', 'suffice-toolkit' ), - 3 => __( 'Custom field deleted.', 'suffice-toolkit' ), - 4 => __( 'Project updated.', 'suffice-toolkit' ), - 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Project restored to revision from %s', 'suffice-toolkit' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, - 6 => sprintf( __( 'Project published. View Project', 'suffice-toolkit' ), esc_url( get_permalink( $post_ID ) ) ), - 7 => __( 'Project saved.', 'suffice-toolkit' ), - 8 => sprintf( __( 'Project submitted. Preview project', 'suffice-toolkit' ), esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ) ), - 9 => sprintf( __( 'Project scheduled for: %1$s. Preview project', 'suffice-toolkit' ), - date_i18n( __( 'M j, Y @ G:i', 'suffice-toolkit' ), strtotime( $post->post_date ) ), esc_url( get_permalink( $post_ID ) ) ), - 10 => sprintf( __( 'Project draft updated. Preview project', 'suffice-toolkit' ), esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ) ), + 0 => '', // Unused. Messages start at index 1. + 1 => sprintf( + /* translators: %s: project permalink URL */ + __( 'Project updated. View Project', 'suffice-toolkit' ), + esc_url( get_permalink( $post_ID ) ) + ), + 2 => __( 'Custom field updated.', 'suffice-toolkit' ), + 3 => __( 'Custom field deleted.', 'suffice-toolkit' ), + 4 => __( 'Project updated.', 'suffice-toolkit' ), + 5 => isset( $_GET['revision'] ) ? sprintf( //phpcs:ignore WordPress.Security.NonceVerification.Recommended + /* translators: %s: revision date/time */ + __( 'Project restored to revision from %s', 'suffice-toolkit' ), + wp_post_revision_title( (int) $_GET['revision'], false ) //phpcs:ignore WordPress.Security.NonceVerification.Recommended + ) : false, + 6 => sprintf( + /* translators: %s: project permalink URL */ + __( 'Project published. View Project', 'suffice-toolkit' ), + esc_url( get_permalink( $post_ID ) ) + ), + 7 => __( 'Project saved.', 'suffice-toolkit' ), + 8 => sprintf( + /* translators: %s: project preview URL */ + __( 'Project submitted. Preview project', 'suffice-toolkit' ), + esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ) + ), + 9 => sprintf( + /* translators: 1: scheduled date/time, 2: project preview URL */ + __( 'Project scheduled for: %1$s. Preview project', 'suffice-toolkit' ), + date_i18n( __( 'M j, Y @ G:i', 'suffice-toolkit' ), strtotime( $post->post_date ) ), + esc_url( get_permalink( $post_ID ) ) + ), + 10 => sprintf( + /* translators: %s: URL to preview the project */ + __( 'Project draft updated. Preview project', 'suffice-toolkit' ), + esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ) + ), ); return $messages; @@ -73,11 +97,45 @@ public function post_updated_messages( $messages ) { public function bulk_post_updated_messages( $bulk_messages, $bulk_counts ) { $bulk_messages['portfolio'] = array( - 'updated' => _n( '%s project updated.', '%s projects updated.', $bulk_counts['updated'], 'suffice-toolkit' ), - 'locked' => _n( '%s project not updated, somebody is editing it.', '%s projects not updated, somebody is editing them.', $bulk_counts['locked'], 'suffice-toolkit' ), - 'deleted' => _n( '%s project permanently deleted.', '%s projects permanently deleted.', $bulk_counts['deleted'], 'suffice-toolkit' ), - 'trashed' => _n( '%s project moved to the Trash.', '%s projects moved to the Trash.', $bulk_counts['trashed'], 'suffice-toolkit' ), - 'untrashed' => _n( '%s project restored from the Trash.', '%s projects restored from the Trash.', $bulk_counts['untrashed'], 'suffice-toolkit' ), + /* translators: %s: number of projects updated */ + 'updated' => _n( + '%s project updated.', + '%s projects updated.', + $bulk_counts['updated'], + 'suffice-toolkit' + ), + + /* translators: %s: number of projects not updated because they are locked */ + 'locked' => _n( + '%s project not updated, somebody is editing it.', + '%s projects not updated, somebody is editing them.', + $bulk_counts['locked'], + 'suffice-toolkit' + ), + + /* translators: %s: number of projects permanently deleted */ + 'deleted' => _n( + '%s project permanently deleted.', + '%s projects permanently deleted.', + $bulk_counts['deleted'], + 'suffice-toolkit' + ), + + /* translators: %s: number of projects moved to the trash */ + 'trashed' => _n( + '%s project moved to the Trash.', + '%s projects moved to the Trash.', + $bulk_counts['trashed'], + 'suffice-toolkit' + ), + + /* translators: %s: number of projects restored from the Trash */ + 'untrashed' => _n( + '%s project restored from the Trash.', + '%s projects restored from the Trash.', + $bulk_counts['untrashed'], + 'suffice-toolkit' + ), ); return $bulk_messages; @@ -91,9 +149,9 @@ public function bulk_post_updated_messages( $bulk_messages, $bulk_counts ) { */ public function enter_title_here( $text, $post ) { switch ( $post->post_type ) { - case 'portfolio' : + case 'portfolio': $text = __( 'Project name', 'suffice-toolkit' ); - break; + break; } return $text; diff --git a/includes/admin/class-suffice-admin.php b/includes/admin/class-suffice-admin.php index 8a9b264..8518503 100644 --- a/includes/admin/class-suffice-admin.php +++ b/includes/admin/class-suffice-admin.php @@ -32,11 +32,11 @@ public function __construct() { * Includes any classes we need within admin. */ public function includes() { - include_once( dirname( __FILE__ ) . '/functions-suffice-admin.php' ); - include_once( dirname( __FILE__ ) . '/functions-suffice-meta-box.php' ); - include_once( dirname( __FILE__ ) . '/class-suffice-admin-notices.php' ); - include_once( dirname( __FILE__ ) . '/class-suffice-admin-assets.php' ); - include_once( dirname( __FILE__ ) . '/class-suffice-admin-post-types.php' ); + include_once __DIR__ . '/functions-suffice-admin.php'; + include_once __DIR__ . '/functions-suffice-meta-box.php'; + include_once __DIR__ . '/class-suffice-admin-notices.php'; + include_once __DIR__ . '/class-suffice-admin-assets.php'; + include_once __DIR__ . '/class-suffice-admin-post-types.php'; } /** @@ -48,8 +48,8 @@ public function conditional_includes() { } switch ( $screen->id ) { - case 'options-permalink' : - include( 'class-suffice-admin-permalink-settings.php' ); + case 'options-permalink': + include 'class-suffice-admin-permalink-settings.php'; } } @@ -69,13 +69,20 @@ public function admin_footer_text( $footer_text ) { if ( isset( $current_screen->id ) && apply_filters( 'suffice_toolkit_display_admin_footer_text', in_array( $current_screen->id, $ft_pages ) ) ) { // Change the footer text. if ( ! get_option( 'suffice_toolkit_admin_footer_text_rated' ) ) { - $footer_text = sprintf( __( 'If you like Suffice Toolkit please leave us a %s★★★★★%s rating. A huge thanks in advance!', 'suffice-toolkit' ), '', '' ); - suffice_toolkit_enqueue_js( " + $footer_text = sprintf( + /* translators: %1$s: opening HTML anchor tag for the rating link, %2$s: closing HTML anchor tag */ + __( 'If you like Suffice Toolkit please leave us a %1$s★★★★★%2$s rating. A huge thanks in advance!', 'suffice-toolkit' ), + '', + '' + ); + suffice_toolkit_enqueue_js( + " jQuery( 'a.suffice-toolkit-rating-link' ).click( function() { jQuery.post( '" . ST()->ajax_url() . "', { action: 'suffice_toolkit_rated' } ); jQuery( this ).parent().text( jQuery( this ).data( 'rated' ) ); }); - " ); + " + ); } else { $footer_text = __( 'Thank you for creating with Suffice Toolkit.', 'suffice-toolkit' ); } diff --git a/includes/admin/functions-suffice-meta-box.php b/includes/admin/functions-suffice-meta-box.php index 9845158..18e1d1a 100644 --- a/includes/admin/functions-suffice-meta-box.php +++ b/includes/admin/functions-suffice-meta-box.php @@ -30,12 +30,12 @@ function suffice_toolkit_wp_text_input( $field ) { $data_type = empty( $field['data_type'] ) ? '' : $field['data_type']; switch ( $data_type ) { - case 'url' : + case 'url': $field['class'] .= ' ft_input_url'; $field['value'] = esc_url( $field['value'] ); break; - default : + default: break; } @@ -44,17 +44,17 @@ function suffice_toolkit_wp_text_input( $field ) { if ( ! empty( $field['custom_attributes'] ) && is_array( $field['custom_attributes'] ) ) { - foreach ( $field['custom_attributes'] as $attribute => $value ){ + foreach ( $field['custom_attributes'] as $attribute => $value ) { $custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"'; } } - echo '

      '; + echo '

      '; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- attributes are individually escaped if ( ! empty( $field['description'] ) ) { if ( isset( $field['desc_tip'] ) && false !== $field['desc_tip'] ) { - echo suffice_toolkit_help_tip( $field['description'] ); + echo wp_kses_post( suffice_toolkit_help_tip( $field['description'] ) ); } else { echo '' . wp_kses_post( $field['description'] ) . ''; } @@ -69,11 +69,11 @@ function suffice_toolkit_wp_text_input( $field ) { function suffice_toolkit_wp_hidden_input( $field ) { global $thepostid, $post; - $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; + $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; $field['value'] = isset( $field['value'] ) ? $field['value'] : get_post_meta( $thepostid, $field['id'], true ); $field['class'] = isset( $field['class'] ) ? $field['class'] : ''; - echo ' '; + echo ' '; } /** @@ -95,17 +95,17 @@ function suffice_toolkit_wp_textarea_input( $field ) { if ( ! empty( $field['custom_attributes'] ) && is_array( $field['custom_attributes'] ) ) { - foreach ( $field['custom_attributes'] as $attribute => $value ){ + foreach ( $field['custom_attributes'] as $attribute => $value ) { $custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"'; } } - echo '

      '; + echo '

      '; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- attributes are individually escaped if ( ! empty( $field['description'] ) ) { if ( isset( $field['desc_tip'] ) && false !== $field['desc_tip'] ) { - echo suffice_toolkit_help_tip( $field['description'] ); + echo wp_kses_post( suffice_toolkit_help_tip( $field['description'] ) ); } else { echo '' . wp_kses_post( $field['description'] ) . ''; } @@ -133,17 +133,17 @@ function suffice_toolkit_wp_checkbox( $field ) { if ( ! empty( $field['custom_attributes'] ) && is_array( $field['custom_attributes'] ) ) { - foreach ( $field['custom_attributes'] as $attribute => $value ){ + foreach ( $field['custom_attributes'] as $attribute => $value ) { $custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"'; } } - echo '

      '; + echo '

      '; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- attributes are individually escaped if ( ! empty( $field['description'] ) ) { if ( isset( $field['desc_tip'] ) && false !== $field['desc_tip'] ) { - echo suffice_toolkit_help_tip( $field['description'] ); + echo wp_kses_post( suffice_toolkit_help_tip( $field['description'] ) ); } else { echo '' . wp_kses_post( $field['description'] ) . ''; } @@ -173,7 +173,7 @@ function suffice_toolkit_wp_select( $field ) { if ( ! empty( $field['custom_attributes'] ) && is_array( $field['custom_attributes'] ) ) { - foreach ( $field['custom_attributes'] as $attribute => $value ){ + foreach ( $field['custom_attributes'] as $attribute => $value ) { $custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"'; } } @@ -184,7 +184,7 @@ function suffice_toolkit_wp_select( $field ) { if ( ! empty( $field['description'] ) ) { if ( isset( $field['desc_tip'] ) && false !== $field['desc_tip'] ) { - $description = suffice_toolkit_help_tip( $field['description'] ); + $description = wp_kses_post( suffice_toolkit_help_tip( $field['description'] ) ); } else { $description = '' . wp_kses_post( $field['description'] ) . ''; } @@ -193,10 +193,10 @@ function suffice_toolkit_wp_select( $field ) { echo '

      '; if ( isset( $field['desc_side'] ) && true === $field['desc_side'] ) { - echo $description; + echo $description; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- already escaped above } - echo ''; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- attributes are individually escaped foreach ( $field['options'] as $key => $value ) { echo ''; @@ -205,7 +205,7 @@ function suffice_toolkit_wp_select( $field ) { echo ' '; if ( isset( $field['desc_side'] ) && false === $field['desc_side'] ) { - echo $description; + echo $description; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- already escaped above } echo '

      '; @@ -244,7 +244,7 @@ class="' . esc_attr( $field['class'] ) . '" if ( ! empty( $field['description'] ) ) { if ( isset( $field['desc_tip'] ) && false !== $field['desc_tip'] ) { - echo suffice_toolkit_help_tip( $field['description'] ); + echo wp_kses_post( suffice_toolkit_help_tip( $field['description'] ) ); } else { echo '' . wp_kses_post( $field['description'] ) . ''; } diff --git a/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php b/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php index 2c84e20..368aeb9 100644 --- a/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php +++ b/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php @@ -34,38 +34,105 @@ public static function output( $post ) { do_action( 'suffice_toolkit_layout_data_start', $post->ID ); // Layout - suffice_toolkit_wp_select( array( 'id' => 'suffice_page_layout', 'class' => 'select side show_if_sidebar', 'label' => __( 'Layout Settings', 'suffice-toolkit' ), 'options' => array( - 'default-layout' => __( 'Default Layout', 'suffice-toolkit' ), - 'left-sidebar' => __( 'Left Sidebar', 'suffice-toolkit' ), - 'right-sidebar' => __( 'Right Sidebar', 'suffice-toolkit' ), - 'full-width' => __( 'Full Width', 'suffice-toolkit' ), - 'full-width-center' => __( 'Full Width Center', 'suffice-toolkit' ), - ), 'desc_side' => true, 'desc_tip' => false, 'desc_class' => 'side', 'description' => __( 'Select the specific layout for this entry.', 'suffice-toolkit' ) ) ); + suffice_toolkit_wp_select( + array( + 'id' => 'suffice_page_layout', + 'class' => 'select side show_if_sidebar', + 'label' => __( 'Layout Settings', 'suffice-toolkit' ), + 'options' => array( + 'default-layout' => __( 'Default Layout', 'suffice-toolkit' ), + 'left-sidebar' => __( 'Left Sidebar', 'suffice-toolkit' ), + 'right-sidebar' => __( 'Right Sidebar', 'suffice-toolkit' ), + 'full-width' => __( 'Full Width', 'suffice-toolkit' ), + 'full-width-center' => __( 'Full Width Center', 'suffice-toolkit' ), + ), + 'desc_side' => true, + 'desc_tip' => false, + 'desc_class' => 'side', + 'description' => __( + 'Select the specific layout for this entry.', + 'suffice-toolkit' + ), + ) + ); // Sidebar - suffice_toolkit_wp_select( array( 'id' => 'suffice_sidebar', 'class' => 'select side', 'label' => __( 'Sidebar Settings', 'suffice-toolkit' ), 'desc_side' => true, 'desc_tip' => false, 'desc_class' => 'side', 'description' => __( 'Choose a custom sidebar for this entry.', 'suffice-toolkit' ), 'options' => suffice_toolkit_get_sidebars( array( 'default' => 'Default Sidebar' ) ) ) ); + suffice_toolkit_wp_select( + array( + 'id' => 'suffice_sidebar', + 'class' => 'select side', + 'label' => __( 'Sidebar Settings', 'suffice-toolkit' ), + 'desc_side' => true, + 'desc_tip' => false, + 'desc_class' => 'side', + 'description' => __( 'Choose a custom sidebar for this entry.', 'suffice-toolkit' ), + 'options' => suffice_toolkit_get_sidebars( array( 'default' => 'Default Sidebar' ) ), + ) + ); // Footer - suffice_toolkit_wp_select( array( 'id' => 'suffice_footer', 'class' => 'select side', 'label' => __( 'Footer Settings', 'suffice-toolkit' ), 'options' => array( - 'default' => __( 'Default Socket and Widgets', 'suffice-toolkit' ), - 'footer_both' => __( 'Both Socket and Widgets', 'suffice-toolkit' ), - 'widget_only' => __( 'Only Widgets (No Socket)', 'suffice-toolkit' ), - 'socket_only' => __( 'Only Socket (No Widgets)', 'suffice-toolkit' ), - 'footer_hide' => __( 'Hide Socket and Widgets', 'suffice-toolkit' ) - ), 'desc_side' => true, 'desc_tip' => false, 'desc_class' => 'side', 'description' => __( 'Display the socket and footer widgets?', 'suffice-toolkit' ) ) ); + suffice_toolkit_wp_select( + array( + 'id' => 'suffice_footer', + 'class' => 'select side', + 'label' => __( 'Footer Settings', 'suffice-toolkit' ), + 'options' => array( + 'default' => __( 'Default Socket and Widgets', 'suffice-toolkit' ), + 'footer_both' => __( 'Both Socket and Widgets', 'suffice-toolkit' ), + 'widget_only' => __( 'Only Widgets (No Socket)', 'suffice-toolkit' ), + 'socket_only' => __( 'Only Socket (No Widgets)', 'suffice-toolkit' ), + 'footer_hide' => __( 'Hide Socket and Widgets', 'suffice-toolkit' ), + ), + 'desc_side' => true, + 'desc_tip' => false, + 'desc_class' => 'side', + 'description' => __( + 'Display the socket and footer widgets?', + 'suffice-toolkit' + ), + ) + ); // Header Transparency - suffice_toolkit_wp_select( array( 'id' => 'suffice_transparency', 'class' => 'select side', 'label' => __( 'Header Transparency', 'suffice-toolkit' ), 'options' => array( - 'non-transparent' => __( 'No Transparency', 'suffice-toolkit' ), - 'transparent' => __( 'Transparent Header', 'suffice-toolkit' ), - ), 'desc_side' => true, 'desc_tip' => false, 'desc_class' => 'side', 'description' => __( 'Header transparency options on this page.', 'suffice-toolkit' ) ) ); + suffice_toolkit_wp_select( + array( + 'id' => 'suffice_transparency', + 'class' => 'select side', + 'label' => __( 'Header Transparency', 'suffice-toolkit' ), + 'options' => array( + 'non-transparent' => __( 'No Transparency', 'suffice-toolkit' ), + 'transparent' => __( 'Transparent Header', 'suffice-toolkit' ), + ), + 'desc_side' => true, + 'desc_tip' => false, + 'desc_class' => 'side', + 'description' => __( + 'Header transparency options on this page.', + 'suffice-toolkit' + ), + ) + ); // Top Sidebar Position - suffice_toolkit_wp_select( array( 'id' => 'suffice_top_sidebar_position', 'class' => 'select side', 'label' => __( 'Top Sidebar Position', 'suffice-toolkit' ), 'options' => array( - 'none' => __( 'None', 'suffice-toolkit' ), - 'above_header' => __( 'Above Header', 'suffice-toolkit' ), - 'below_header' => __( 'Below Header', 'suffice-toolkit' ), - ), 'desc_side' => true, 'desc_tip' => false, 'desc_class' => 'side', 'description' => __( 'Top Sidebar Position options on this page.', 'suffice-toolkit' ) ) ); + suffice_toolkit_wp_select( + array( + 'id' => 'suffice_top_sidebar_position', + 'class' => 'select side', + 'label' => __( 'Top Sidebar Position', 'suffice-toolkit' ), + 'options' => array( + 'none' => __( 'None', 'suffice-toolkit' ), + 'above_header' => __( 'Above Header', 'suffice-toolkit' ), + 'below_header' => __( 'Below Header', 'suffice-toolkit' ), + ), + 'desc_side' => true, + 'desc_tip' => false, + 'desc_class' => 'side', + 'description' => __( + 'Top Sidebar Position options on this page.', + 'suffice-toolkit' + ), + ) + ); do_action( 'suffice_toolkit_layout_data_end', $post->ID ); ?> @@ -78,11 +145,19 @@ public static function output( $post ) { * @param int $post_id */ public static function save( $post_id ) { + if ( ! isset( $_POST['suffice_toolkit_meta_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['suffice_toolkit_meta_nonce'] ) ), 'suffice_toolkit_save_data' ) ) { + wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + $layout_post_meta = array( 'suffice_layout', 'suffice_sidebar', 'suffice_footer', 'suffice_transparency', 'suffice_top_sidebar_position' ); foreach ( $layout_post_meta as $post_meta ) { if ( isset( $_POST[ $post_meta ] ) ) { - update_post_meta( $post_id, $post_meta, $_POST[ $post_meta ] ); + update_post_meta( $post_id, $post_meta, sanitize_text_field( wp_unslash( $_POST[ $post_meta ] ) ) ); } } } diff --git a/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php b/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php index 820ea76..309001c 100644 --- a/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php +++ b/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php @@ -29,69 +29,89 @@ public static function output( $post ) {
        array( - 'label' => __( 'General', 'suffice-toolkit' ), - 'target' => 'general_portfolio_data', - 'class' => array(), - ), - 'description' => array( - 'label' => __( 'Description', 'suffice-toolkit' ), - 'target' => 'description_portfolio_data', - 'class' => array(), - ), - ) ); - - foreach ( $portfolio_data_tabs as $key => $tab ) { - ?>
      • - -
      • array( + 'label' => __( 'General', 'suffice-toolkit' ), + 'target' => 'general_portfolio_data', + 'class' => array(), + ), + 'description' => array( + 'label' => __( 'Description', 'suffice-toolkit' ), + 'target' => 'description_portfolio_data', + 'class' => array(), + ), + ) + ); + + foreach ( $portfolio_data_tabs as $key => $tab ) { + ?> +
      • + +
      • +
      - '; - - echo '
      '; + suffice_toolkit_wp_select( + array( + 'id' => 'layout_type', + 'label' => __( 'Layout Type', 'suffice-toolkit' ), + 'options' => array( + 'one_column' => __( 'One Column', 'suffice-toolkit' ), + 'two_column' => __( 'Two Column', 'suffice-toolkit' ), + ), + 'desc_tip' => 'true', + 'description' => __( 'Define whether or not the entire layout should be one or two column based.', 'suffice-toolkit' ), + ) + ); + + echo '
      '; + + echo '
      '; // Example Checkbox - suffice_toolkit_wp_checkbox( array( 'id' => '_example_cb', 'wrapper_class' => 'show_to_all_layout', 'label' => __( 'Sample Checkbox', 'suffice-toolkit' ), 'description' => __( 'Enable example checkbox.', 'suffice-toolkit' ) ) ); + suffice_toolkit_wp_checkbox( + array( + 'id' => '_example_cb', + 'wrapper_class' => 'show_to_all_layout', + 'label' => __( 'Sample Checkbox', 'suffice-toolkit' ), + 'description' => __( 'Enable example checkbox.', 'suffice-toolkit' ), + ) + ); - echo '
      '; + echo '
      '; - do_action( 'suffice_toolkit_portfolio_options_general' ); + do_action( 'suffice_toolkit_portfolio_options_general' ); - ?> - + '; + echo ''; - ?> + ?> +
      @@ -103,9 +123,17 @@ public static function output( $post ) { * @param int $post_id */ public static function save( $post_id ) { + if ( ! isset( $_POST['suffice_toolkit_meta_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['suffice_toolkit_meta_nonce'] ) ), 'suffice_toolkit_save_data' ) ) { + wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + // Add/replace data to array - $layout_type = suffice_clean( $_POST['layout_type'] ); - $layout_desc = esc_textarea( $_POST['layout_desc'] ); + $layout_type = isset( $_POST['layout_type'] ) ? suffice_clean( $_POST['layout_type'] ) : ''; + $layout_desc = isset( $_POST['layout_desc'] ) ? sanitize_textarea_field( wp_unslash( $_POST['layout_desc'] ) ) : ''; $_example_cb = isset( $_POST['_example_cb'] ) ? 'yes' : 'no'; // Save diff --git a/includes/admin/views/html-admin-tmpl-sidebars.php b/includes/admin/views/html-admin-tmpl-sidebars.php index 5283f50..6082139 100644 --- a/includes/admin/views/html-admin-tmpl-sidebars.php +++ b/includes/admin/views/html-admin-tmpl-sidebars.php @@ -9,8 +9,8 @@ ?> \n"; + $js = "/* Suffice Toolkit JavaScript */\n\n"; /** * social_icons_queued_js filter. * @param string $js JavaScript code. */ - echo apply_filters( 'suffice_toolkit_queued_js', $js ); + echo wp_kses( + apply_filters( 'suffice_toolkit_queued_js', $js ), + array( + 'script' => array( + 'type' => true, + ), + ) + ); unset( $suffice_toolkit_queued_js ); } @@ -123,7 +130,7 @@ function suffice_get_template( $template_name, $args = array(), $template_path = $located = suffice_locate_template( $template_name, $template_path, $default_path ); if ( ! file_exists( $located ) ) { - _doing_it_wrong( __FUNCTION__, sprintf( '%s does not exist.', $located ), '1.0' ); + _doing_it_wrong( __FUNCTION__, sprintf( '%s does not exist.', esc_html( $located ) ), '1.0' ); return; } @@ -132,7 +139,7 @@ function suffice_get_template( $template_name, $args = array(), $template_path = do_action( 'suffice_toolkit_before_template_part', $template_name, $template_path, $located, $args ); - include( $located ); + include $located; do_action( 'suffice_toolkit_after_template_part', $template_name, $template_path, $located, $args ); } @@ -186,7 +193,7 @@ function suffice_locate_template( $template_name, $template_path = '', $default_ * @return array */ function suffice_get_google_fonts() { - return apply_filters( 'suffice_get_google_fonts', include( ST()->plugin_path() . '/i18n/google-fonts.php' ) ); + return apply_filters( 'suffice_get_google_fonts', include ST()->plugin_path() . '/i18n/google-fonts.php' ); } } @@ -197,7 +204,7 @@ function suffice_get_google_fonts() { * @return array */ function suffice_get_fontawesome_icons() { - return apply_filters( 'suffice_get_fontawesome_icons', include( ST()->plugin_path() . '/i18n/fontawesome.php' ) ); + return apply_filters( 'suffice_get_fontawesome_icons', include ST()->plugin_path() . '/i18n/fontawesome.php' ); } } @@ -207,7 +214,7 @@ function suffice_get_fontawesome_icons() { */ function suffice_get_column_class( $column ) { $class = ''; - switch ($column) { + switch ( $column ) { case '1': $class = 'col-md-12'; break; @@ -242,23 +249,23 @@ function suffice_get_column_class( $column ) { * @return string List of Terms joined with ', ' */ -function suffice_get_terms_list($id, $taxonomy) { +function suffice_get_terms_list( $id, $taxonomy ) { $terms = get_the_terms( $id, $taxonomy ); if ( $terms && ! is_wp_error( $terms ) ) : - $joined_terms_array = array(); + $joined_terms_array = array(); - foreach ( $terms as $term ) { - $joined_terms_array[] = $term->name; - } + foreach ( $terms as $term ) { + $joined_terms_array[] = $term->name; + } - $joined_terms_string = join( ", ", $joined_terms_array ); + $joined_terms_string = join( ', ', $joined_terms_array ); - endif; + endif; - return $joined_terms_string; + return $joined_terms_string; } /** @@ -267,8 +274,8 @@ function suffice_get_terms_list($id, $taxonomy) { * @return string First Category from Loop */ -function suffice_get_first_category_name($source, $cat_id) { - if( $source == 'latest' ) { +function suffice_get_first_category_name( $source, $cat_id ) { + if ( $source == 'latest' ) { $category = get_the_category(); $category_name = $category[0]->cat_name; } else { @@ -284,8 +291,8 @@ function suffice_get_first_category_name($source, $cat_id) { * @return string First Link from Loop */ -function suffice_get_first_category_link($source, $cat_id){ - $category_name = suffice_get_first_category_name($source, $cat_id); +function suffice_get_first_category_link( $source, $cat_id ) { + $category_name = suffice_get_first_category_name( $source, $cat_id ); $category_ID = get_cat_ID( $category_name ); $category_link = get_category_link( $category_ID ); @@ -297,8 +304,8 @@ function suffice_get_first_category_link($source, $cat_id){ * * @return int category id */ -function suffice_get_first_category_id($source, $cat_id){ - $category_name = suffice_get_first_category_name($source, $cat_id); +function suffice_get_first_category_id( $source, $cat_id ) { + $category_name = suffice_get_first_category_name( $source, $cat_id ); $category_ID = get_cat_ID( $category_name ); return $category_ID; @@ -309,21 +316,25 @@ function suffice_get_first_category_id($source, $cat_id){ * @return array */ function suffice_get_woocommerce_categories() { - $terms = get_terms( array_values ( array( - 'taxonomy' => 'category', - 'hide_empty' => true, - ) ) ); + $terms = get_terms( + array_values( + array( + 'taxonomy' => 'category', + 'hide_empty' => true, + ) + ) + ); $terms_array = array(); $term_id_array = array(); $term_name_array = array(); - foreach ($terms as $term ) { + foreach ( $terms as $term ) { $term_id_array[] = $term->term_id; $term_name_array[] = $term->name; } - $terms_array = array_combine($term_id_array, $term_name_array); + $terms_array = array_combine( $term_id_array, $term_name_array ); return $terms_array; } @@ -341,21 +352,22 @@ function suffice_wp_dropdown_cats_multiple( $output, $r ) { // This Walker is needed to match more than one selected value class Suffice_Walker_CategoryDropdown extends Walker_CategoryDropdown { public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { - $pad = str_repeat(' ', $depth * 3); + $pad = str_repeat( ' ', $depth * 3 ); - $cat_name = apply_filters('list_cats', $category->name, $category); - $output .= ""; + $output .= '>'; + $output .= $pad . $cat_name; + if ( $args['show_count'] ) { + $output .= "({$category->count})"; + } + $output .= ''; } } diff --git a/includes/functions-suffice-formatting.php b/includes/functions-suffice-formatting.php index e7c8f6e..75e59bc 100644 --- a/includes/functions-suffice-formatting.php +++ b/includes/functions-suffice-formatting.php @@ -20,7 +20,7 @@ * @return string */ function suffice_clean( $var ) { - return is_array( $var ) ? array_map( 'suffice_clean', $var ) : sanitize_text_field( $var ); + return is_array( $var ) ? array_map( 'suffice_clean', $var ) : sanitize_text_field( wp_unslash( $var ) ); } /** @@ -31,17 +31,22 @@ function suffice_clean( $var ) { * @return string */ function suffice_toolkit_sanitize_tooltip( $var ) { - return htmlspecialchars( wp_kses( html_entity_decode( $var ), array( - 'br' => array(), - 'em' => array(), - 'strong' => array(), - 'small' => array(), - 'span' => array(), - 'ul' => array(), - 'li' => array(), - 'ol' => array(), - 'p' => array(), - ) ) ); + return htmlspecialchars( + wp_kses( + html_entity_decode( $var ), + array( + 'br' => array(), + 'em' => array(), + 'strong' => array(), + 'small' => array(), + 'span' => array(), + 'ul' => array(), + 'li' => array(), + 'ol' => array(), + 'p' => array(), + ) + ) + ); } /** diff --git a/includes/libraries/wp-background-process.php b/includes/libraries/wp-background-process.php index f6de59e..55a9932 100644 --- a/includes/libraries/wp-background-process.php +++ b/includes/libraries/wp-background-process.php @@ -5,6 +5,10 @@ * @package WP-Background-Processing */ +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + if ( ! class_exists( 'WP_Background_Process' ) ) { /** @@ -146,7 +150,7 @@ public function delete( $key ) { * @return string */ protected function generate_key( $length = 64 ) { - $unique = md5( microtime() . rand() ); + $unique = md5( microtime() . wp_rand() ); $prepend = $this->identifier . '_batch_'; return substr( $prepend . $unique, 0, $length ); @@ -187,21 +191,34 @@ public function maybe_handle() { protected function is_queue_empty() { global $wpdb; - $table = $wpdb->options; - $column = 'option_name'; + $key = $this->identifier . '_batch_%'; if ( is_multisite() ) { - $table = $wpdb->sitemeta; - $column = 'meta_key'; - } - $key = $this->identifier . '_batch_%'; + $count = $wpdb->get_var( + $wpdb->prepare( + " + SELECT COUNT(*) + FROM {$wpdb->sitemeta} + WHERE meta_key LIKE %s + ", + $key + ) + ); + + return ( $count > 0 ) ? false : true; + } - $count = $wpdb->get_var( $wpdb->prepare( " + $count = $wpdb->get_var( + $wpdb->prepare( + " SELECT COUNT(*) - FROM {$table} - WHERE {$column} LIKE %s - ", $key ) ); + FROM {$wpdb->options} + WHERE option_name LIKE %s + ", + $key + ) + ); return ( $count > 0 ) ? false : true; } @@ -258,31 +275,54 @@ protected function unlock_process() { protected function get_batch() { global $wpdb; - $table = $wpdb->options; - $column = 'option_name'; - $key_column = 'option_id'; - $value_column = 'option_value'; + $key = $this->identifier . '_batch_%'; if ( is_multisite() ) { - $table = $wpdb->sitemeta; - $column = 'meta_key'; - $key_column = 'meta_id'; - $value_column = 'meta_value'; + + $query = $wpdb->get_row( + $wpdb->prepare( + " + SELECT * + FROM {$wpdb->sitemeta} + WHERE meta_key LIKE %s + ORDER BY meta_id ASC + LIMIT 1 + ", + $key + ) + ); + + if ( ! $query ) { + return null; + } + + $batch = new stdClass(); + $batch->key = $query->meta_key; + $batch->data = maybe_unserialize( $query->meta_value ); + + return $batch; } - $key = $this->identifier . '_batch_%'; + $query = $wpdb->get_row( + $wpdb->prepare( + " + SELECT * + FROM {$wpdb->options} + WHERE option_name LIKE %s + ORDER BY option_id ASC + LIMIT 1 + ", + $key + ) + ); - $query = $wpdb->get_row( $wpdb->prepare( " - SELECT * - FROM {$table} - WHERE {$column} LIKE %s - ORDER BY {$key_column} ASC - LIMIT 1 - ", $key ) ); + if ( ! $query ) { + return null; + } $batch = new stdClass(); - $batch->key = $query->$column; - $batch->data = maybe_unserialize( $query->$value_column ); + $batch->key = $query->option_name; + $batch->data = maybe_unserialize( $query->option_value ); return $batch; } @@ -420,7 +460,11 @@ public function schedule_cron_healthcheck( $schedules ) { // Adds every 5 minutes to the existing schedules. $schedules[ $this->identifier . '_cron_interval' ] = array( 'interval' => MINUTE_IN_SECONDS * $interval, - 'display' => sprintf( __( 'Every %d Minutes', 'suffice-toolkit' ), $interval ), + 'display' => sprintf( + /* translators: %d: number of minutes */ + __( 'Every %d Minutes', 'suffice-toolkit' ), + $interval + ), ); return $schedules; @@ -483,7 +527,6 @@ public function cancel_process() { wp_clear_scheduled_hook( $this->cron_hook_identifier ); } - } /** @@ -499,6 +542,5 @@ public function cancel_process() { * @return mixed */ abstract protected function task( $item ); - } } diff --git a/suffice-toolkit.php b/suffice-toolkit.php index 3d54ac5..8747017 100644 --- a/suffice-toolkit.php +++ b/suffice-toolkit.php @@ -17,196 +17,196 @@ if ( ! class_exists( 'SufficeToolkit' ) ) : -/** - * SufficeToolkit main class. - * - * @class SufficeToolkit - * @version 1.0.0 - */ -final class SufficeToolkit { - - /** - * Plugin version. - * @var string - */ - public $version = '1.0.9'; - - /** - * Instance of this class. - * @var object - */ - protected static $_instance = null; - /** - * Return an instance of this class. - * @return object A single instance of this class. - */ - public static function instance() { - // If the single instance hasn't been set, set it now. - if ( is_null( self::$_instance ) ) { - self::$_instance = new self(); + * SufficeToolkit main class. + * + * @class SufficeToolkit + * @version 1.0.0 + */ + final class SufficeToolkit { + + /** + * Plugin version. + * @var string + */ + public $version = '1.0.9'; + + /** + * Instance of this class. + * @var object + */ + protected static $_instance = null; + + /** + * Return an instance of this class. + * @return object A single instance of this class. + */ + public static function instance() { + // If the single instance hasn't been set, set it now. + if ( is_null( self::$_instance ) ) { + self::$_instance = new self(); + } + return self::$_instance; } - return self::$_instance; - } - - /** - * Cloning is forbidden. - * @since 1.0 - */ - public function __clone() { - _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'suffice-toolkit' ), '1.0' ); - } - - /** - * Unserializing instances of this class is forbidden. - * @since 1.0 - */ - public function __wakeup() { - _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'suffice-toolkit' ), '1.0' ); - } - /** - * SufficeToolkit Constructor. - */ - public function __construct() { - $this->define_constants(); - $this->includes(); - $this->init_hooks(); - - do_action( 'suffice_toolkit_loaded' ); - } + /** + * Cloning is forbidden. + * @since 1.0 + */ + public function __clone() { + _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'suffice-toolkit' ), '1.0' ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } - /** - * Hook into actions and filters. - */ - private function init_hooks() { - register_activation_hook( __FILE__, array( 'ST_Install', 'install' ) ); - add_action( 'init', array( $this, 'load_plugin_textdomain' ) ); - add_action( 'admin_notices', array( $this, 'theme_support_missing_notice' ) ); - } + /** + * Unserializing instances of this class is forbidden. + * @since 1.0 + */ + public function __wakeup() { + _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'suffice-toolkit' ), '1.0' ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } - /** - * Define ST Constants. - */ - private function define_constants() { - $this->define( 'ST_PLUGIN_FILE', __FILE__ ); - $this->define( 'ST_ABSPATH', dirname( __FILE__ ) . '/' ); - $this->define( 'ST_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ); - $this->define( 'ST_VERSION', $this->version ); - $this->define( 'ST_TEMPLATE_DEBUG_MODE', false ); - } + /** + * SufficeToolkit Constructor. + */ + public function __construct() { + $this->define_constants(); + $this->includes(); + $this->init_hooks(); - /** - * Define constant if not already set. - * - * @param string $name - * @param string|bool $value - */ - private function define( $name, $value ) { - if ( ! defined( $name ) ) { - define( $name, $value ); + do_action( 'suffice_toolkit_loaded' ); } - } - /** - * What type of request is this? - * - * @param string $type admin or frontend. - * @return bool - */ - private function is_request( $type ) { - switch ( $type ) { - case 'admin' : - return is_admin(); - case 'frontend' : - return ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ); + /** + * Hook into actions and filters. + */ + private function init_hooks() { + register_activation_hook( __FILE__, array( 'ST_Install', 'install' ) ); + add_action( 'init', array( $this, 'load_plugin_textdomain' ) ); + add_action( 'admin_notices', array( $this, 'theme_support_missing_notice' ) ); } - } - /** - * Includes. - */ - private function includes() { - include_once( ST_ABSPATH . 'includes/functions-suffice-core.php' ); - include_once( ST_ABSPATH . 'includes/functions-suffice-widget.php' ); - include_once( ST_ABSPATH . 'includes/class-suffice-autoloader.php' ); - include_once( ST_ABSPATH . 'includes/class-suffice-install.php' ); - include_once( ST_ABSPATH . 'includes/class-suffice-ajax.php' ); - include_once( ST_ABSPATH . 'includes/class-suffice-inline-style.php' ); - - if ( $this->is_request( 'admin' ) ) { - include_once( ST_ABSPATH . 'includes/admin/class-suffice-admin.php' ); + /** + * Define ST Constants. + */ + private function define_constants() { + $this->define( 'ST_PLUGIN_FILE', __FILE__ ); + $this->define( 'ST_ABSPATH', __DIR__ . '/' ); + $this->define( 'ST_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ); + $this->define( 'ST_VERSION', $this->version ); + $this->define( 'ST_TEMPLATE_DEBUG_MODE', false ); } - if ( is_suffice_pro_active() ) { - include_once( ST_ABSPATH . 'includes/class-suffice-sidebars.php' ); + /** + * Define constant if not already set. + * + * @param string $name + * @param string|bool $value + */ + private function define( $name, $value ) { + if ( ! defined( $name ) ) { + define( $name, $value ); + } } - include_once( ST_ABSPATH . 'includes/class-suffice-post-types.php' ); // Registers post types - } - - /** - * Load Localisation files. - * - * Note: the first-loaded translation file overrides any following ones if the same translation is present. - * - * Locales found in: - * - WP_LANG_DIR/suffice-toolkit/suffice-toolkit-LOCALE.mo - * - WP_LANG_DIR/plugins/suffice-toolkit-LOCALE.mo - */ - public function load_plugin_textdomain() { - $locale = apply_filters( 'plugin_locale', get_locale(), 'suffice-toolkit' ); + /** + * What type of request is this? + * + * @param string $type admin or frontend. + * @return bool + */ + private function is_request( $type ) { + switch ( $type ) { + case 'admin': + return is_admin(); + case 'frontend': + return ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ); + } + } - load_textdomain( 'suffice-toolkit', WP_LANG_DIR . '/suffice-toolkit/suffice-toolkit-' . $locale . '.mo' ); - load_plugin_textdomain( 'suffice-toolkit', false, plugin_basename( dirname( __FILE__ ) ) . '/i18n/languages' ); - } + /** + * Includes. + */ + private function includes() { + include_once ST_ABSPATH . 'includes/functions-suffice-core.php'; + include_once ST_ABSPATH . 'includes/functions-suffice-widget.php'; + include_once ST_ABSPATH . 'includes/class-suffice-autoloader.php'; + include_once ST_ABSPATH . 'includes/class-suffice-install.php'; + include_once ST_ABSPATH . 'includes/class-suffice-ajax.php'; + include_once ST_ABSPATH . 'includes/class-suffice-inline-style.php'; + + if ( $this->is_request( 'admin' ) ) { + include_once ST_ABSPATH . 'includes/admin/class-suffice-admin.php'; + } + + if ( is_suffice_pro_active() ) { + include_once ST_ABSPATH . 'includes/class-suffice-sidebars.php'; + } + + include_once ST_ABSPATH . 'includes/class-suffice-post-types.php'; // Registers post types + } - /** - * Theme support fallback notice. - * @return string - */ - public function theme_support_missing_notice() { - $theme = wp_get_theme(); - $parent = $theme->parent(); + /** + * Load Localisation files. + * + * Note: the first-loaded translation file overrides any following ones if the same translation is present. + * + * Locales found in: + * - WP_LANG_DIR/suffice-toolkit/suffice-toolkit-LOCALE.mo + * - WP_LANG_DIR/plugins/suffice-toolkit-LOCALE.mo + */ + public function load_plugin_textdomain() { + $locale = apply_filters( 'plugin_locale', get_locale(), 'suffice-toolkit' ); + + load_textdomain( 'suffice-toolkit', WP_LANG_DIR . '/suffice-toolkit/suffice-toolkit-' . $locale . '.mo' ); + load_plugin_textdomain( 'suffice-toolkit', false, plugin_basename( __DIR__ ) . '/i18n/languages' ); + } - // Check with ThemeGrill Suffice Theme is installed. - if ( ( $theme != 'Suffice' ) && ( $theme != 'Suffice Pro' ) && ( $parent != 'Suffice' ) && ( $parent != 'Suffice Pro' ) ) { - // echo '

      ' . __( 'Suffice Toolkit', 'suffice-toolkit' ) . ' – ' . sprintf( __( 'This plugin requires %s by ThemeGrill to work.', 'suffice-toolkit' ), '' . __( 'Suffice Theme', 'suffice-toolkit' ) . '' ) . '

      '; + /** + * Theme support fallback notice. + * @return string + */ + public function theme_support_missing_notice() { + $theme = wp_get_theme(); + $parent = $theme->parent(); + + // Check with ThemeGrill Suffice Theme is installed. + if ( ( $theme != 'Suffice' ) && ( $theme != 'Suffice Pro' ) && ( $parent != 'Suffice' ) && ( $parent != 'Suffice Pro' ) ) { + // echo '

      ' . __( 'Suffice Toolkit', 'suffice-toolkit' ) . ' – ' . sprintf( __( 'This plugin requires %s by ThemeGrill to work.', 'suffice-toolkit' ), '' . __( 'Suffice Theme', 'suffice-toolkit' ) . '' ) . '

      '; + } } - } - /** - * Get the plugin url. - * @return string - */ - public function plugin_url() { - return untrailingslashit( plugins_url( '/', __FILE__ ) ); - } + /** + * Get the plugin url. + * @return string + */ + public function plugin_url() { + return untrailingslashit( plugins_url( '/', __FILE__ ) ); + } - /** - * Get the plugin path. - * @return string - */ - public function plugin_path() { - return untrailingslashit( plugin_dir_path( __FILE__ ) ); - } + /** + * Get the plugin path. + * @return string + */ + public function plugin_path() { + return untrailingslashit( plugin_dir_path( __FILE__ ) ); + } - /** - * Get the template path. - * @return string - */ - public function template_path() { - return apply_filters( 'suffice_toolkit_template_path', 'suffice-toolkit/' ); - } + /** + * Get the template path. + * @return string + */ + public function template_path() { + return apply_filters( 'suffice_toolkit_template_path', 'suffice-toolkit/' ); + } - /** - * Get Ajax URL. - * @return string - */ - public function ajax_url() { - return admin_url( 'admin-ajax.php', 'relative' ); + /** + * Get Ajax URL. + * @return string + */ + public function ajax_url() { + return admin_url( 'admin-ajax.php', 'relative' ); + } } -} endif; From 64bf21683468477577400f3f82c7f18779d8833b Mon Sep 17 00:00:00 2001 From: Jenisha Munikar Date: Fri, 24 Apr 2026 08:47:52 +0545 Subject: [PATCH 5/7] tweak: update pot file --- i18n/languages/suffice-toolkit.pot | 240 ++++++++++++++++------------- 1 file changed, 132 insertions(+), 108 deletions(-) diff --git a/i18n/languages/suffice-toolkit.pot b/i18n/languages/suffice-toolkit.pot index 82bfc0d..780b124 100644 --- a/i18n/languages/suffice-toolkit.pot +++ b/i18n/languages/suffice-toolkit.pot @@ -1,17 +1,17 @@ -# Copyright (C) 2019 ThemeGrill +# Copyright (C) 2026 ThemeGrill # This file is distributed under the GPLv3 or later. msgid "" msgstr "" -"Project-Id-Version: Suffice Toolkit 1.0.3\n" +"Project-Id-Version: Suffice Toolkit 1.0.9\n" "Report-Msgid-Bugs-To: themegrill@gmail.com\n" -"POT-Creation-Date: 2019-06-20 04:23:35+00:00\n" +"POT-Creation-Date: 2026-04-24 03:02:21+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2019-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2026-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"X-Generator: grunt-wp-i18n 0.5.4\n" +"X-Generator: grunt-wp-i18n 1.0.3\n" #: includes/widgets/class-suffice-widget-blog.php:83 #: includes/widgets/class-suffice-widget-logo.php:80 @@ -39,41 +39,41 @@ msgstr "" msgid "6" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:367 -#: includes/abstracts/abstract-suffice-widget.php:541 +#: includes/abstracts/abstract-suffice-widget.php:378 +#: includes/abstracts/abstract-suffice-widget.php:554 msgid "Remove media" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:375 -#: includes/abstracts/abstract-suffice-widget.php:549 +#: includes/abstracts/abstract-suffice-widget.php:386 +#: includes/abstracts/abstract-suffice-widget.php:562 msgid "Choose an image" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:375 -#: includes/abstracts/abstract-suffice-widget.php:549 +#: includes/abstracts/abstract-suffice-widget.php:386 +#: includes/abstracts/abstract-suffice-widget.php:562 msgid "Use image" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:375 -#: includes/abstracts/abstract-suffice-widget.php:549 +#: includes/abstracts/abstract-suffice-widget.php:386 +#: includes/abstracts/abstract-suffice-widget.php:562 msgid "Select an Image" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:386 -#: includes/abstracts/abstract-suffice-widget.php:559 +#: includes/abstracts/abstract-suffice-widget.php:397 +#: includes/abstracts/abstract-suffice-widget.php:572 msgid "Choose icons…" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:386 -#: includes/abstracts/abstract-suffice-widget.php:559 +#: includes/abstracts/abstract-suffice-widget.php:397 +#: includes/abstracts/abstract-suffice-widget.php:572 msgid "Icon" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:409 +#: includes/abstracts/abstract-suffice-widget.php:420 msgid "Choose fonts…" msgstr "" -#: includes/abstracts/abstract-suffice-widget.php:409 +#: includes/abstracts/abstract-suffice-widget.php:420 msgid "Font" msgstr "" @@ -95,22 +95,29 @@ msgstr "" msgid "Create your first field!" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:95 -msgid "You can add upto %s fields." +#: includes/admin/class-suffice-admin-assets.php:105 +#. translators: %s: maximum number of fields allowed +msgid "You can add up to %s fields." msgstr "" -#: includes/admin/class-suffice-admin-assets.php:115 +#: includes/admin/class-suffice-admin-assets.php:132 msgid "" "Delete this Sidebar Permanently and store all widgets in Inactive Sidebar. " "Are you positive you want to delete this Sidebar?" msgstr "" #: includes/admin/class-suffice-admin-notices.php:103 +#: includes/admin/class-suffice-admin-permalink-settings.php:161 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:149 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:127 #: includes/class-suffice-sidebars.php:94 msgid "Action failed. Please refresh the page and retry." msgstr "" #: includes/admin/class-suffice-admin-notices.php:107 +#: includes/admin/class-suffice-admin-permalink-settings.php:165 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:153 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:131 #: includes/class-suffice-sidebars.php:98 suffice-toolkit.php:57 #: suffice-toolkit.php:65 msgid "Cheatin’ huh?" @@ -128,228 +135,242 @@ msgstr "" msgid "Portfolio tag base" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:77 +#: includes/admin/class-suffice-admin-permalink-settings.php:87 msgid "These settings control the permalinks specifically used for portfolio." msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:95 +#: includes/admin/class-suffice-admin-permalink-settings.php:106 #: includes/widgets/class-suffice-widget-slider.php:83 msgid "Default" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:99 +#: includes/admin/class-suffice-admin-permalink-settings.php:110 msgid "Project base" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:103 +#: includes/admin/class-suffice-admin-permalink-settings.php:114 msgid "Project based category" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:108 +#: includes/admin/class-suffice-admin-permalink-settings.php:119 msgid "Custom Base" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:110 +#: includes/admin/class-suffice-admin-permalink-settings.php:121 msgid "" "Enter a custom base to use. A base must be set or " "WordPress will use default instead." msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:51 +#: includes/admin/class-suffice-admin-post-types.php:53 +#. translators: %s: project permalink URL msgid "Project updated. View Project" msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:52 +#: includes/admin/class-suffice-admin-post-types.php:56 msgid "Custom field updated." msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:53 +#: includes/admin/class-suffice-admin-post-types.php:57 msgid "Custom field deleted." msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:54 +#: includes/admin/class-suffice-admin-post-types.php:58 msgid "Project updated." msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:55 +#: includes/admin/class-suffice-admin-post-types.php:61 +#. translators: %s: revision date/time msgid "Project restored to revision from %s" msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:56 +#: includes/admin/class-suffice-admin-post-types.php:66 +#. translators: %s: project permalink URL msgid "Project published. View Project" msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:57 +#: includes/admin/class-suffice-admin-post-types.php:69 msgid "Project saved." msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:58 +#: includes/admin/class-suffice-admin-post-types.php:72 +#. translators: %s: project preview URL msgid "Project submitted. Preview project" msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:59 +#: includes/admin/class-suffice-admin-post-types.php:77 +#. translators: 1: scheduled date/time, 2: project preview URL msgid "" "Project scheduled for: %1$s. Preview project" msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:60 +#: includes/admin/class-suffice-admin-post-types.php:78 msgid "M j, Y @ G:i" msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:61 +#: includes/admin/class-suffice-admin-post-types.php:83 +#. translators: %s: URL to preview the project msgid "Project draft updated. Preview project" msgstr "" -#: includes/admin/class-suffice-admin-post-types.php:76 +#: includes/admin/class-suffice-admin-post-types.php:101 +#. translators: %s: number of projects updated msgid "%s project updated." msgid_plural "%s projects updated." msgstr[0] "" msgstr[1] "" -#: includes/admin/class-suffice-admin-post-types.php:77 +#: includes/admin/class-suffice-admin-post-types.php:109 +#. translators: %s: number of projects not updated because they are locked msgid "%s project not updated, somebody is editing it." msgid_plural "%s projects not updated, somebody is editing them." msgstr[0] "" msgstr[1] "" -#: includes/admin/class-suffice-admin-post-types.php:78 +#: includes/admin/class-suffice-admin-post-types.php:117 +#. translators: %s: number of projects permanently deleted msgid "%s project permanently deleted." msgid_plural "%s projects permanently deleted." msgstr[0] "" msgstr[1] "" -#: includes/admin/class-suffice-admin-post-types.php:79 +#: includes/admin/class-suffice-admin-post-types.php:125 +#. translators: %s: number of projects moved to the trash msgid "%s project moved to the Trash." msgid_plural "%s projects moved to the Trash." msgstr[0] "" msgstr[1] "" -#: includes/admin/class-suffice-admin-post-types.php:80 +#: includes/admin/class-suffice-admin-post-types.php:133 +#. translators: %s: number of projects restored from the Trash msgid "%s project restored from the Trash." msgid_plural "%s projects restored from the Trash." msgstr[0] "" msgstr[1] "" -#: includes/admin/class-suffice-admin-post-types.php:95 +#: includes/admin/class-suffice-admin-post-types.php:153 msgid "Project name" msgstr "" -#: includes/admin/class-suffice-admin.php:72 +#: includes/admin/class-suffice-admin.php:74 +#. translators: %1$s: opening HTML anchor tag for the rating link, %2$s: +#. closing HTML anchor tag msgid "" "If you like Suffice Toolkit please leave us a " -"%s★★★★★%s rating. A huge thanks in advance!" +"%1$s★★★★★%2$s rating. A huge thanks in " +"advance!" msgstr "" -#: includes/admin/class-suffice-admin.php:72 +#: includes/admin/class-suffice-admin.php:75 msgid "Thanks :)" msgstr "" -#: includes/admin/class-suffice-admin.php:80 +#: includes/admin/class-suffice-admin.php:87 msgid "Thank you for creating with Suffice Toolkit." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:37 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:41 msgid "Layout Settings" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:38 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:43 msgid "Default Layout" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:39 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:44 msgid "Left Sidebar" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:40 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:45 msgid "Right Sidebar" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:41 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:46 msgid "Full Width" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:42 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:47 msgid "Full Width Center" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:43 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:52 msgid "Select the specific layout for this entry." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:46 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:64 msgid "Sidebar Settings" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:46 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:68 msgid "Choose a custom sidebar for this entry." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:49 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:78 msgid "Footer Settings" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:50 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:80 msgid "Default Socket and Widgets" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:51 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:81 msgid "Both Socket and Widgets" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:52 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:82 msgid "Only Widgets (No Socket)" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:53 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:83 msgid "Only Socket (No Widgets)" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:54 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:84 msgid "Hide Socket and Widgets" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:55 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:89 msgid "Display the socket and footer widgets?" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:58 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:101 msgid "Header Transparency" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:59 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:103 msgid "No Transparency" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:60 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:104 msgid "Transparent Header" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:61 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:109 msgid "Header transparency options on this page." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:64 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:121 msgid "Top Sidebar Position" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:65 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:123 msgid "None" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:66 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:124 msgid "Above Header" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:67 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:125 msgid "Below Header" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:68 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:130 msgid "Top Sidebar Position options on this page." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:34 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:36 #: includes/widgets/class-suffice-widget-blog.php:43 #: includes/widgets/class-suffice-widget-blog.php:54 #: includes/widgets/class-suffice-widget-blog.php:66 @@ -401,32 +422,32 @@ msgstr "" msgid "General" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:39 -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:89 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:41 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:107 msgid "Description" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:61 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:68 msgid "Layout Type" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:63 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:70 msgid "One Column" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:64 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:71 msgid "Two Column" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:67 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:74 msgid "Define whether or not the entire layout should be one or two column based." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:75 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:87 msgid "Sample Checkbox" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:75 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:88 msgid "Enable example checkbox." msgstr "" @@ -693,15 +714,17 @@ msgstr "" msgid "This is where you can add new portfolio items to your project." msgstr "" -#: includes/class-suffice-sidebars.php:124 -msgid "Custom Widget Area of the site - %s " +#: includes/class-suffice-sidebars.php:130 +#. translators: %s: widget area name +msgid "Custom Widget Area of the site - %s" msgstr "" #: includes/functions-suffice-widget.php:87 msgid "Suffice Toolkit Widgets" msgstr "" -#: includes/libraries/wp-background-process.php:423 +#: includes/libraries/wp-background-process.php:465 +#. translators: %d: number of minutes msgid "Every %d Minutes" msgstr "" @@ -1342,17 +1365,17 @@ msgstr "" msgid "Title Position" msgstr "" -#: templates/content-widget-blog.php:99 templates/content-widget-blog.php:139 -#: templates/content-widget-featured-posts.php:116 +#: templates/content-widget-blog.php:105 templates/content-widget-blog.php:147 +#: templates/content-widget-featured-posts.php:120 #. translators: %s: post title msgid "Leave a Comment on %s" msgstr "" -#: templates/content-widget-blog.php:121 templates/content-widget-blog.php:144 +#: templates/content-widget-blog.php:127 templates/content-widget-blog.php:152 msgid "Read More" msgstr "" -#: templates/content-widget-portfolio.php:40 +#: templates/content-widget-portfolio.php:44 msgid "All" msgstr "" @@ -1376,79 +1399,79 @@ msgstr "" msgid "http://themegrill.com" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:80 +#: includes/admin/class-suffice-admin-assets.php:83 msgctxt "enhanced select" msgid "One result is available, press enter to select it." msgstr "" -#: includes/admin/class-suffice-admin-assets.php:81 +#: includes/admin/class-suffice-admin-assets.php:84 msgctxt "enhanced select" msgid "%qty% results are available, use up and down arrow keys to navigate." msgstr "" -#: includes/admin/class-suffice-admin-assets.php:82 +#: includes/admin/class-suffice-admin-assets.php:85 msgctxt "enhanced select" msgid "No matches found" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:83 +#: includes/admin/class-suffice-admin-assets.php:86 msgctxt "enhanced select" msgid "Loading failed" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:84 +#: includes/admin/class-suffice-admin-assets.php:87 msgctxt "enhanced select" msgid "Please enter 1 or more characters" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:85 +#: includes/admin/class-suffice-admin-assets.php:88 msgctxt "enhanced select" msgid "Please enter %qty% or more characters" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:86 +#: includes/admin/class-suffice-admin-assets.php:89 msgctxt "enhanced select" msgid "Please delete 1 character" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:87 +#: includes/admin/class-suffice-admin-assets.php:90 msgctxt "enhanced select" msgid "Please delete %qty% characters" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:88 +#: includes/admin/class-suffice-admin-assets.php:91 msgctxt "enhanced select" msgid "You can only select 1 item" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:89 +#: includes/admin/class-suffice-admin-assets.php:92 msgctxt "enhanced select" msgid "You can only select %qty% items" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:90 +#: includes/admin/class-suffice-admin-assets.php:93 msgctxt "enhanced select" msgid "Loading more results…" msgstr "" -#: includes/admin/class-suffice-admin-assets.php:91 +#: includes/admin/class-suffice-admin-assets.php:94 msgctxt "enhanced select" msgid "Searching…" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:59 +#: includes/admin/class-suffice-admin-permalink-settings.php:64 #: includes/class-suffice-post-types.php:74 msgctxt "slug" msgid "portfolio-category" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:69 +#: includes/admin/class-suffice-admin-permalink-settings.php:79 #: includes/class-suffice-post-types.php:111 msgctxt "slug" msgid "portfolio-tag" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:171 +#: includes/admin/class-suffice-admin-permalink-settings.php:189 #: includes/class-suffice-post-types.php:131 msgctxt "slug" msgid "portfolio" @@ -1459,12 +1482,12 @@ msgctxt "slug" msgid "uncategorized" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:83 +#: includes/admin/class-suffice-admin-permalink-settings.php:93 msgctxt "default-slug" msgid "project" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:84 +#: includes/admin/class-suffice-admin-permalink-settings.php:94 msgctxt "default-slug" msgid "portfolio" msgstr "" @@ -1484,7 +1507,8 @@ msgctxt "Admin menu name" msgid "Portfolio" msgstr "" -#: templates/content-widget-blog.php:90 templates/content-widget-blog.php:130 +#: templates/content-widget-blog.php:96 templates/content-widget-blog.php:138 +#. translators: %s: post author link msgctxt "post author" msgid "by %s" msgstr "" \ No newline at end of file From 94b6e906b9ac5f9d5ea742110cab70deb887e30a Mon Sep 17 00:00:00 2001 From: Jenisha Munikar Date: Fri, 24 Apr 2026 08:55:07 +0545 Subject: [PATCH 6/7] tweak: version update to 1.1.0 --- i18n/languages/suffice-toolkit.pot | 4 ++-- package.json | 4 ++-- readme.txt | 11 +++++++++-- suffice-toolkit.php | 4 ++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/i18n/languages/suffice-toolkit.pot b/i18n/languages/suffice-toolkit.pot index 780b124..cd00506 100644 --- a/i18n/languages/suffice-toolkit.pot +++ b/i18n/languages/suffice-toolkit.pot @@ -2,9 +2,9 @@ # This file is distributed under the GPLv3 or later. msgid "" msgstr "" -"Project-Id-Version: Suffice Toolkit 1.0.9\n" +"Project-Id-Version: Suffice Toolkit 1.1.0\n" "Report-Msgid-Bugs-To: themegrill@gmail.com\n" -"POT-Creation-Date: 2026-04-24 03:02:21+00:00\n" +"POT-Creation-Date: 2026-04-24 03:09:17+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/package.json b/package.json index d2473ed..a37a8ec 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "suffice-toolkit", "title": "Suffice Toolkit", - "version": "1.0.9", + "version": "1.1.0", "homepage": "http://themegrill.com/plugins/suffice-toolkit/", "repository": { "type": "git", @@ -30,4 +30,4 @@ "node": ">=10.0.0", "npm": ">=6.9.0 <7" } -} +} \ No newline at end of file diff --git a/readme.txt b/readme.txt index 6113238..76e667c 100644 --- a/readme.txt +++ b/readme.txt @@ -2,8 +2,8 @@ Contributors: ThemeGrill Tags: theme, suffice, toolkit, themegrill Requires at least: 4.0 -Tested up to: 6.1 -Stable tag: 1.0.9 +Tested up to: 6.9 +Stable tag: 1.1.0 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.html @@ -32,6 +32,13 @@ Get free support at https://themegrill.com/support-forum/ == Changelog == +== 1.1.0 - 2026-04-24 == +* Fix - Security and WordPress guideline compliance issues. +* Fix - Internationalization and text domain corrections. +* Fix - Sanitization, validation, and output escaping improvements. +* Fix - Nonce verification and user capability checks. +* Fix - Removed remote file calls and enforced local asset usage. + == 1.0.9 - 2022-12-20 == * Tweak - Removed wordpress patch version number diff --git a/suffice-toolkit.php b/suffice-toolkit.php index 8747017..c78306d 100644 --- a/suffice-toolkit.php +++ b/suffice-toolkit.php @@ -3,7 +3,7 @@ * Plugin Name: Suffice Toolkit * Plugin URI: https://themegrill.com/themes/suffice * Description: Suffice Toolkit is a companion for Suffice WordPress theme by ThemeGrill - * Version: 1.0.9 + * Version: 1.1.0 * Author: ThemeGrill * Author URI: http://themegrill.com * License: GPLv3 or later @@ -29,7 +29,7 @@ final class SufficeToolkit { * Plugin version. * @var string */ - public $version = '1.0.9'; + public $version = '1.1.0'; /** * Instance of this class. From c7db2a117c2ad0a73ba34af2f6582f2c12c14097 Mon Sep 17 00:00:00 2001 From: Jenisha Munikar Date: Mon, 27 Apr 2026 16:47:40 +0545 Subject: [PATCH 7/7] fix: phpcs and sanitization issues --- i18n/languages/suffice-toolkit.pot | 139 +++++++++--------- .../views/html-admin-tmpl-repeater.php | 2 +- .../admin/class-suffice-admin-notices.php | 19 ++- ...class-suffice-admin-permalink-settings.php | 23 ++- includes/admin/functions-suffice-meta-box.php | 12 +- .../class-suffice-meta-box-layout-data.php | 5 +- .../class-suffice-meta-box-portfolio-data.php | 7 +- includes/admin/views/html-notice-update.php | 11 +- includes/admin/views/html-notice-updating.php | 11 +- includes/class-suffice-ajax.php | 6 +- includes/class-suffice-background-updater.php | 8 +- includes/class-suffice-install.php | 30 +++- includes/class-suffice-sidebars.php | 7 +- includes/functions-suffice-core.php | 4 +- includes/libraries/wp-async-request.php | 7 +- includes/libraries/wp-background-process.php | 20 +-- suffice-toolkit.php | 6 +- templates/content-widget-featured-posts.php | 2 +- templates/content-widget-portfolio.php | 4 +- 19 files changed, 198 insertions(+), 125 deletions(-) diff --git a/i18n/languages/suffice-toolkit.pot b/i18n/languages/suffice-toolkit.pot index cd00506..cab381d 100644 --- a/i18n/languages/suffice-toolkit.pot +++ b/i18n/languages/suffice-toolkit.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: Suffice Toolkit 1.1.0\n" "Report-Msgid-Bugs-To: themegrill@gmail.com\n" -"POT-Creation-Date: 2026-04-24 03:09:17+00:00\n" +"POT-Creation-Date: 2026-04-27 11:00:39+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -107,56 +107,57 @@ msgid "" msgstr "" #: includes/admin/class-suffice-admin-notices.php:103 -#: includes/admin/class-suffice-admin-permalink-settings.php:161 -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:149 -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:127 -#: includes/class-suffice-sidebars.php:94 +#: includes/admin/class-suffice-admin-notices.php:181 +#: includes/admin/class-suffice-admin-permalink-settings.php:162 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:150 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:128 +#: includes/class-suffice-install.php:85 includes/class-suffice-sidebars.php:95 msgid "Action failed. Please refresh the page and retry." msgstr "" #: includes/admin/class-suffice-admin-notices.php:107 -#: includes/admin/class-suffice-admin-permalink-settings.php:165 -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:153 -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:131 -#: includes/class-suffice-sidebars.php:98 suffice-toolkit.php:57 -#: suffice-toolkit.php:65 -msgid "Cheatin’ huh?" +#: includes/admin/class-suffice-admin-notices.php:171 +#: includes/admin/class-suffice-admin-permalink-settings.php:166 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:154 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:132 +#: includes/class-suffice-install.php:75 includes/class-suffice-sidebars.php:99 +msgid "Cheatin' huh?" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:34 +#: includes/admin/class-suffice-admin-permalink-settings.php:35 msgid "Portfolio Permalinks" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:39 +#: includes/admin/class-suffice-admin-permalink-settings.php:40 msgid "Portfolio category base" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:46 +#: includes/admin/class-suffice-admin-permalink-settings.php:47 msgid "Portfolio tag base" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:87 +#: includes/admin/class-suffice-admin-permalink-settings.php:88 msgid "These settings control the permalinks specifically used for portfolio." msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:106 +#: includes/admin/class-suffice-admin-permalink-settings.php:107 #: includes/widgets/class-suffice-widget-slider.php:83 msgid "Default" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:110 +#: includes/admin/class-suffice-admin-permalink-settings.php:111 msgid "Project base" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:114 +#: includes/admin/class-suffice-admin-permalink-settings.php:115 msgid "Project based category" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:119 +#: includes/admin/class-suffice-admin-permalink-settings.php:120 msgid "Custom Base" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:121 +#: includes/admin/class-suffice-admin-permalink-settings.php:122 msgid "" "Enter a custom base to use. A base must be set or " "WordPress will use default instead." @@ -270,107 +271,107 @@ msgstr "" msgid "Thank you for creating with Suffice Toolkit." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:41 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:42 msgid "Layout Settings" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:43 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:44 msgid "Default Layout" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:44 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:45 msgid "Left Sidebar" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:45 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:46 msgid "Right Sidebar" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:46 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:47 msgid "Full Width" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:47 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:48 msgid "Full Width Center" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:52 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:53 msgid "Select the specific layout for this entry." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:64 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:65 msgid "Sidebar Settings" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:68 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:69 msgid "Choose a custom sidebar for this entry." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:78 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:79 msgid "Footer Settings" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:80 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:81 msgid "Default Socket and Widgets" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:81 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:82 msgid "Both Socket and Widgets" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:82 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:83 msgid "Only Widgets (No Socket)" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:83 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:84 msgid "Only Socket (No Widgets)" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:84 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:85 msgid "Hide Socket and Widgets" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:89 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:90 msgid "Display the socket and footer widgets?" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:101 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:102 msgid "Header Transparency" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:103 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:104 msgid "No Transparency" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:104 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:105 msgid "Transparent Header" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:109 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:110 msgid "Header transparency options on this page." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:121 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:122 msgid "Top Sidebar Position" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:123 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:124 msgid "None" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:124 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:125 msgid "Above Header" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:125 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:126 msgid "Below Header" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:130 +#: includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php:131 msgid "Top Sidebar Position options on this page." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:36 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:37 #: includes/widgets/class-suffice-widget-blog.php:43 #: includes/widgets/class-suffice-widget-blog.php:54 #: includes/widgets/class-suffice-widget-blog.php:66 @@ -422,32 +423,32 @@ msgstr "" msgid "General" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:41 -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:107 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:42 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:108 msgid "Description" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:68 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:69 msgid "Layout Type" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:70 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:71 msgid "One Column" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:71 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:72 msgid "Two Column" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:74 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:75 msgid "Define whether or not the entire layout should be one or two column based." msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:87 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:88 msgid "Sample Checkbox" msgstr "" -#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:88 +#: includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php:89 msgid "Enable example checkbox." msgstr "" @@ -477,11 +478,11 @@ msgstr "" msgid "We need to update your site's database to the latest version." msgstr "" -#: includes/admin/views/html-notice-update.php:13 +#: includes/admin/views/html-notice-update.php:22 msgid "Run the updater" msgstr "" -#: includes/admin/views/html-notice-update.php:17 +#: includes/admin/views/html-notice-update.php:26 msgid "" "It is strongly recommended that you backup your database before proceeding. " "Are you sure you wish to run the updater now?" @@ -497,23 +498,23 @@ msgstr "" msgid "Your database is being updated in the background." msgstr "" -#: includes/admin/views/html-notice-updating.php:12 +#: includes/admin/views/html-notice-updating.php:21 msgid "Taking a while? Click here to run it now." msgstr "" -#: includes/class-suffice-install.php:280 +#: includes/class-suffice-install.php:302 msgid "View Suffice Toolkit Documentation" msgstr "" -#: includes/class-suffice-install.php:280 +#: includes/class-suffice-install.php:302 msgid "Docs" msgstr "" -#: includes/class-suffice-install.php:281 +#: includes/class-suffice-install.php:303 msgid "Visit Free Customer Support Forum" msgstr "" -#: includes/class-suffice-install.php:281 +#: includes/class-suffice-install.php:303 msgid "Free Support" msgstr "" @@ -714,7 +715,7 @@ msgstr "" msgid "This is where you can add new portfolio items to your project." msgstr "" -#: includes/class-suffice-sidebars.php:130 +#: includes/class-suffice-sidebars.php:131 #. translators: %s: widget area name msgid "Custom Widget Area of the site - %s" msgstr "" @@ -1365,6 +1366,10 @@ msgstr "" msgid "Title Position" msgstr "" +#: suffice-toolkit.php:57 suffice-toolkit.php:65 +msgid "Cheatin’ huh?" +msgstr "" + #: templates/content-widget-blog.php:105 templates/content-widget-blog.php:147 #: templates/content-widget-featured-posts.php:120 #. translators: %s: post title @@ -1459,19 +1464,19 @@ msgctxt "enhanced select" msgid "Searching…" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:64 +#: includes/admin/class-suffice-admin-permalink-settings.php:65 #: includes/class-suffice-post-types.php:74 msgctxt "slug" msgid "portfolio-category" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:79 +#: includes/admin/class-suffice-admin-permalink-settings.php:80 #: includes/class-suffice-post-types.php:111 msgctxt "slug" msgid "portfolio-tag" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:189 +#: includes/admin/class-suffice-admin-permalink-settings.php:200 #: includes/class-suffice-post-types.php:131 msgctxt "slug" msgid "portfolio" @@ -1482,12 +1487,12 @@ msgctxt "slug" msgid "uncategorized" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:93 +#: includes/admin/class-suffice-admin-permalink-settings.php:94 msgctxt "default-slug" msgid "project" msgstr "" -#: includes/admin/class-suffice-admin-permalink-settings.php:94 +#: includes/admin/class-suffice-admin-permalink-settings.php:95 msgctxt "default-slug" msgid "portfolio" msgstr "" diff --git a/includes/abstracts/views/html-admin-tmpl-repeater.php b/includes/abstracts/views/html-admin-tmpl-repeater.php index 1769efd..44b5f12 100644 --- a/includes/abstracts/views/html-admin-tmpl-repeater.php +++ b/includes/abstracts/views/html-admin-tmpl-repeater.php @@ -15,7 +15,7 @@

        - $field ) : ?> + $field ) : //phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound ?>
      • diff --git a/includes/admin/class-suffice-admin-notices.php b/includes/admin/class-suffice-admin-notices.php index 0e48aff..31c95eb 100644 --- a/includes/admin/class-suffice-admin-notices.php +++ b/includes/admin/class-suffice-admin-notices.php @@ -100,11 +100,11 @@ public static function has_notice( $name ) { public static function hide_notices() { if ( isset( $_GET['suffice-toolkit-hide-notice'] ) && isset( $_GET['_suffice_toolkit_notice_nonce'] ) ) { if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_suffice_toolkit_notice_nonce'] ) ), 'suffice_toolkit_hide_notices_nonce' ) ) { - wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); } if ( ! current_user_can( 'manage_suffice_toolkit' ) ) { - wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( "Cheatin' huh?", 'suffice-toolkit' ) ); } $hide_notice = sanitize_text_field( wp_unslash( $_GET['suffice-toolkit-hide-notice'] ) ); @@ -165,8 +165,21 @@ public static function output_custom_notices() { */ public static function update_notice() { if ( version_compare( get_option( 'suffice_toolkit_db_version' ), ST_VERSION, '<' ) ) { - $updater = new ST_Background_Updater(); + $updater = new \ST_Background_Updater(); if ( $updater->is_updating() || ! empty( $_GET['do_update_suffice_toolkit'] ) ) { + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( esc_html__( "Cheatin' huh?", 'suffice-toolkit' ) ); + } + + if ( + ! isset( $_GET['_wpnonce'] ) || + ! wp_verify_nonce( + sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), + 'suffice_toolkit_update' + ) + ) { + wp_die( esc_html__( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); + } include 'views/html-notice-updating.php'; } else { include 'views/html-notice-update.php'; diff --git a/includes/admin/class-suffice-admin-permalink-settings.php b/includes/admin/class-suffice-admin-permalink-settings.php index ac7c9af..92f3312 100644 --- a/includes/admin/class-suffice-admin-permalink-settings.php +++ b/includes/admin/class-suffice-admin-permalink-settings.php @@ -16,6 +16,7 @@ /** * ST_Admin_Permalink_Settings Class */ +// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound class ST_Admin_Permalink_Settings { /** @@ -158,11 +159,11 @@ public function settings_save() { // We need to save the options ourselves; settings api does not trigger save for the permalinks page. if ( isset( $_POST['permalink_structure'] ) ) { if ( ! isset( $_POST['suffice_toolkit_permalink_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['suffice_toolkit_permalink_nonce'] ) ), 'suffice_toolkit_permalink_action' ) ) { - wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); } if ( ! current_user_can( 'manage_options' ) ) { - wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( "Cheatin' huh?", 'suffice-toolkit' ) ); } $permalinks = get_option( 'suffice_toolkit_permalinks' ); @@ -171,15 +172,25 @@ public function settings_save() { $permalinks = array(); } - $permalinks['category_base'] = suffice_sanitize_permalink( trim( $_POST['suffice_toolkit_portfolio_category_slug'] ) ); - $permalinks['tag_base'] = suffice_sanitize_permalink( trim( $_POST['suffice_toolkit_portfolio_tag_slug'] ) ); + $permalinks['category_base'] = isset( $_POST['suffice_toolkit_portfolio_category_slug'] ) + ? suffice_sanitize_permalink( wp_unslash( $_POST['suffice_toolkit_portfolio_category_slug'] ) ) //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitized in suffice_sanitize_permalink() + : ''; + + $permalinks['tag_base'] = isset( $_POST['suffice_toolkit_portfolio_tag_slug'] ) + ? suffice_sanitize_permalink( wp_unslash( $_POST['suffice_toolkit_portfolio_tag_slug'] ) ) //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitized in suffice_sanitize_permalink() + : ''; // Portfolio base. - $portfolio_permalink = isset( $_POST['portfolio_permalink'] ) ? suffice_clean( $_POST['portfolio_permalink'] ) : ''; + $portfolio_permalink = isset( $_POST['portfolio_permalink'] ) ? suffice_clean( $_POST['portfolio_permalink'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- unslash and sanitized in suffice_clean() if ( 'custom' === $portfolio_permalink ) { if ( isset( $_POST['portfolio_permalink_structure'] ) ) { - $portfolio_permalink = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', trim( $_POST['portfolio_permalink_structure'] ) ) ); + + $structure = sanitize_text_field( + wp_unslash( $_POST['portfolio_permalink_structure'] ) + ); + + $portfolio_permalink = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', trim( $structure ) ) ); } else { $portfolio_permalink = '/'; } diff --git a/includes/admin/functions-suffice-meta-box.php b/includes/admin/functions-suffice-meta-box.php index 18e1d1a..5e8a21e 100644 --- a/includes/admin/functions-suffice-meta-box.php +++ b/includes/admin/functions-suffice-meta-box.php @@ -19,7 +19,7 @@ function suffice_toolkit_wp_text_input( $field ) { global $thepostid, $post; - $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; + $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; //phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound $field['placeholder'] = isset( $field['placeholder'] ) ? $field['placeholder'] : ''; $field['class'] = isset( $field['class'] ) ? $field['class'] : 'short'; $field['style'] = isset( $field['style'] ) ? $field['style'] : ''; @@ -69,7 +69,7 @@ function suffice_toolkit_wp_text_input( $field ) { function suffice_toolkit_wp_hidden_input( $field ) { global $thepostid, $post; - $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; + $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; //phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound $field['value'] = isset( $field['value'] ) ? $field['value'] : get_post_meta( $thepostid, $field['id'], true ); $field['class'] = isset( $field['class'] ) ? $field['class'] : ''; @@ -83,7 +83,7 @@ function suffice_toolkit_wp_hidden_input( $field ) { function suffice_toolkit_wp_textarea_input( $field ) { global $thepostid, $post; - $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; + $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; //phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound $field['placeholder'] = isset( $field['placeholder'] ) ? $field['placeholder'] : ''; $field['class'] = isset( $field['class'] ) ? $field['class'] : 'short'; $field['style'] = isset( $field['style'] ) ? $field['style'] : ''; @@ -120,7 +120,7 @@ function suffice_toolkit_wp_textarea_input( $field ) { function suffice_toolkit_wp_checkbox( $field ) { global $thepostid, $post; - $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; + $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; //phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound $field['class'] = isset( $field['class'] ) ? $field['class'] : 'checkbox'; $field['style'] = isset( $field['style'] ) ? $field['style'] : ''; $field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : ''; @@ -159,7 +159,7 @@ function suffice_toolkit_wp_checkbox( $field ) { function suffice_toolkit_wp_select( $field ) { global $thepostid, $post; - $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; + $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; //phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound $field['class'] = isset( $field['class'] ) ? $field['class'] : 'select short'; $field['style'] = isset( $field['style'] ) ? $field['style'] : ''; $field['desc_side'] = isset( $field['desc_side'] ) ? $field['desc_side'] : false; @@ -218,7 +218,7 @@ function suffice_toolkit_wp_select( $field ) { function suffice_toolkit_wp_radio( $field ) { global $thepostid, $post; - $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; + $thepostid = empty( $thepostid ) ? $post->ID : $thepostid; //phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound $field['class'] = isset( $field['class'] ) ? $field['class'] : 'select short'; $field['style'] = isset( $field['style'] ) ? $field['style'] : ''; $field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : ''; diff --git a/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php b/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php index 368aeb9..dce99bd 100644 --- a/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php +++ b/includes/admin/meta-boxes/class-suffice-meta-box-layout-data.php @@ -18,6 +18,7 @@ /** * ST_Meta_Box_Layout_Data Class */ +// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound class ST_Meta_Box_Layout_Data { /** @@ -146,11 +147,11 @@ public static function output( $post ) { */ public static function save( $post_id ) { if ( ! isset( $_POST['suffice_toolkit_meta_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['suffice_toolkit_meta_nonce'] ) ), 'suffice_toolkit_save_data' ) ) { - wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); } if ( ! current_user_can( 'edit_post', $post_id ) ) { - wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( "Cheatin' huh?", 'suffice-toolkit' ) ); } $layout_post_meta = array( 'suffice_layout', 'suffice_sidebar', 'suffice_footer', 'suffice_transparency', 'suffice_top_sidebar_position' ); diff --git a/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php b/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php index 309001c..8ac6896 100644 --- a/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php +++ b/includes/admin/meta-boxes/class-suffice-meta-box-portfolio-data.php @@ -16,6 +16,7 @@ /** * ST_Meta_Box_Portfolio_Data Class */ +// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound class ST_Meta_Box_Portfolio_Data { /** @@ -124,15 +125,15 @@ public static function output( $post ) { */ public static function save( $post_id ) { if ( ! isset( $_POST['suffice_toolkit_meta_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['suffice_toolkit_meta_nonce'] ) ), 'suffice_toolkit_save_data' ) ) { - wp_die( __( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( 'Action failed. Please refresh the page and retry.', 'suffice-toolkit' ) ); } if ( ! current_user_can( 'edit_post', $post_id ) ) { - wp_die( __( 'Cheatin’ huh?', 'suffice-toolkit' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die( esc_html__( "Cheatin' huh?", 'suffice-toolkit' ) ); } // Add/replace data to array - $layout_type = isset( $_POST['layout_type'] ) ? suffice_clean( $_POST['layout_type'] ) : ''; + $layout_type = isset( $_POST['layout_type'] ) ? suffice_clean( $_POST['layout_type'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- unslash and sanitized in suffice_clean() $layout_desc = isset( $_POST['layout_desc'] ) ? sanitize_textarea_field( wp_unslash( $_POST['layout_desc'] ) ) : ''; $_example_cb = isset( $_POST['_example_cb'] ) ? 'yes' : 'no'; diff --git a/includes/admin/views/html-notice-update.php b/includes/admin/views/html-notice-update.php index d5ddf7d..faa0694 100644 --- a/includes/admin/views/html-notice-update.php +++ b/includes/admin/views/html-notice-update.php @@ -10,7 +10,16 @@ ?>

        -

        +