Advanced AJAX Product Filters - Version 1.3.7

Version Description

  • Critical Update! Sanitize all settings. Can break some custom CSS/JavaScript.
  • Fix - Show notification about security problem
Download this release

Release Info

Developer RazyRx
Plugin Icon wp plugin Advanced AJAX Product Filters
Version 1.3.7
Comparing to
See all releases

Code changes from version 1.3.6.1 to 1.3.7

berocket/framework.php CHANGED
@@ -34,7 +34,7 @@ if( ! class_exists( 'BeRocket_Framework' ) ) {
34
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
35
  load_plugin_textdomain('BeRocket_domain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/');
36
  class BeRocket_Framework {
37
- public static $framework_version = '2.5.4';
38
  public static $settings_name = '';
39
  public $addons;
40
  public $libraries;
@@ -368,7 +368,8 @@ if( ! class_exists( 'BeRocket_Framework' ) ) {
368
  */
369
  public function set_styles() {
370
  $options = $this->get_option();
371
- echo '<style>' . $options[ 'custom_css' ] . '</style>';
 
372
  }
373
  public function set_scripts() {
374
  $options = $this->get_option();
@@ -953,6 +954,7 @@ if( ! class_exists( 'BeRocket_Framework' ) ) {
953
  */
954
  public function sanitize_option( $input ) {
955
  $new_input = $this->recursive_array_set( $this->cc->defaults, $input );
 
956
  return apply_filters('brfr_sanitize_option_' . $this->cc->info[ 'plugin_name' ], $new_input, $input, $this->cc->defaults);
957
  }
958
 
34
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
35
  load_plugin_textdomain('BeRocket_domain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/');
36
  class BeRocket_Framework {
37
+ public static $framework_version = '2.5.5';
38
  public static $settings_name = '';
39
  public $addons;
40
  public $libraries;
368
  */
369
  public function set_styles() {
370
  $options = $this->get_option();
371
+ $custom_css = berocket_sanitize_array($options[ 'custom_css' ]);
372
+ echo '<style>' . $custom_css . '</style>';
373
  }
374
  public function set_scripts() {
375
  $options = $this->get_option();
954
  */
955
  public function sanitize_option( $input ) {
956
  $new_input = $this->recursive_array_set( $this->cc->defaults, $input );
957
+ $new_input = berocket_sanitize_array($new_input);
958
  return apply_filters('brfr_sanitize_option_' . $this->cc->info[ 'plugin_name' ], $new_input, $input, $this->cc->defaults);
959
  }
960
 
berocket/framework_version.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- $framework_version_current = '2.5.4';
3
  if( version_compare($framework_version_current, $framework_version, '>') ) {
4
  $framework_version = $framework_version_current;
5
  $framework_dir = __DIR__;
1
  <?php
2
+ $framework_version_current = '2.5.5';
3
  if( version_compare($framework_version_current, $framework_version, '>') ) {
4
  $framework_version = $framework_version_current;
5
  $framework_dir = __DIR__;
berocket/includes/functions.php CHANGED
@@ -132,10 +132,10 @@ if( ! function_exists( 'br_color_picker' ) ) {
132
  */
133
  function br_color_picker($name, $value, $default, $additional = array()) {
134
  $default_button = ( isset($additional['default_button']) ? $additional['default_button'] : true );
135
- $class = ( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
136
- $extra = ( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
137
- $default = ( isset($default) && strlen($default) > 1 ? ( $default == -1 ? '' : ( $default[0] == '#' ? $default : '#' . $default ) ) : '#000000' );
138
- $value = ( empty($value) ? $default : ( $value[0] == '#' ? $value : '#' . $value ) );
139
  $return = '';
140
  $return .= '<div class="berocket_color"><div class="br_colorpicker" data-default="' . $default . '" data-color="' . $value . '" style="background-color:' . $value . ';"></div>
141
  <input class="br_colorpicker_value' . $class . '" type="hidden" value="' . $value . '" name="' . $name . '"' . $extra . '/>';
@@ -162,8 +162,9 @@ if ( ! function_exists( 'br_upload_image' ) ) {
162
  */
163
  function br_upload_image( $name, $value, $additional = array() ) {
164
  $remove_button = ( isset($additional['remove_button']) ? $additional['remove_button'] : true );
165
- $class = ( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
166
- $extra = ( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
 
167
  $result = '<div>';
168
  $result .= '<input type="hidden" name="' . $name . '" value="' . $value . '" readonly class="berocket_image_value ' . $class . '"' . $extra . '/>
169
  <span class="berocket_selected_image">' . ( empty($value) ? '' : '<image src="' . $value . '">' ) . '</span>
@@ -211,8 +212,9 @@ if ( ! function_exists( 'br_fontawesome_image' ) ) {
211
  */
212
  function br_fontawesome_image( $name, $value, $additional = array() ) {
213
  $remove_button = ( isset($additional['remove_button']) ? $additional['remove_button'] : true );
214
- $class = ( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
215
- $extra = ( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
 
216
  $result = '<div class="berocket_select_fontawesome berocket_select_image">';
217
  $result .= berocket_fa_dark();
218
  $result .= '<input type="hidden" name="' . $name . '" value="' . $value . '" readonly class="berocket_image_value berocket_fa_value ' . $class . '"' . $extra . '/>
@@ -243,8 +245,9 @@ if ( ! function_exists( 'br_select_fontawesome' ) ) {
243
  */
244
  function br_select_fontawesome( $name, $value, $additional = array() ) {
245
  $remove_button = ( isset($additional['remove_button']) ? $additional['remove_button'] : true );
246
- $class = ( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
247
- $extra = ( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
 
248
  $result = '<div class="berocket_select_fontawesome">';
249
  $result .= berocket_fa_dark();
250
  $result .= '<input type="hidden" name="' . $name . '" value="' . $value . '" readonly class="berocket_fa_value ' . $class . '"' . $extra . '/>
@@ -262,9 +265,9 @@ if ( ! function_exists( 'br_select_fontawesome' ) ) {
262
  if( ! function_exists( 'br_products_selector' ) ) {
263
  function br_products_selector($name, $value, $additional = array()) {
264
  $multiple = ( isset($additional['multiple']) ? $additional['multiple'] : true );
265
- $class = ( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
266
- $extra = ( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
267
- $action = ( isset($additional['action']) ? $additional['action'] : 'woocommerce_json_search_products_and_variations' );
268
  if ( $class ) {
269
  $class = " class='" . $class . "'";
270
  }
@@ -381,6 +384,7 @@ if ( ! function_exists( 'berocket_font_select_upload' ) ) {
381
  * @return string html code with all needed blocks and buttons
382
  */
383
  function berocket_font_select_upload( $text, $id, $name, $value, $show_fa = true, $show_upload = true, $show_remove = true, $data_sc = '' ) {
 
384
  if ( $show_fa ) {
385
  $font_awesome_list = fa_icons_list();
386
  $font_awesome = "";
@@ -466,12 +470,14 @@ if( ! function_exists( 'berocket_sanitize_array' ) ){
466
 
467
  do
468
  {
469
- // Remove really unwanted tags
470
- $old_data = $filtered;
471
- $filtered = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $filtered);
472
  }
473
  while ($old_data !== $filtered);
474
 
 
 
475
  $found = false;
476
  while ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) {
477
  $filtered = str_replace($match[0], '', $filtered);
132
  */
133
  function br_color_picker($name, $value, $default, $additional = array()) {
134
  $default_button = ( isset($additional['default_button']) ? $additional['default_button'] : true );
135
+ $class = htmlentities( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
136
+ $extra = htmlentities( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
137
+ $default = htmlentities( isset($default) && strlen($default) > 1 ? ( $default == -1 ? '' : ( $default[0] == '#' ? $default : '#' . $default ) ) : '#000000' );
138
+ $value = htmlentities( empty($value) ? $default : ( $value[0] == '#' ? $value : '#' . $value ) );
139
  $return = '';
140
  $return .= '<div class="berocket_color"><div class="br_colorpicker" data-default="' . $default . '" data-color="' . $value . '" style="background-color:' . $value . ';"></div>
141
  <input class="br_colorpicker_value' . $class . '" type="hidden" value="' . $value . '" name="' . $name . '"' . $extra . '/>';
162
  */
163
  function br_upload_image( $name, $value, $additional = array() ) {
164
  $remove_button = ( isset($additional['remove_button']) ? $additional['remove_button'] : true );
165
+ $class = htmlentities( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
166
+ $extra = htmlentities( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
167
+ $value = htmlentities($value);
168
  $result = '<div>';
169
  $result .= '<input type="hidden" name="' . $name . '" value="' . $value . '" readonly class="berocket_image_value ' . $class . '"' . $extra . '/>
170
  <span class="berocket_selected_image">' . ( empty($value) ? '' : '<image src="' . $value . '">' ) . '</span>
212
  */
213
  function br_fontawesome_image( $name, $value, $additional = array() ) {
214
  $remove_button = ( isset($additional['remove_button']) ? $additional['remove_button'] : true );
215
+ $class = htmlentities( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
216
+ $extra = htmlentities( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
217
+ $value = htmlentities($value);
218
  $result = '<div class="berocket_select_fontawesome berocket_select_image">';
219
  $result .= berocket_fa_dark();
220
  $result .= '<input type="hidden" name="' . $name . '" value="' . $value . '" readonly class="berocket_image_value berocket_fa_value ' . $class . '"' . $extra . '/>
245
  */
246
  function br_select_fontawesome( $name, $value, $additional = array() ) {
247
  $remove_button = ( isset($additional['remove_button']) ? $additional['remove_button'] : true );
248
+ $class = htmlentities( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
249
+ $extra = htmlentities( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
250
+ $value = htmlentities($value);
251
  $result = '<div class="berocket_select_fontawesome">';
252
  $result .= berocket_fa_dark();
253
  $result .= '<input type="hidden" name="' . $name . '" value="' . $value . '" readonly class="berocket_fa_value ' . $class . '"' . $extra . '/>
265
  if( ! function_exists( 'br_products_selector' ) ) {
266
  function br_products_selector($name, $value, $additional = array()) {
267
  $multiple = ( isset($additional['multiple']) ? $additional['multiple'] : true );
268
+ $class = htmlentities( ( isset($additional['class']) && trim( $additional['class'] ) ) ? ' ' . trim( $additional['class'] ) : '' );
269
+ $extra = htmlentities( ( isset($additional['extra']) && trim( $additional['extra'] ) ) ? ' ' . trim( $additional['extra'] ) : '' );
270
+ $action = htmlentities( isset($additional['action']) ? $additional['action'] : 'woocommerce_json_search_products_and_variations' );
271
  if ( $class ) {
272
  $class = " class='" . $class . "'";
273
  }
384
  * @return string html code with all needed blocks and buttons
385
  */
386
  function berocket_font_select_upload( $text, $id, $name, $value, $show_fa = true, $show_upload = true, $show_remove = true, $data_sc = '' ) {
387
+ $value = htmlentities($value);
388
  if ( $show_fa ) {
389
  $font_awesome_list = fa_icons_list();
390
  $font_awesome = "";
470
 
471
  do
472
  {
473
+ // Remove really unwanted tags
474
+ $old_data = $filtered;
475
+ $filtered = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $filtered);
476
  }
477
  while ($old_data !== $filtered);
478
 
479
+ $filtered = str_replace('fromCharCode', 'fr0mCharC0de', $filtered);
480
+
481
  $found = false;
482
  while ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) {
483
  $filtered = str_replace($match[0], '', $filtered);
berocket/includes/settings_fields.php CHANGED
@@ -67,7 +67,7 @@ class BeRocket_framework_settings_fields {
67
  }
68
  function textarea($html, $field_item, $field_name, $value, $class, $extra) {
69
  $html .= $field_item['label_be_for'] . '<textarea name="' . $field_name
70
- . '"' . $class . $extra . '>'. $value . '</textarea>' . $field_item['label_for'];
71
  return $html;
72
  }
73
  function color($html, $field_item, $field_name, $value, $class, $extra) {
67
  }
68
  function textarea($html, $field_item, $field_name, $value, $class, $extra) {
69
  $html .= $field_item['label_be_for'] . '<textarea name="' . $field_name
70
+ . '"' . $class . $extra . '>'. htmlentities($value) . '</textarea>' . $field_item['label_for'];
71
  return $html;
72
  }
73
  function color($html, $field_item, $field_name, $value, $class, $extra) {
images/attention.png ADDED
Binary file
includes/functions.php CHANGED
@@ -1,4 +1,25 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  if( ! function_exists( 'br_get_current_language_code' ) ){
3
  /**
4
  * Permalink block in settings
1
  <?php
2
+ if( ! function_exists( 'br_set_value_to_array' ) ){
3
+ function br_set_value_to_array(&$arr, $index, $value = '') {
4
+ if( ! isset($arr) || ! is_array($arr) ) {
5
+ $arr = array();
6
+ }
7
+ if( ! is_array($index) ) {
8
+ $index = array($index);
9
+ }
10
+ $array = &$arr;
11
+ foreach($index as $i) {
12
+ if( ! isset($array[$i]) ) {
13
+ $array[$i] = array();
14
+ }
15
+ $array2 = &$array[$i];
16
+ unset($array);
17
+ $array = &$array2;
18
+ }
19
+ $array = $value;
20
+ return $arr;
21
+ }
22
+ }
23
  if( ! function_exists( 'br_get_current_language_code' ) ){
24
  /**
25
  * Permalink block in settings
main.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
- define( "BeRocket_AJAX_domain", 'BeRocket_AJAX_domain');
3
- define( "BeRocket_AJAX_cache_expire", '21600' );
4
  define( "AAPF_TEMPLATE_PATH", plugin_dir_path( __FILE__ ) . "templates/" );
5
  load_plugin_textdomain('BeRocket_AJAX_domain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/');
6
  require_once(plugin_dir_path( __FILE__ ).'berocket/framework.php');
@@ -122,9 +122,9 @@ class BeRocket_AAPF extends BeRocket_Framework {
122
  'styles_input' => array(
123
  'checkbox' => array( 'bcolor' => '', 'bwidth' => '', 'bradius' => '', 'fcolor' => '', 'backcolor' => '', 'icon' => '', 'fontsize' => '', 'theme' => '' ),
124
  'radio' => array( 'bcolor' => '', 'bwidth' => '', 'bradius' => '', 'fcolor' => '', 'backcolor' => '', 'icon' => '', 'fontsize' => '', 'theme' => '' ),
125
- 'slider' => array( 'line_color' => '', 'line_height' => '', 'line_border_color' => '', 'line_border_width' => '', 'button_size' => '',
126
  'button_color' => '', 'button_border_color' => '', 'button_border_width' => '', 'button_border_radius' => '' ),
127
- 'pc_ub' => array( 'back_color' => '', 'border_color' => '', 'font_size' => '', 'font_color' => '', 'show_font_size' => '', 'close_size' => '',
128
  'show_font_color' => '', 'show_font_color_hover' => '', 'close_font_color' => '', 'close_font_color_hover' => '' ),
129
  'product_count' => 'round',
130
  'product_count_position' => '',
@@ -286,8 +286,8 @@ class BeRocket_AAPF extends BeRocket_Framework {
286
  }
287
  }
288
  function init_validation() {
289
- return parent::init_validation() && ( ( is_plugin_active( 'woocommerce/woocommerce.php' ) || is_plugin_active_for_network( 'woocommerce/woocommerce.php' ) ) &&
290
- br_get_woocommerce_version() >= 2.1 );
291
  }
292
  function check_framework_version() {
293
  return ( ! empty(BeRocket_Framework::$framework_version) && version_compare(BeRocket_Framework::$framework_version, 2.1, '>=') );
@@ -398,10 +398,10 @@ class BeRocket_AAPF extends BeRocket_Framework {
398
  ),
399
  array(
400
  'General' => array(
401
- 'setup_wizard' => array(
402
  "section" => "setup_wizard",
403
  "value" => "",
404
- ),
405
  'no_products_message' => array(
406
  "label" => __( '"No Products" message', "BeRocket_AJAX_domain" ),
407
  "type" => "text",
@@ -463,7 +463,7 @@ class BeRocket_AAPF extends BeRocket_Framework {
463
  "items" => array(
464
  'scroll_shop_top' => array(
465
  "label" => __( 'Selected filters position', "BeRocket_AJAX_domain" ),
466
- "name" => "scroll_shop_top",
467
  "type" => "selectbox",
468
  "class" => "br_scroll_shop_top",
469
  "options" => array(
@@ -514,7 +514,7 @@ class BeRocket_AAPF extends BeRocket_Framework {
514
  'Elements' => array(
515
  'elements_position_hook' => array(
516
  "label" => __( 'Selected filters position', "BeRocket_AJAX_domain" ),
517
- "name" => "elements_position_hook",
518
  "type" => "selectbox",
519
  "options" => array(
520
  array('value' => 'woocommerce_archive_description', 'text' => __('WooCommerce Description(in header)', 'BeRocket_AJAX_domain')),
@@ -670,7 +670,7 @@ class BeRocket_AAPF extends BeRocket_Framework {
670
  'seo_meta_title_visual' => array(
671
  "label" => __( 'Selected filters position', "BeRocket_AJAX_domain" ),
672
  "tr_class" => "berocket_seo_meta_title_elements",
673
- "name" => "seo_meta_title_visual",
674
  "type" => "selectbox",
675
  "options" => apply_filters('berocket_aapf_seo_meta_filters_hooks_list', array(
676
  array('value' => 'BeRocket_AAPF_wcseo_title_visual1', 'text' => __('{title} with [attribute] [values] and [attribute] [values]', 'BeRocket_AJAX_domain')),
@@ -851,7 +851,7 @@ class BeRocket_AAPF extends BeRocket_Framework {
851
  "value" => '',
852
  "label_be_for" => __('Use', 'BeRocket_AJAX_domain'),
853
  "label_for" => __('load method', 'BeRocket_AJAX_domain') . '<br>'
854
- . '<p class="notice notice-error">' . __('Some features do not work with alternative load method', 'BeRocket_AJAX_domain') . '</p>',
855
  ),
856
  ),
857
  ),
@@ -966,16 +966,16 @@ class BeRocket_AAPF extends BeRocket_Framework {
966
  $html = '<tr>
967
  <th scope="row">' . __('Purge Cache', 'BeRocket_AJAX_domain') . '</th>
968
  <td>';
969
- $old_filter_widgets = get_option('widget_berocket_aapf_widget');
970
- if( ! is_array($old_filter_widgets) ) {
971
- $old_filter_widgets = array();
972
- }
973
- foreach ($old_filter_widgets as $key => $value) {
974
- if (!is_numeric($key)) {
975
- unset($old_filter_widgets[$key]);
976
- }
977
- }
978
- $html .= '
979
  <span class="button berocket_purge_cache" data-time="'.time().'">
980
  <input class="berocket_purge_cache_input" type="hidden" name="br_filters_options[purge_cache_time]" value="'.br_get_value_from_array($options, 'purge_cache_time').'">
981
  ' . __('Purge Cache', 'BeRocket_AJAX_domain') . '
@@ -1000,27 +1000,27 @@ class BeRocket_AAPF extends BeRocket_Framework {
1000
  $html = '<tr>
1001
  <th scope="row">' . __('Replace old widgets', 'BeRocket_AJAX_domain') . '</th>
1002
  <td>';
1003
- $old_filter_widgets = get_option('widget_berocket_aapf_widget');
1004
- if( ! is_array($old_filter_widgets) ) {
1005
- $old_filter_widgets = array();
1006
- }
1007
- foreach ($old_filter_widgets as $key => $value) {
1008
- if (!is_numeric($key)) {
1009
- unset($old_filter_widgets[$key]);
1010
- }
1011
- }
1012
- $html .= '<span
1013
  class="button berocket_replace_deprecated_with_new' . ( !count($old_filter_widgets) ? ' berocket_ajax_sending' : '' ) . '"
1014
  data-ready="' . __('Widget replaced', 'BeRocket_AJAX_domain') . '"
1015
  data-loading="' . __('Replacing widgets... Please wait', 'BeRocket_AJAX_domain') . '"';
1016
- if( !count($old_filter_widgets) ) $html .= ' disabled="disabled"';
1017
- $html .= '>';
1018
- if( count($old_filter_widgets) ) {
1019
- $html .= __('Replace widgets', 'BeRocket_AJAX_domain');
1020
- } else {
1021
- $html .= __('No old widgets', 'BeRocket_AJAX_domain');
1022
- }
1023
- $html .= '</span>
1024
  <p>' . __('Replace deprecated widgets with new single filter widgets', 'BeRocket_AJAX_domain') . '</p>
1025
  <script>
1026
  jQuery(".berocket_replace_deprecated_with_new").click(function() {
@@ -1048,7 +1048,7 @@ class BeRocket_AAPF extends BeRocket_Framework {
1048
  </tr>
1049
  <tr>
1050
  <td style="width:600px;">
1051
- <textarea style="width: 100%; min-height: 400px; height:900px" name="br_filters_options[user_custom_css]">' . br_get_value_from_array($options, 'user_custom_css') . '</textarea>
1052
  </td>
1053
  <td><div class="berocket_css_examples"style="max-width:300px;">
1054
  <h4>Add border to widget</h4>
@@ -1457,11 +1457,11 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
1457
  'no_products' => ("<p class='no-products woocommerce-info" . ( ! empty( $br_options['no_products_class'] ) ? ' '.$br_options['no_products_class'] : '' ) . "'>" . $br_options['no_products_message'] . "</p>"),
1458
  'recount_products' => ( empty($br_options['recount_products']) ? '' : $br_options['recount_products'] ),
1459
  'pos_relative' => ( empty($br_options['pos_relative']) ? '' : $br_options['pos_relative'] ),
1460
- 'woocommerce_removes' => json_encode( array(
1461
- 'result_count' => ( empty($br_options['woocommerce_removes']['result_count']) ? '' : $br_options['woocommerce_removes']['result_count'] ),
1462
- 'ordering' => ( empty($br_options['woocommerce_removes']['ordering']) ? '' : $br_options['woocommerce_removes']['ordering'] ),
1463
- 'pagination' => ( empty($br_options['woocommerce_removes']['pagination']) ? '' : $br_options['woocommerce_removes']['pagination'] ),
1464
- ) ),
1465
  'description_show' => ( ! empty($br_options['description']['show']) ? $br_options['description']['show'] : 'click' ),
1466
  'description_hide' => ( ! empty($br_options['description']['hide']) ? $br_options['description']['hide'] : 'click' ),
1467
  'hide_sel_value' => ( empty($br_options['hide_value']['sel']) ? '' : $br_options['hide_value']['sel'] ),
@@ -1478,11 +1478,11 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
1478
  <div class="berocket_aapf_widget_loading_bottom">' . ( ! empty( $br_options['ajax_load_text']['bottom'] ) ? $br_options['ajax_load_text']['bottom'] : '' ) . '</div>
1479
  </div></div>',
1480
  'translate' => array(
1481
- 'show_value' => __('Show value(s)', 'BeRocket_AJAX_domain'),
1482
- 'hide_value' => __('Hide value(s)', 'BeRocket_AJAX_domain'),
1483
- 'unselect_all' => __('Unselect all', 'BeRocket_AJAX_domain'),
1484
- 'nothing_selected' => __('Nothing is selected', 'BeRocket_AJAX_domain'),
1485
- 'products' => __('products', 'BeRocket_AJAX_domain'),
1486
  ),
1487
  'trailing_slash' => $permalink_structure,
1488
  'pagination_base' => $wp_rewrite->pagination_base,
@@ -1576,7 +1576,7 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
1576
  if( ! isset( self::$error_log['2_shortcodes'] ) )
1577
  {
1578
  self::$error_log['2_shortcodes'] = array();
1579
- }
1580
  self::$error_log['2_shortcodes'][] = $atts;
1581
  }
1582
  $default = BeRocket_AAPF_Widget::$defaults;
@@ -1774,8 +1774,8 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
1774
  br_aapf_args_converter( $query );
1775
  }
1776
  if ( ( ( ! is_admin() && $is_wc_main_query ) || $is_shortcode ) ) {
1777
- if( ( apply_filters( 'berocket_aapf_is_filtered_page_check', ! empty($_GET['filters']), 'apply_user_filters', $query ) )
1778
- && ( ( isset($query->query_vars['wc_query']) && $query->query_vars['wc_query'] == 'product_query' ) || ( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'product' ) ) ) {
1779
  $args = $this->get_filter_args($query);
1780
  $args_fields = array( 'meta_key', 'tax_query', 'fields', 'where', 'join', 'meta_query', 'date_query' );
1781
  foreach ( $args_fields as $args_field ) {
@@ -1793,7 +1793,7 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
1793
 
1794
  //THIS CAN BE NEW FIX FOR SORTING, BUT NOT SURE
1795
  if( class_exists('WC_Query') && method_exists('WC_Query', 'product_query') ) {
1796
-
1797
  if( empty($_GET['orderby']) && wc_clean( get_query_var( 'orderby' ) ) && strtolower(wc_clean( get_query_var( 'order' ) )) == 'desc' ) {
1798
  $orderby = strtolower(wc_clean( get_query_var( 'orderby' ) ));
1799
  $orderby = explode(' ', $orderby);
@@ -2029,7 +2029,7 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
2029
  switch_to_blog( $old_blog );
2030
  return;
2031
  }
2032
- }
2033
  $this->_br_add_defaults();
2034
  }
2035
  public function _br_add_defaults() {
@@ -2107,7 +2107,7 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
2107
  '#widget-title#' => '.berocket_aapf_widget-title'
2108
  );
2109
  $result_css = "";
2110
- if ( ! empty( $options['user_custom_css'] ) ) {
2111
  if ( ! (
2112
  preg_match( "/script/i", $options[ 'user_custom_css' ] ) or
2113
  preg_match( "/style/i", $options[ 'user_custom_css' ] ) or
@@ -2117,7 +2117,8 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
2117
  ) ) {
2118
  $result_css = $options[ 'user_custom_css' ];
2119
  }
2120
- }
 
2121
  foreach ( $replace_css as $key => $value ) {
2122
  $result_css = str_replace( $key, $value, $result_css );
2123
  }
@@ -2534,9 +2535,9 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
2534
  $min = isset( $_POST['price'][0] ) ? floatval( $_POST['price'][0] ) : 0;
2535
  $max = isset( $_POST['price'][1] ) ? floatval( $_POST['price'][1] ) : 9999999999;
2536
  if( ! empty($woocommerce_wpml) && is_object($woocommerce_wpml)
2537
- && property_exists($woocommerce_wpml, 'multi_currency') && is_object($woocommerce_wpml->multi_currency)
2538
- && property_exists($woocommerce_wpml->multi_currency, 'prices') && is_object($woocommerce_wpml->multi_currency->prices)
2539
- && method_exists($woocommerce_wpml->multi_currency->prices, 'unconvert_price_amount') ) {
2540
  $min = $woocommerce_wpml->multi_currency->prices->unconvert_price_amount($min);
2541
  $max = $woocommerce_wpml->multi_currency->prices->unconvert_price_amount($max);
2542
  }
@@ -2599,6 +2600,29 @@ jQuery(document).on('change', '.br_selected_area_show', br_selected_area_show);
2599
  if( $previous === '0' ) {
2600
  update_option('berocket_filter_open_wizard_on_settings', true);
2601
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2602
  }
2603
  public function save_settings_callback( $settings ) {
2604
  $options = $this->get_option();
1
  <?php
2
+ define( "BeRocket_AJAX_domain", 'BeRocket_AJAX_domain');
3
+ define( "BeRocket_AJAX_cache_expire", '21600' );
4
  define( "AAPF_TEMPLATE_PATH", plugin_dir_path( __FILE__ ) . "templates/" );
5
  load_plugin_textdomain('BeRocket_AJAX_domain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/');
6
  require_once(plugin_dir_path( __FILE__ ).'berocket/framework.php');
122
  'styles_input' => array(
123
  'checkbox' => array( 'bcolor' => '', 'bwidth' => '', 'bradius' => '', 'fcolor' => '', 'backcolor' => '', 'icon' => '', 'fontsize' => '', 'theme' => '' ),
124
  'radio' => array( 'bcolor' => '', 'bwidth' => '', 'bradius' => '', 'fcolor' => '', 'backcolor' => '', 'icon' => '', 'fontsize' => '', 'theme' => '' ),
125
+ 'slider' => array( 'line_color' => '', 'line_height' => '', 'line_border_color' => '', 'line_border_width' => '', 'button_size' => '',
126
  'button_color' => '', 'button_border_color' => '', 'button_border_width' => '', 'button_border_radius' => '' ),
127
+ 'pc_ub' => array( 'back_color' => '', 'border_color' => '', 'font_size' => '', 'font_color' => '', 'show_font_size' => '', 'close_size' => '',
128
  'show_font_color' => '', 'show_font_color_hover' => '', 'close_font_color' => '', 'close_font_color_hover' => '' ),
129
  'product_count' => 'round',
130
  'product_count_position' => '',
286
  }
287
  }
288
  function init_validation() {
289
+ return parent::init_validation() && ( ( is_plugin_active( 'woocommerce/woocommerce.php' ) || is_plugin_active_for_network( 'woocommerce/woocommerce.php' ) ) &&
290
+ br_get_woocommerce_version() >= 2.1 );
291
  }
292
  function check_framework_version() {
293
  return ( ! empty(BeRocket_Framework::$framework_version) && version_compare(BeRocket_Framework::$framework_version, 2.1, '>=') );
398
  ),
399
  array(
400
  'General' => array(
401
+ /*'setup_wizard' => array(
402
  "section" => "setup_wizard",
403
  "value" => "",
404
+ ),*/
405
  'no_products_message' => array(
406
  "label" => __( '"No Products" message', "BeRocket_AJAX_domain" ),
407
  "type" => "text",
463
  "items" => array(
464
  'scroll_shop_top' => array(
465
  "label" => __( 'Selected filters position', "BeRocket_AJAX_domain" ),
466
+ "name" => "scroll_shop_top",
467
  "type" => "selectbox",
468
  "class" => "br_scroll_shop_top",
469
  "options" => array(
514
  'Elements' => array(
515
  'elements_position_hook' => array(
516
  "label" => __( 'Selected filters position', "BeRocket_AJAX_domain" ),
517
+ "name" => "elements_position_hook",
518
  "type" => "selectbox",
519
  "options" => array(
520
  array('value' => 'woocommerce_archive_description', 'text' => __('WooCommerce Description(in header)', 'BeRocket_AJAX_domain')),
670
  'seo_meta_title_visual' => array(
671
  "label" => __( 'Selected filters position', "BeRocket_AJAX_domain" ),
672
  "tr_class" => "berocket_seo_meta_title_elements",
673
+ "name" => "seo_meta_title_visual",
674
  "type" => "selectbox",
675
  "options" => apply_filters('berocket_aapf_seo_meta_filters_hooks_list', array(
676
  array('value' => 'BeRocket_AAPF_wcseo_title_visual1', 'text' => __('{title} with [attribute] [values] and [attribute] [values]', 'BeRocket_AJAX_domain')),
851
  "value" => '',
852
  "label_be_for" => __('Use', 'BeRocket_AJAX_domain'),
853
  "label_for" => __('load method', 'BeRocket_AJAX_domain') . '<br>'
854
+ . '<p class="notice notice-error">' . __('Some features do not work with alternative load method', 'BeRocket_AJAX_domain') . '</p>',
855
  ),
856
  ),
857
  ),
966
  $html = '<tr>
967
  <th scope="row">' . __('Purge Cache', 'BeRocket_AJAX_domain') . '</th>
968
  <td>';
969
+ $old_filter_widgets = get_option('widget_berocket_aapf_widget');
970
+ if( ! is_array($old_filter_widgets) ) {
971
+ $old_filter_widgets = array();
972
+ }
973
+ foreach ($old_filter_widgets as $key => $value) {
974
+ if (!is_numeric($key)) {
975
+ unset($old_filter_widgets[$key]);
976
+ }
977
+ }
978
+ $html .= '
979
  <span class="button berocket_purge_cache" data-time="'.time().'">
980
  <input class="berocket_purge_cache_input" type="hidden" name="br_filters_options[purge_cache_time]" value="'.br_get_value_from_array($options, 'purge_cache_time').'">
981
  ' . __('Purge Cache', 'BeRocket_AJAX_domain') . '
1000
  $html = '<tr>
1001
  <th scope="row">' . __('Replace old widgets', 'BeRocket_AJAX_domain') . '</th>
1002
  <td>';
1003
+ $old_filter_widgets = get_option('widget_berocket_aapf_widget');
1004
+ if( ! is_array($old_filter_widgets) ) {
1005
+ $old_filter_widgets = array();
1006
+ }
1007
+ foreach ($old_filter_widgets as $key => $value) {
1008
+ if (!is_numeric($key)) {
1009
+ unset($old_filter_widgets[$key]);
1010
+ }
1011
+ }
1012
+ $html .= '<span
1013
  class="button berocket_replace_deprecated_with_new' . ( !count($old_filter_widgets) ? ' berocket_ajax_sending' : '' ) . '"
1014
  data-ready="' . __('Widget replaced', 'BeRocket_AJAX_domain') . '"
1015
  data-loading="' . __('Replacing widgets... Please wait', 'BeRocket_AJAX_domain') . '"';
1016
+ if( !count($old_filter_widgets) ) $html .= ' disabled="disabled"';
1017
+ $html .= '>';
1018
+ if( count($old_filter_widgets) ) {
1019
+ $html .= __('Replace widgets', 'BeRocket_AJAX_domain');
1020
+ } else {
1021
+ $html .= __('No old widgets', 'BeRocket_AJAX_domain');
1022
+ }
1023
+ $html .= '</span>
1024
  <p>' . __('Replace deprecated widgets with new single filter widgets', 'BeRocket_AJAX_domain') . '</p>
1025
  <script>
1026
  jQuery(".berocket_replace_deprecated_with_new").click(function() {
1048
  </tr>
1049
  <tr>
1050
  <td style="width:600px;">
1051
+ <textarea style="width: 100%; min-height: 400px; height:900px" name="br_filters_options[user_custom_css]">' . htmlentities(br_get_value_from_array($options, 'user_custom_css')) . '</textarea>
1052
  </td>
1053
  <td><div class="berocket_css_examples"style="max-width:300px;">
1054
  <h4>Add border to widget</h4>
1457
  'no_products' => ("<p class='no-products woocommerce-info" . ( ! empty( $br_options['no_products_class'] ) ? ' '.$br_options['no_products_class'] : '' ) . "'>" . $br_options['no_products_message'] . "</p>"),
1458
  'recount_products' => ( empty($br_options['recount_products']) ? '' : $br_options['recount_products'] ),
1459
  'pos_relative' => ( empty($br_options['pos_relative']) ? '' : $br_options['pos_relative'] ),
1460
+ 'woocommerce_removes' => json_encode( array(
1461
+ 'result_count' => ( empty($br_options['woocommerce_removes']['result_count']) ? '' : $br_options['woocommerce_removes']['result_count'] ),
1462
+ 'ordering' => ( empty($br_options['woocommerce_removes']['ordering']) ? '' : $br_options['woocommerce_removes']['ordering'] ),
1463
+ 'pagination' => ( empty($br_options['woocommerce_removes']['pagination']) ? '' : $br_options['woocommerce_removes']['pagination'] ),
1464
+ ) ),
1465
  'description_show' => ( ! empty($br_options['description']['show']) ? $br_options['description']['show'] : 'click' ),
1466
  'description_hide' => ( ! empty($br_options['description']['hide']) ? $br_options['description']['hide'] : 'click' ),
1467
  'hide_sel_value' => ( empty($br_options['hide_value']['sel']) ? '' : $br_options['hide_value']['sel'] ),
1478
  <div class="berocket_aapf_widget_loading_bottom">' . ( ! empty( $br_options['ajax_load_text']['bottom'] ) ? $br_options['ajax_load_text']['bottom'] : '' ) . '</div>
1479
  </div></div>',
1480
  'translate' => array(
1481
+ 'show_value' => __('Show value(s)', 'BeRocket_AJAX_domain'),
1482
+ 'hide_value' => __('Hide value(s)', 'BeRocket_AJAX_domain'),
1483
+ 'unselect_all' => __('Unselect all', 'BeRocket_AJAX_domain'),
1484
+ 'nothing_selected' => __('Nothing is selected', 'BeRocket_AJAX_domain'),
1485
+ 'products' => __('products', 'BeRocket_AJAX_domain'),
1486
  ),
1487
  'trailing_slash' => $permalink_structure,
1488
  'pagination_base' => $wp_rewrite->pagination_base,
1576
  if( ! isset( self::$error_log['2_shortcodes'] ) )
1577
  {
1578
  self::$error_log['2_shortcodes'] = array();
1579
+ }
1580
  self::$error_log['2_shortcodes'][] = $atts;
1581
  }
1582
  $default = BeRocket_AAPF_Widget::$defaults;
1774
  br_aapf_args_converter( $query );
1775
  }
1776
  if ( ( ( ! is_admin() && $is_wc_main_query ) || $is_shortcode ) ) {
1777
+ if( ( apply_filters( 'berocket_aapf_is_filtered_page_check', ! empty($_GET['filters']), 'apply_user_filters', $query ) )
1778
+ && ( ( isset($query->query_vars['wc_query']) && $query->query_vars['wc_query'] == 'product_query' ) || ( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'product' ) ) ) {
1779
  $args = $this->get_filter_args($query);
1780
  $args_fields = array( 'meta_key', 'tax_query', 'fields', 'where', 'join', 'meta_query', 'date_query' );
1781
  foreach ( $args_fields as $args_field ) {
1793
 
1794
  //THIS CAN BE NEW FIX FOR SORTING, BUT NOT SURE
1795
  if( class_exists('WC_Query') && method_exists('WC_Query', 'product_query') ) {
1796
+
1797
  if( empty($_GET['orderby']) && wc_clean( get_query_var( 'orderby' ) ) && strtolower(wc_clean( get_query_var( 'order' ) )) == 'desc' ) {
1798
  $orderby = strtolower(wc_clean( get_query_var( 'orderby' ) ));
1799
  $orderby = explode(' ', $orderby);
2029
  switch_to_blog( $old_blog );
2030
  return;
2031
  }
2032
+ }
2033
  $this->_br_add_defaults();
2034
  }
2035
  public function _br_add_defaults() {
2107
  '#widget-title#' => '.berocket_aapf_widget-title'
2108
  );
2109
  $result_css = "";
2110
+ /*if ( ! empty( $options['user_custom_css'] ) ) {
2111
  if ( ! (
2112
  preg_match( "/script/i", $options[ 'user_custom_css' ] ) or
2113
  preg_match( "/style/i", $options[ 'user_custom_css' ] ) or
2117
  ) ) {
2118
  $result_css = $options[ 'user_custom_css' ];
2119
  }
2120
+ }*/
2121
+ $result_css = str_replace(array('<style>', '</style>', '<'), '', $options[ 'user_custom_css' ]);
2122
  foreach ( $replace_css as $key => $value ) {
2123
  $result_css = str_replace( $key, $value, $result_css );
2124
  }
2535
  $min = isset( $_POST['price'][0] ) ? floatval( $_POST['price'][0] ) : 0;
2536
  $max = isset( $_POST['price'][1] ) ? floatval( $_POST['price'][1] ) : 9999999999;
2537
  if( ! empty($woocommerce_wpml) && is_object($woocommerce_wpml)
2538
+ && property_exists($woocommerce_wpml, 'multi_currency') && is_object($woocommerce_wpml->multi_currency)
2539
+ && property_exists($woocommerce_wpml->multi_currency, 'prices') && is_object($woocommerce_wpml->multi_currency->prices)
2540
+ && method_exists($woocommerce_wpml->multi_currency->prices, 'unconvert_price_amount') ) {
2541
  $min = $woocommerce_wpml->multi_currency->prices->unconvert_price_amount($min);
2542
  $max = $woocommerce_wpml->multi_currency->prices->unconvert_price_amount($max);
2543
  }
2600
  if( $previous === '0' ) {
2601
  update_option('berocket_filter_open_wizard_on_settings', true);
2602
  }
2603
+ if( $previous !== '0' && ( version_compare($previous, '1.3.7', '<') || (version_compare($previous, '2.0', '>') && version_compare($previous, '2.3.1', '<') ) ) ) {
2604
+ $options = $this->get_option();
2605
+ $options = berocket_sanitize_array($options);
2606
+ update_option( 'br_filters_options', $options );
2607
+ new berocket_admin_notices(array(
2608
+ 'start' => 0,
2609
+ 'end' => 0,
2610
+ 'name' => 'aapf_security_risk',
2611
+ 'html' => 'Older versions of the AJAX Product Filters by BeRocket have critical issue that require your attention. Please read this article fully - <a href="https://docs.berocket.com/docs_section/error-on-front-end" target="_blank">Error on front-end</a>',
2612
+ 'righthtml' => '<a class="berocket_no_thanks">I read and understand the problem. Close it</a>',
2613
+ 'rightwidth' => 200,
2614
+ 'nothankswidth' => 200,
2615
+ 'contentwidth' => 400,
2616
+ 'subscribe' => false,
2617
+ 'priority' => 20,
2618
+ 'height' => 50,
2619
+ 'repeat' => false,
2620
+ 'repeatcount' => 1,
2621
+ 'image' => array(
2622
+ 'local' => plugin_dir_url( __FILE__ ) . 'images/attention.png',
2623
+ ),
2624
+ ));
2625
+ }
2626
  }
2627
  public function save_settings_callback( $settings ) {
2628
  $options = $this->get_option();
readme.txt CHANGED
@@ -5,7 +5,7 @@ Donate link: https://berocket.com/product/woocommerce-ajax-products-filter?utm_s
5
  Tags: filters, product filters, ajax product filters, ajax filter, ajax filter widget, color filter, size filter, product onsale filter, product preview, product category filter, product reset filter, product sort by filter, stock filter, product tag filter, price range filter, price box filter, advanced product filters, woocommerce filters, woocommerce product filters, woocommerce products filter, woocommerce ajax product filters, widget, plugin, woocommerce item filters, filters plugin, ajax filters plugin, filter woocommerce products, filter woocommerce products plugin, wc filters, wc filters products, wc products filters, wc ajax products filters, wc product filters, wc advanced product filters, woocommerce layered nav, woocommerce layered navigation, ajax filtered nav, ajax filtered navigation, price filter, ajax price filter, woocommerce product sorting, sidebar filter, sidebar ajax filter, taxonomy filter, category filter, attribute filter, attributes filter, woocommerce product sort, ajax products filter plugin for woocommerce, rocket, berocket, berocket woocommerce ajax products filter
6
  Requires at least: 4.0
7
  Tested up to: 5.2.3
8
- Stable tag: 1.3.6.1
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -184,6 +184,10 @@ You can try this plugin's admin side [here](https://berocket.com/product/woocomm
184
 
185
  == Changelog ==
186
 
 
 
 
 
187
  = 1.3.6.1 =
188
  * Fix - preg_replace warning in the main.php
189
 
5
  Tags: filters, product filters, ajax product filters, ajax filter, ajax filter widget, color filter, size filter, product onsale filter, product preview, product category filter, product reset filter, product sort by filter, stock filter, product tag filter, price range filter, price box filter, advanced product filters, woocommerce filters, woocommerce product filters, woocommerce products filter, woocommerce ajax product filters, widget, plugin, woocommerce item filters, filters plugin, ajax filters plugin, filter woocommerce products, filter woocommerce products plugin, wc filters, wc filters products, wc products filters, wc ajax products filters, wc product filters, wc advanced product filters, woocommerce layered nav, woocommerce layered navigation, ajax filtered nav, ajax filtered navigation, price filter, ajax price filter, woocommerce product sorting, sidebar filter, sidebar ajax filter, taxonomy filter, category filter, attribute filter, attributes filter, woocommerce product sort, ajax products filter plugin for woocommerce, rocket, berocket, berocket woocommerce ajax products filter
6
  Requires at least: 4.0
7
  Tested up to: 5.2.3
8
+ Stable tag: 1.3.7
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
184
 
185
  == Changelog ==
186
 
187
+ = 1.3.7 =
188
+ * Critical Update! Sanitize all settings. Can break some custom CSS/JavaScript.
189
+ * Fix - Show notification about security problem
190
+
191
  = 1.3.6.1 =
192
  * Fix - preg_replace warning in the main.php
193
 
woocommerce-filters.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Advanced AJAX Product Filters for WooCommerce
4
  * Plugin URI: https://wordpress.org/plugins/woocommerce-ajax-filters/?utm_source=free_plugin&utm_medium=plugins&utm_campaign=ajax_filters
5
  * Description: Unlimited AJAX products filters to make your shop perfect
6
- * Version: 1.3.6.1
7
  * Author: BeRocket
8
  * Requires at least: 4.0
9
  * Author URI: https://berocket.com?utm_source=free_plugin&utm_medium=plugins&utm_campaign=ajax_filters
@@ -11,6 +11,6 @@
11
  * Domain Path: /languages/
12
  * WC tested up to: 3.7.0
13
  */
14
- define( "BeRocket_AJAX_filters_version", '1.3.6.1' );
15
  define( "BeRocket_AJAX_filters_file", __FILE__ );
16
  include_once('main.php');
3
  * Plugin Name: Advanced AJAX Product Filters for WooCommerce
4
  * Plugin URI: https://wordpress.org/plugins/woocommerce-ajax-filters/?utm_source=free_plugin&utm_medium=plugins&utm_campaign=ajax_filters
5
  * Description: Unlimited AJAX products filters to make your shop perfect
6
+ * Version: 1.3.7
7
  * Author: BeRocket
8
  * Requires at least: 4.0
9
  * Author URI: https://berocket.com?utm_source=free_plugin&utm_medium=plugins&utm_campaign=ajax_filters
11
  * Domain Path: /languages/
12
  * WC tested up to: 3.7.0
13
  */
14
+ define( "BeRocket_AJAX_filters_version", '1.3.7' );
15
  define( "BeRocket_AJAX_filters_file", __FILE__ );
16
  include_once('main.php');