<?php
namespace DgoraWcas\Integrations;
use DgoraWcas\Helpers;
use DgoraWcas\Term;
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class Brands
* @package DgoraWcas\Integrations
*
* Support for plugins:
* 1. WooCommerce Brands since v1.6.9 by WooCommerce
* 2. YITH WooCommerce Brands Add-on since v1.3.3 by YITH
* 3. Perfect WooCommerce Brands since v1.8.3 by Alberto de Vera Sevilla
* 4. Martfury Addons since v2.2.2 by drfuri.com
* 5. Brands for WooCommerce since v3.5.2 by BeRocket
* 6. WP Bingo by wpbingo
* 7. Premmerce Brands for WooCommerce since v1.2.11 by premmerce
*/
class Brands {
/**
* Brands plugin metadata
*
* @var array
*/
private $pluginInfo = array();
/**
* Brands plugin slug
*
* @var string
*/
private $pluginSlug = '';
/**
* Brand taxonomy name
*
* @var string
*/
private $brandTaxonomy = '';
public function __construct() {
}
public function init() {
// Init brand stuff after theme is ready (to allow apply filters)
add_action( 'init', function () {
$this->setPluginInfo();
$this->setBrandTaxonomy();
$this->addSettings();
}, 100 );
add_filter( 'dgwt/wcas/suggestion_details/taxonomy/headline', array( $this, 'rebuildDetailsHeader' ), 10, 4 );
add_filter( 'dgwt/wcas/term/thumbnail_src', array( $this, 'termThumbnailSrc' ), 10, 4 );
add_filter( 'dgwt/wcas/indexer/taxonomies', array( $this, 'addBrandToCollectionOfTaxonomies' ), 5 );
}
/**
* Set current brands vendor plugin
*
* @return void
*/
private function setPluginInfo() {
foreach ( $this->getBrandsPlugins() as $pluginPath ) {
if ( is_plugin_active( $pluginPath ) ) {
$file = WP_PLUGIN_DIR . '/' . $pluginPath;
if ( file_exists( $file ) ) {
$this->pluginInfo = get_plugin_data( $file );
$this->pluginSlug = $pluginPath;
}
break;
}
}
}
/**
* Set brand taxonomy name
*
* @return void
*/
private function setBrandTaxonomy() {
$brandTaxonomy = '';
if ( ! empty( $this->pluginSlug ) ) {
switch ( $this->pluginSlug ) {
case 'woocommerce-brands/woocommerce-brands.php':
case 'martfury-addons/martfury-addons.php':
case 'wpbingo/wpbingo.php':
case 'premmerce-woocommerce-brands/premmerce-brands.php':
$brandTaxonomy = 'product_brand';
break;
case 'yith-woocommerce-brands-add-on-premium/init.php':
case 'yith-woocommerce-brands-add-on/init.php':
$brandTaxonomy = 'yith_product_brand';
break;
case 'perfect-woocommerce-brands/main.php':
case 'perfect-woocommerce-brands/perfect-woocommerce-brands.php':
$brandTaxonomy = 'pwb-brand';
break;
case 'brands-for-woocommerce/woocommerce-brand.php':
$brandTaxonomy = 'berocket_brand';
break;
}
}
$brandTaxonomy = apply_filters( 'dgwt/wcas/brands/taxonomy', $brandTaxonomy );
if ( ! empty( $brandTaxonomy ) && taxonomy_exists( $brandTaxonomy ) ) {
$this->brandTaxonomy = $brandTaxonomy;
}
}
/**
* Get all supported brands plugins files
*
* @return array
*/
public function getBrandsPlugins() {
return array(
'woocommerce-brands/woocommerce-brands.php',
'yith-woocommerce-brands-add-on/init.php',
'yith-woocommerce-brands-add-on-premium/init.php',
'perfect-woocommerce-brands/main.php',
'perfect-woocommerce-brands/perfect-woocommerce-brands.php',
'martfury-addons/martfury-addons.php',
'brands-for-woocommerce/woocommerce-brand.php',
'wpbingo/wpbingo.php',
'premmerce-woocommerce-brands/premmerce-brands.php',
);
}
/**
* Check if some brands plugin is enabled
*
* @return bool
*/
public function hasBrands() {
return ! empty( $this->brandTaxonomy );
}
/**
* Get brand taxonomy
*
* @return string
*/
public function getBrandTaxonomy() {
return ! empty( $this->brandTaxonomy ) ? sanitize_key( $this->brandTaxonomy ) : '';
}
/**
* Get the name of the plugin vendor
*
* @return string
*/
public function getPluginName() {
return ! empty( $this->pluginInfo['Name'] ) ? sanitize_text_field( $this->pluginInfo['Name'] ) : '';
}
/**
* Get the name of the plugin vendor
*
* @return string
*/
public function getPluginVersion() {
return ! empty( $this->pluginInfo['Version'] ) ? sanitize_text_field( $this->pluginInfo['Version'] ) : '';
}
/**
* Register settings
*
* @return void
*/
private function addSettings() {
if ( $this->hasBrands() ) {
add_filter( 'dgwt/wcas/settings/section=search', function ( $settingsScope ) {
$label = '';
$pluginName = $this->getPluginName();
if ( ! empty( $pluginName ) ) {
$pluginInfo = $pluginName . ' v' . $this->getPluginVersion();
$label = ' ' . Helpers::createQuestionMark( 'search-in-brands', sprintf( __( 'Based on the plugin %s', 'ajax-search-for-woocommerce' ), $pluginInfo ) );
}
$settingsScope[220] = array(
'name' => 'search_in_product_tax_' . $this->getBrandTaxonomy(),
'label' => __( 'Search in brands', 'ajax-search-for-woocommerce' ) . $label,
'class' => 'dgwt-wcas-premium-only',
'type' => 'checkbox',
'default' => 'off',
);
return $settingsScope;
} );
add_filter( 'dgwt/wcas/settings/section=autocomplete', function ( $settingsScope ) {
$label = '';
$pluginName = $this->getPluginName();
if ( ! empty( $pluginName ) ) {
$pluginInfo = $pluginName . ' v' . $this->getPluginVersion();
$label = ' ' . Helpers::createQuestionMark( 'show-matching-brands', sprintf( __( 'Based on the plugin %s', 'ajax-search-for-woocommerce' ), $pluginInfo ) );
}
$settingsScope[1260] = array(
'name' => 'show_product_tax_' . $this->getBrandTaxonomy(),
'label' => __( 'Show brands', 'ajax-search-for-woocommerce' ) . $label,
'class' => 'dgwt-wcas-premium-only js-dgwt-wcas-options-toggle-sibling',
'type' => 'checkbox',
'default' => 'off',
'input_data' => 'data-option-trigger="show_matching_brands"',
);
if ( $this->doesPluginSupportImages() ) {
$settingsScope[1270] = array(
'name' => 'show_product_tax_' . $this->getBrandTaxonomy() . '_images',
'label' => __( 'show images', 'ajax-search-for-woocommerce' ),
'class' => 'dgwt-wcas-premium-only',
'type' => 'checkbox',
'default' => 'off',
'desc' => __( 'show images', 'ajax-search-for-woocommerce' ),
'move_dest' => 'show_product_tax_' . $this->getBrandTaxonomy(),
'input_data' => 'data-option-trigger="show_brands_images"',
);
}
return $settingsScope;
} );
}
}
/**
* Rebuild details panel header for brands
*
* @param $title
* @param $termID
* @param $taxonomy
* @param $termName
*
* @return string
*/
public function rebuildDetailsHeader( $title, $termID, $taxonomy, $termName ) {
if ( ! empty( $taxonomy ) && $taxonomy === $this->getBrandTaxonomy() ) {
$title = '<span class="dgwt-wcas-datails-title">';
$title .= '<span class="dgwt-wcas-details-title-tax">';
$title .= Helpers::getLabel( 'tax_' . $this->getBrandTaxonomy() ) . ': ';
$title .= '</span>';
$title .= $termName;
$title .= '</span>';
}
return $title;
}
/**
* @param string $src
* @param int $termID
* @param string $size
* @param Term $term
*/
public function termThumbnailSrc( $src, $termID, $size, $term ) {
/**
* Notes:
* - "YITH WooCommerce Brands uses 'thumbnail_id' meta, so we don't need to overwrite URL in this filter
* - "WooCommerce Brands" uses 'thumbnail_id' meta, so we don't need to overwrite URL in this filter
*/
if ( $this->hasBrands() && $this->doesPluginSupportImages() ) {
switch ( $this->pluginSlug ) {
case 'perfect-woocommerce-brands/main.php':
case 'perfect-woocommerce-brands/perfect-woocommerce-brands.php':
$imageID = get_term_meta( $termID, 'pwb_brand_image', true );
if ( ! empty( $imageID ) ) {
$imageSrc = wp_get_attachment_image_src( $imageID, $size );
if ( is_array( $imageSrc ) && ! empty( $imageSrc[0] ) ) {
$src = $imageSrc[0];
}
}
break;
case 'brands-for-woocommerce/woocommerce-brand.php':
$url = get_term_meta( $termID, 'brand_image_url', true );
$src = empty( $url ) ? $src : $url;
break;
}
}
return $src;
}
/**
* Add brand to collection of supported taxonomies
*
* @param array $taxonomies Supported taxonomies
*
* @return array
*/
public function addBrandToCollectionOfTaxonomies( $taxonomies ) {
if ( ! $this->hasBrands() ) {
return $taxonomies;
}
$taxonomies = is_array( $taxonomies ) ? $taxonomies : array();
$taxonomies[] = array(
'taxonomy' => $this->getBrandTaxonomy(),
'labels' => array(
'name' => __( 'Brands', 'ajax-search-for-woocommerce' ),
'singular_name' => __( 'Brand', 'ajax-search-for-woocommerce' ),
),
'image_support' => $this->doesPluginSupportImages(),
);
return $taxonomies;
}
/**
* Check if a current brand plugin does support images
*
* @return bool
*/
private function doesPluginSupportImages() {
$result = in_array(
$this->pluginSlug,
array(
'yith-woocommerce-brands-add-on-premium/init.php',
'yith-woocommerce-brands-add-on/init.php',
'woocommerce-brands/woocommerce-brands.php',
'perfect-woocommerce-brands/main.php',
'perfect-woocommerce-brands/perfect-woocommerce-brands.php',
'brands-for-woocommerce/woocommerce-brand.php',
'premmerce-woocommerce-brands/premmerce-brands.php',
)
);
return apply_filters( 'dgwt/wcas/brands/image_support', $result );
}
}