Perfect Brands for WooCommerce - Version 1.7.2

Version Description

  • Feature: Now is possible to use %pwb-brand% in the product URLs
  • Fix: Fatal error in some themes (like Salient)
  • Fix: Some php notices and warnings fixed
  • Fix: Don't show brand description/banner in paged
Download this release

Release Info

Developer titodevera
Plugin Icon 128x128 Perfect Brands for WooCommerce
Version 1.7.2
Comparing to
See all releases

Code changes from version 1.7.1 to 1.7.2

classes/class-perfect-woocommerce-brands.php CHANGED
@@ -11,26 +11,20 @@ class Perfect_Woocommerce_Brands{
11
  add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
12
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
13
  $this->brand_logo_position();
14
- add_action( 'parse_query', array( $this, 'brand_desc_position' ) );
15
  add_action( 'woocommerce_after_shop_loop_item_title', array( $this, 'show_brands_in_loop' ) );
16
  $this->add_shortcodes();
17
  if( is_plugin_active('js_composer/js_composer.php') || is_plugin_active('visual_composer/js_composer.php') ){
18
  add_action( 'vc_before_init', array( $this,'vc_map_shortcodes' ) );
19
  }
20
  add_action( 'widgets_init', array( $this, 'register_widgets' ) );
21
-
22
- if( defined('PWB_WC_VERSION') && version_compare( PWB_WC_VERSION, '3.0.0', '>=' ) ){
23
- add_filter( 'woocommerce_structured_data_product', array( $this, 'product_microdata' ), 10, 2 );
24
- }else{
25
- add_action( 'wp_head' , array( $this, 'product_microdata_legacy' ), 40 );
26
- }
27
-
28
  add_action( 'pre_get_posts', array( $this, 'pwb_brand_filter' ) );
29
  add_filter( 'plugin_action_links_' . PWB_PLUGIN_BASENAME, array( $this, 'plugin_action_links' ) );
30
  add_action( 'wp_ajax_dismiss_pwb_notice', array( $this, 'dismiss_pwb_notice' ) );
31
  add_action( 'admin_notices', array( $this, 'review_notice' ) );
32
 
33
- add_action( 'pre_get_posts', function(){
34
  if( is_tax('pwb-brand') )
35
  remove_action( 'woocommerce_archive_description', 'woocommerce_taxonomy_archive_description', 10 );
36
  });
@@ -39,10 +33,21 @@ class Perfect_Woocommerce_Brands{
39
  add_filter( 'woocommerce_get_breadcrumb', array( $this, 'breadcrumbs' ) );
40
 
41
  add_filter( 'shortcode_atts_products', array( $this, 'extend_products_shortcode_atts' ), 10, 4 );
42
- add_filter( 'woocommerce_shortcode_products_query', array( $this, 'extend_products_shortcode' ), 10, 3 );
43
 
44
  add_filter( 'manage_edit-product_sortable_columns', array( $this, 'brands_column_sortable' ), 90 );
45
  add_action( 'posts_clauses', array( $this, 'brands_column_sortable_posts' ), 10, 2 );
 
 
 
 
 
 
 
 
 
 
 
46
  }
47
 
48
  public function brands_column_sortable_posts( $clauses, $wp_query ) {
@@ -74,7 +79,7 @@ class Perfect_Woocommerce_Brands{
74
  return $out;
75
  }
76
 
77
- public function extend_products_shortcode( $query_args, $atts, $loop_name ){
78
 
79
  if( !empty( $atts['brands'] ) ){
80
  global $wpdb;
@@ -319,7 +324,7 @@ class Perfect_Woocommerce_Brands{
319
 
320
  public function brand_desc_position(){
321
 
322
- if( is_tax('pwb-brand') ){
323
 
324
  $show_banner = get_option('wc_pwb_admin_tab_brand_banner');
325
  $show_desc = get_option('wc_pwb_admin_tab_brand_desc');
@@ -374,7 +379,7 @@ class Perfect_Woocommerce_Brands{
374
  "base" => "pwb-product-carousel",
375
  "class" => "",
376
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
377
- "category" => "Woocommerce",
378
  "params" => array(
379
  array(
380
  "type" => "dropdown",
@@ -430,7 +435,7 @@ class Perfect_Woocommerce_Brands{
430
  "base" => "pwb-carousel",
431
  "class" => "",
432
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
433
- "category" => "Woocommerce",
434
  "params" => array(
435
  array(
436
  "type" => "textfield",
@@ -488,7 +493,7 @@ class Perfect_Woocommerce_Brands{
488
  "base" => "pwb-all-brands",
489
  "class" => "",
490
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
491
- "category" => "Woocommerce",
492
  "params" => array(
493
  array(
494
  "type" => "textfield",
@@ -558,7 +563,7 @@ class Perfect_Woocommerce_Brands{
558
  "base" => "pwb-az-listing",
559
  "class" => "",
560
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
561
- "category" => "Woocommerce",
562
  "params" => array()
563
  ));
564
 
@@ -568,7 +573,7 @@ class Perfect_Woocommerce_Brands{
568
  "base" => "pwb-brand",
569
  "class" => "",
570
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
571
- "category" => "Woocommerce",
572
 
573
  "params" => array(
574
  array(
@@ -759,7 +764,7 @@ class Perfect_Woocommerce_Brands{
759
  public static function get_brands( $hide_empty = false, $order_by = 'name', $order = 'ASC', $only_featured = false, $pwb_term = false ){
760
  $result = array();
761
 
762
- $brands_args = array( 'hide_empty' => $hide_empty, 'order_by' => $order_by, 'order' => $order );
763
  if( $only_featured ) $brands_args['meta_query'] = array( array( 'key' => 'pwb_featured_brand', 'value' => true ) );
764
 
765
  $brands = get_terms('pwb-brand', $brands_args);
11
  add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
12
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
13
  $this->brand_logo_position();
14
+ add_action( 'wp', array( $this, 'brand_desc_position' ) );
15
  add_action( 'woocommerce_after_shop_loop_item_title', array( $this, 'show_brands_in_loop' ) );
16
  $this->add_shortcodes();
17
  if( is_plugin_active('js_composer/js_composer.php') || is_plugin_active('visual_composer/js_composer.php') ){
18
  add_action( 'vc_before_init', array( $this,'vc_map_shortcodes' ) );
19
  }
20
  add_action( 'widgets_init', array( $this, 'register_widgets' ) );
21
+ add_filter( 'woocommerce_structured_data_product', array( $this, 'product_microdata' ), 10, 2 );
 
 
 
 
 
 
22
  add_action( 'pre_get_posts', array( $this, 'pwb_brand_filter' ) );
23
  add_filter( 'plugin_action_links_' . PWB_PLUGIN_BASENAME, array( $this, 'plugin_action_links' ) );
24
  add_action( 'wp_ajax_dismiss_pwb_notice', array( $this, 'dismiss_pwb_notice' ) );
25
  add_action( 'admin_notices', array( $this, 'review_notice' ) );
26
 
27
+ add_action( 'wp', function(){
28
  if( is_tax('pwb-brand') )
29
  remove_action( 'woocommerce_archive_description', 'woocommerce_taxonomy_archive_description', 10 );
30
  });
33
  add_filter( 'woocommerce_get_breadcrumb', array( $this, 'breadcrumbs' ) );
34
 
35
  add_filter( 'shortcode_atts_products', array( $this, 'extend_products_shortcode_atts' ), 10, 4 );
36
+ add_filter( 'woocommerce_shortcode_products_query', array( $this, 'extend_products_shortcode' ), 10, 2 );
37
 
38
  add_filter( 'manage_edit-product_sortable_columns', array( $this, 'brands_column_sortable' ), 90 );
39
  add_action( 'posts_clauses', array( $this, 'brands_column_sortable_posts' ), 10, 2 );
40
+ add_filter( 'post_type_link', array( $this, 'brand_name_in_url' ), 10, 2 );
41
+ }
42
+
43
+ public function brand_name_in_url( $permalink, $post ){
44
+ if( $post->post_type == 'product' ) {
45
+ $term = 'product';
46
+ $brands = wp_get_post_terms( $post->ID, 'pwb-brand' );
47
+ if( ! empty( $brands ) && ! is_wp_error( $brands ) ) $term = current( $brands )->slug;
48
+ $permalink = str_replace( '%pwb-brand%', $term, $permalink );
49
+ }
50
+ return $permalink;
51
  }
52
 
53
  public function brands_column_sortable_posts( $clauses, $wp_query ) {
79
  return $out;
80
  }
81
 
82
+ public function extend_products_shortcode( $query_args, $atts ){
83
 
84
  if( !empty( $atts['brands'] ) ){
85
  global $wpdb;
324
 
325
  public function brand_desc_position(){
326
 
327
+ if( is_tax('pwb-brand') && !is_paged() ){
328
 
329
  $show_banner = get_option('wc_pwb_admin_tab_brand_banner');
330
  $show_desc = get_option('wc_pwb_admin_tab_brand_desc');
379
  "base" => "pwb-product-carousel",
380
  "class" => "",
381
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
382
+ "category" => "WooCommerce",
383
  "params" => array(
384
  array(
385
  "type" => "dropdown",
435
  "base" => "pwb-carousel",
436
  "class" => "",
437
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
438
+ "category" => "WooCommerce",
439
  "params" => array(
440
  array(
441
  "type" => "textfield",
493
  "base" => "pwb-all-brands",
494
  "class" => "",
495
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
496
+ "category" => "WooCommerce",
497
  "params" => array(
498
  array(
499
  "type" => "textfield",
563
  "base" => "pwb-az-listing",
564
  "class" => "",
565
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
566
+ "category" => "WooCommerce",
567
  "params" => array()
568
  ));
569
 
573
  "base" => "pwb-brand",
574
  "class" => "",
575
  "icon" => PWB_PLUGIN.'/assets/img/icon_pwb.jpg',
576
+ "category" => "WooCommerce",
577
 
578
  "params" => array(
579
  array(
764
  public static function get_brands( $hide_empty = false, $order_by = 'name', $order = 'ASC', $only_featured = false, $pwb_term = false ){
765
  $result = array();
766
 
767
+ $brands_args = array( 'hide_empty' => $hide_empty, 'orderby' => $order_by, 'order' => $order );
768
  if( $only_featured ) $brands_args['meta_query'] = array( array( 'key' => 'pwb_featured_brand', 'value' => true ) );
769
 
770
  $brands = get_terms('pwb-brand', $brands_args);
classes/class-pwb-api-support.php CHANGED
@@ -11,15 +11,8 @@ class PWB_API_Support{
11
  private $base = 'brands';
12
 
13
  function __construct(){
14
- add_action('rest_api_init', array($this, 'register_endpoints'));
15
-
16
- /**
17
- * register_rest_field() was introduced in WordPress 4.7.0
18
- */
19
- if (version_compare(PWB_WP_VERSION, '4.7.0', '>=')) {
20
- add_action('rest_api_init', array($this, 'register_fields'));
21
- }
22
-
23
  }
24
 
25
  /**
@@ -57,7 +50,7 @@ class PWB_API_Support{
57
  }
58
 
59
  public function create_brand( $request ){
60
- $new_brand = wp_insert_term( $request['name'], 'pwb-brand', array( 'slug' => $request['slug'] ) );
61
  if( !is_wp_error( $new_brand ) ){
62
  return true;
63
  }else{
11
  private $base = 'brands';
12
 
13
  function __construct(){
14
+ add_action('rest_api_init', array($this, 'register_endpoints'));
15
+ add_action('rest_api_init', array($this, 'register_fields'));
 
 
 
 
 
 
 
16
  }
17
 
18
  /**
50
  }
51
 
52
  public function create_brand( $request ){
53
+ $new_brand = wp_insert_term( $request['name'], 'pwb-brand', array( 'slug' => $request['slug'], 'description' => $request['description'] ) );
54
  if( !is_wp_error( $new_brand ) ){
55
  return true;
56
  }else{
classes/shortcodes/class-pwb-brand.php CHANGED
@@ -1,43 +1,45 @@
1
  <?php
2
- namespace Perfect_Woocommerce_Brands\Shortcodes;
3
 
4
- defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
5
 
6
- class PWB_Brand_Shortcode{
7
 
8
- public static function brand_shortcode( $atts ) {
9
- $atts = shortcode_atts( array(
10
- 'product_id' => null,
11
- 'image_size' => 'thumbnail'
12
- ), $atts, 'pwb-brand' );
13
 
14
- ob_start();
15
 
16
- $brands = wp_get_post_terms( $atts['product_id'], 'pwb-brand');
17
 
18
- if(is_array($brands) && count($brands)>0){
19
 
20
- echo '<div class="pwb-brand-shortcode">';
21
 
22
- foreach($brands as $brand){
23
- $brand_link = get_term_link ( $brand->term_id, 'pwb-brand' );
24
- $attachment_id = get_term_meta( $brand->term_id, 'pwb_brand_image', 1 );
25
 
26
- $attachment_html = wp_get_attachment_image($attachment_id,$atts['image_size']);
 
 
27
 
28
- if(!empty($attachment_html)){
29
- echo '<a href="'.$brand_link.'" title="'.__( 'View brand', 'perfect-woocommerce-brands' ).'">'.$attachment_html.'</a>';
30
- }else{
31
- echo '<a href="'.$brand_link.'" title="'.__( 'View brand', 'perfect-woocommerce-brands' ).'">'.$brand->name.'</a>';
32
- }
33
- }
34
 
35
- echo '</div>';
 
 
 
 
 
36
 
37
- }
38
 
39
- return ob_get_clean();
40
 
41
- }
42
 
43
- }
 
 
1
  <?php
2
+ namespace Perfect_Woocommerce_Brands\Shortcodes;
3
 
4
+ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
5
 
6
+ class PWB_Brand_Shortcode{
7
 
8
+ public static function brand_shortcode( $atts ) {
9
+ $atts = shortcode_atts( array(
10
+ 'product_id' => null,
11
+ 'image_size' => 'thumbnail'
12
+ ), $atts, 'pwb-brand' );
13
 
14
+ ob_start();
15
 
16
+ if( !$atts['product_id'] && is_singular('product') ) $atts['product_id'] = get_the_ID();
17
 
18
+ $brands = wp_get_post_terms( $atts['product_id'], 'pwb-brand');
19
 
20
+ if( !is_wp_error($brands) && !empty($brands) ){
21
 
22
+ echo '<div class="pwb-brand-shortcode">';
 
 
23
 
24
+ foreach( $brands as $brand ){
25
+ $brand_link = get_term_link ( $brand->term_id, 'pwb-brand' );
26
+ $attachment_id = get_term_meta( $brand->term_id, 'pwb_brand_image', 1 );
27
 
28
+ $attachment_html = wp_get_attachment_image($attachment_id,$atts['image_size']);
 
 
 
 
 
29
 
30
+ if(!empty($attachment_html)){
31
+ echo '<a href="'.$brand_link.'" title="'.__( 'View brand', 'perfect-woocommerce-brands' ).'">'.$attachment_html.'</a>';
32
+ }else{
33
+ echo '<a href="'.$brand_link.'" title="'.__( 'View brand', 'perfect-woocommerce-brands' ).'">'.$brand->name.'</a>';
34
+ }
35
+ }
36
 
37
+ echo '</div>';
38
 
39
+ }
40
 
41
+ return ob_get_clean();
42
 
43
+ }
44
+
45
+ }
main.php CHANGED
@@ -3,13 +3,13 @@
3
  * Plugin Name: Perfect WooCommerce Brands
4
  * Plugin URI: https://wordpress.org/plugins/perfect-woocommerce-brands/
5
  * Description: Perfect WooCommerce Brands allows you to show product brands in your WooCommerce based store.
6
- * Version: 1.7.1
7
  * Author: Alberto de Vera Sevilla
8
  * Author URI: https://profiles.wordpress.org/titodevera/
9
  * Text Domain: perfect-woocommerce-brands
10
  * Domain Path: /lang
11
  * License: GPL3
12
- * Perfect WooCommerce Brands version 1.7.1, Copyright (C) 2018 Alberto de Vera Sevilla
13
  * Perfect WooCommerce Brands is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License as published by
15
  * the Free Software Foundation, either version 3 of the License, or
@@ -22,8 +22,8 @@
22
  * You should have received a copy of the GNU General Public License
23
  * along with Perfect WooCommerce Brands. If not, see <http://www.gnu.org/licenses/>.
24
  *
25
- * WC requires at least: 2.6
26
- * WC tested up to: 3.5
27
  */
28
 
29
  namespace Perfect_Woocommerce_Brands;
@@ -34,7 +34,7 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
34
  define( 'PWB_PLUGIN', plugins_url( '', __FILE__ ) );
35
  define( 'PWB_PLUGIN_PATH', plugin_basename( dirname( __FILE__ ) ) );
36
  define( 'PWB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
37
- define( 'PWB_PLUGIN_VERSION', '1.7.1' );
38
  define( 'PWB_WP_VERSION', get_bloginfo( 'version' ) );
39
  define( 'PWB_WC_VERSION', get_option( 'woocommerce_version' ) );
40
 
@@ -85,13 +85,10 @@ if( is_plugin_active( 'woocommerce/woocommerce.php' ) ){
85
  new Admin\Brands_Custom_Fields();
86
  require 'classes/admin/class-brands-exporter.php';
87
  new Admin\Brands_Exporter();
88
-
89
- if( defined('PWB_WC_VERSION') && version_compare( PWB_WC_VERSION, '3.1.0', '>=' ) ){
90
- require 'classes/admin/class-pwb-importer-support.php';
91
- new PWB_Importer_Support();
92
- require 'classes/admin/class-pwb-exporter-support.php';
93
- new PWB_Exporter_Support();
94
- }
95
 
96
  }else{
97
  include_once 'classes/class-pwb-product-tab.php';
3
  * Plugin Name: Perfect WooCommerce Brands
4
  * Plugin URI: https://wordpress.org/plugins/perfect-woocommerce-brands/
5
  * Description: Perfect WooCommerce Brands allows you to show product brands in your WooCommerce based store.
6
+ * Version: 1.7.2
7
  * Author: Alberto de Vera Sevilla
8
  * Author URI: https://profiles.wordpress.org/titodevera/
9
  * Text Domain: perfect-woocommerce-brands
10
  * Domain Path: /lang
11
  * License: GPL3
12
+ * Perfect WooCommerce Brands version 1.7.2, Copyright (C) 2019 Alberto de Vera Sevilla
13
  * Perfect WooCommerce Brands is free software: you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License as published by
15
  * the Free Software Foundation, either version 3 of the License, or
22
  * You should have received a copy of the GNU General Public License
23
  * along with Perfect WooCommerce Brands. If not, see <http://www.gnu.org/licenses/>.
24
  *
25
+ * WC requires at least: 3.1.0
26
+ * WC tested up to: 3.6
27
  */
28
 
29
  namespace Perfect_Woocommerce_Brands;
34
  define( 'PWB_PLUGIN', plugins_url( '', __FILE__ ) );
35
  define( 'PWB_PLUGIN_PATH', plugin_basename( dirname( __FILE__ ) ) );
36
  define( 'PWB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
37
+ define( 'PWB_PLUGIN_VERSION', '1.7.2' );
38
  define( 'PWB_WP_VERSION', get_bloginfo( 'version' ) );
39
  define( 'PWB_WC_VERSION', get_option( 'woocommerce_version' ) );
40
 
85
  new Admin\Brands_Custom_Fields();
86
  require 'classes/admin/class-brands-exporter.php';
87
  new Admin\Brands_Exporter();
88
+ require 'classes/admin/class-pwb-importer-support.php';
89
+ new PWB_Importer_Support();
90
+ require 'classes/admin/class-pwb-exporter-support.php';
91
+ new PWB_Exporter_Support();
 
 
 
92
 
93
  }else{
94
  include_once 'classes/class-pwb-product-tab.php';
readme.txt CHANGED
@@ -2,9 +2,10 @@
2
  Contributors: titodevera
3
  Donate link: mailto:hola@albertodevera.es
4
  Tags: woocommerce, brands, brand taxonomy, product brands, woocommerce manufacturer, woocommerce supplier, e-commerce
5
- Requires at least: 4.4
6
- Tested up to: 5.0
7
- Stable tag: 1.7.1
 
8
  License: GPL3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.en.html
10
 
@@ -16,16 +17,16 @@ Is essential to work with product brands for increase sales and generate reliabi
16
  With this extension you can add product brands to your WooCommerce site.
17
 
18
  = Requirements =
19
- > * PHP 5.4 or higher (PHP7 recommended)
20
- > * WordPress 4.4 or higher
21
- > * WooCommerce 2.6.0 or higher
22
  > * Visual Composer (recommended)
23
 
24
  = Features =
25
  > * Very easy to use, 100% free, no ads, no premium version exists
26
  > * Assign brands to products
27
  > * Associate a banner and a link to each brand
28
- > * Translation-ready (English and Spanish included)
29
  > * Visual Composer support
30
  > * Minimalist design and fully responsive
31
  > * Very lightweight
@@ -42,7 +43,7 @@ With this extension you can add product brands to your WooCommerce site.
42
  > * Import brands (migrate) from other brands plugins
43
  > * Dummy data installer (logos by heroturko)
44
  > * WooCommerce REST API support
45
- > * WooCommerce built-in product importer/exporter support (WooCommerce 3.1.0+)
46
  > * Brand tab for single product page
47
  > * Favorite brands
48
  > * Brands json import/export
@@ -58,18 +59,18 @@ With this extension you can add product brands to your WooCommerce site.
58
  = Is Perfect WooCommerce Brands free? =
59
  Yes, of course. This plugin is 100% free. No ads, no premium version exists.
60
 
61
- = Where are plugin settings? =
62
  Go to `WooCommerce/Settings/` and click on `Brands` tab
63
 
64
- = How can i use the available shortcodes without Visual Composer? =
65
- [Click here](https://github.com/titodevera/perfect-woocommerce-brands/wiki/How-can-i-use-the-available-shortcodes-without-Visual-Composer%3F)
66
 
67
- = How to import brands from other brands plugin? =
68
- [Click here](https://github.com/titodevera/perfect-woocommerce-brands/wiki/How-to-import-brands-from-other-brands-plugin)
69
-
70
- = REST API docs =
71
- [Click here](https://github.com/titodevera/perfect-woocommerce-brands/wiki/REST-API-docs)
72
 
 
 
73
 
74
  == Screenshots ==
75
  1. Brands carousel
@@ -80,6 +81,11 @@ Go to `WooCommerce/Settings/` and click on `Brands` tab
80
 
81
 
82
  == Changelog ==
 
 
 
 
 
83
  = 1.7.1 =
84
  * Feature: Extends the [products] shortcode to allow 'brands' attribute
85
  * Feature: The brands column is sortable now
2
  Contributors: titodevera
3
  Donate link: mailto:hola@albertodevera.es
4
  Tags: woocommerce, brands, brand taxonomy, product brands, woocommerce manufacturer, woocommerce supplier, e-commerce
5
+ Requires at least: 4.7
6
+ Tested up to: 5.1
7
+ Requires PHP: 5.6
8
+ Stable tag: 1.7.2
9
  License: GPL3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.en.html
11
 
17
  With this extension you can add product brands to your WooCommerce site.
18
 
19
  = Requirements =
20
+ > * PHP 5.6 or higher (PHP7 recommended)
21
+ > * WordPress 4.7 or higher
22
+ > * WooCommerce 3.1.0 or higher
23
  > * Visual Composer (recommended)
24
 
25
  = Features =
26
  > * Very easy to use, 100% free, no ads, no premium version exists
27
  > * Assign brands to products
28
  > * Associate a banner and a link to each brand
29
+ > * Translation-ready
30
  > * Visual Composer support
31
  > * Minimalist design and fully responsive
32
  > * Very lightweight
43
  > * Import brands (migrate) from other brands plugins
44
  > * Dummy data installer (logos by heroturko)
45
  > * WooCommerce REST API support
46
+ > * WooCommerce built-in product importer/exporter support
47
  > * Brand tab for single product page
48
  > * Favorite brands
49
  > * Brands json import/export
59
  = Is Perfect WooCommerce Brands free? =
60
  Yes, of course. This plugin is 100% free. No ads, no premium version exists.
61
 
62
+ = Where are the plugin settings? =
63
  Go to `WooCommerce/Settings/` and click on `Brands` tab
64
 
65
+ = 404 error on brand pages =
66
+ Go to `Settings/Permalinks` and click on `Save Changes` button to flush the permalinks
67
 
68
+ = PWB is awesome! Can I contribute? =
69
+ Yes you can! Join in on our [GitHub repository](https://github.com/titodevera/perfect-woocommerce-brands) 🙂
70
+ You can also contribute [translating the plugin](https://translate.wordpress.org/projects/wp-plugins/perfect-woocommerce-brands/)
 
 
71
 
72
+ = Developer Documentation =
73
+ [Click here](https://github.com/titodevera/perfect-woocommerce-brands/wiki)
74
 
75
  == Screenshots ==
76
  1. Brands carousel
81
 
82
 
83
  == Changelog ==
84
+ = 1.7.2 =
85
+ * Feature: Now is possible to use %pwb-brand% in the product URLs
86
+ * Fix: Fatal error in some themes (like Salient)
87
+ * Fix: Some php notices and warnings fixed
88
+ * Fix: Don't show brand description/banner in paged
89
  = 1.7.1 =
90
  * Feature: Extends the [products] shortcode to allow 'brands' attribute
91
  * Feature: The brands column is sortable now