<?php
/**
* Class for all WooCommerce template modification
*
* @version 1.0
*/
class Grd_WooCommerce {
/**
* @var string Layout of current page
*/
public $layout;
/**
* @var string shop view
*/
public $new_duration;
/**
* Construction function
*
* @since 1.0
* @return Grd_WooCommerce
*/
function __construct() {
// Check if Woocomerce plugin is actived
if ( ! in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
return;
}
// Define all hook
add_action( 'template_redirect', array( $this, 'hooks' ) );
}
/**
* Hooks to WooCommerce actions, filters
*
* @since 1.0
* @return void
*/
function hooks() {
// WooCommerce Styles
add_filter( 'woocommerce_enqueue_styles', array( $this, 'wc_styles' ) );
// Remove breadcrumb, use theme's instead
remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20 );
// Add box shadow
add_action( "woocommerce_before_shop_loop_item", array( $this, 'after_box_shadow' ), 9 );
add_action( "woocommerce_after_shop_loop_item", array( $this, 'before_box_shadow' ), 20 );
// Remove badges
remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash' );
// Add toolbars for shop page
add_filter( 'woocommerce_show_page_title', '__return_false' );
// Remove Rating Product
remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 );
// Addtocart Button
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
add_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_add_to_cart', 15 );
// Quick View Button
add_action( 'woocommerce_before_shop_loop_item_title', array( $this, 'show_quick_view_product' ) );
// Remove product link
remove_action( 'woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open', 10 );
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_product_link_close', 10 );
// Add box images
add_action( "woocommerce_before_shop_loop_item_title", array( $this, 'after_box_images' ), 9 );
add_action( "woocommerce_before_shop_loop_item_title", array( $this, 'before_box_images' ), 20 );
// Add link to product title in shop loop
remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title' );
add_action( 'woocommerce_shop_loop_item_title', array( $this, 'show_product_loop_title' ) );
// Add box content
add_action( "woocommerce_shop_loop_item_title", array( $this, 'after_box_started' ), 9 );
add_action( "woocommerce_after_shop_loop_item_title", array( $this, 'before_box_started' ), 10 );
// Change text button add to cart
add_filter( 'woocommerce_product_add_to_cart_text', array( $this, 'change_text_button' ) );
// Change next and prev text
add_filter( 'woocommerce_pagination_args', array( $this, 'pagination_args' ) );
// Remove flash single product
remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_sale_flash', 10 );
// Check shownumber related single product
add_filter( 'woocommerce_output_related_products_args', array( $this, 'related_custom_number' ) );
// Add product Attribute
add_filter( 'grd_after_single_product_image', array( $this, 'product_thumbnails' ) );
// Add ribbons product
add_action( 'woocommerce_before_shop_loop_item', array( $this, 'product_ribbons' ), 10 );
if ( ! intval( grd_get_option( 'related_product' ) ) ) {
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
}
// Change possition cross sell
remove_action( 'woocommerce_cart_collaterals', 'woocommerce_cross_sell_display' );
add_action( 'woocommerce_after_cart', 'woocommerce_cross_sell_display' );
// Change columns and total of cross sell
add_filter( 'woocommerce_cross_sells_columns', array( $this, 'cross_sells_columns' ) );
add_filter( 'woocommerce_cross_sells_total', array( $this, 'cross_sells_numbers' ) );
}
/**
* Change next and previous icon of pagination nav
*
* @since 1.0
*/
function pagination_args( $args ) {
$args['prev_text'] = '<i class="fa fa-angle-left"></i>';
$args['next_text'] = '<i class="fa fa-angle-right"></i>';
return $args;
}
/**
* Print new product title shop page with link inside
*/
function show_product_loop_title() {
?><h4><a href="<?php the_permalink() ?>"><?php the_title() ?></a></h4><?php
}
/**
* Print new product title shop page with link inside
*/
function show_quick_view_product() {
?><a class="button quick_view_button" href="<?php the_permalink() ?>"><i class="fa fa-eye"></i></a><?php
}
/**
* Add box content
*/
function after_box_shadow() {
echo "<div class='box-shadow'>";
}
function before_box_shadow() {
echo "</div>";
}
/**
* Add box content images
*/
function after_box_images() {
echo "<div class='box-images'>";
}
function before_box_images() {
echo "</div>";
}
/**
* Add box content
*/
function after_box_started() {
echo "<div class='box-content'>";
}
function before_box_started() {
echo "</div>";
}
// Change "" text by your text you want to see
function change_text_button() {
return "";
}
// Check shownumber related single product
function related_custom_number( $args ) {
$number_post = grd_get_option( 'related_product_numbers' );
$number_column = grd_get_option( 'related_product_columns' );
$args['posts_per_page'] = $number_post; // 4 related products
$args['columns'] = $number_column; // arranged in 2 columns
return $args;
}
/**
* Remove default woocommerce styles
*
* @since 1.0
*
* @param array $styles
*
* @return array
*/
function wc_styles( $styles ) {
//unset( $styles['woocommerce-layout'] );
unset( $styles['woocommerce-smallscreen'] );
return $styles;
}
/**
* Get product thumnails
*
* @since 1.0.0
* @return string
*/
function product_thumbnails() {
global $post, $product, $woocommerce;
if ( is_single() ) {
return;
}
$attachment_ids = $product->get_gallery_image_ids();
$video_position = intval( get_post_meta( $product->get_id(), 'video_position', true ) );
$video_thumb = get_post_meta( $product->get_id(), 'video_thumbnail', true );
if ( $video_thumb ) {
$video_thumb = wp_get_attachment_image( $video_thumb, apply_filters( 'single_product_small_thumbnail_size', 'shop_thumbnail' ) );
}
if ( $attachment_ids || $video_thumb ) {
$loop = 1;
$columns = apply_filters( 'woocommerce_product_thumbnails_columns', 3 );
?>
<div class="product-thumbnails" id="product-thumbnails">
<div class="thumbnails <?php echo 'columns-' . $columns; ?>"><?php
$image_thumb = get_the_post_thumbnail( $post->ID, apply_filters( 'single_product_small_thumbnail_size', 'shop_thumbnail' ) );
if ( $image_thumb ) {
printf(
'<div>%s</div>',
$image_thumb
);
}
if ( $attachment_ids ) {
foreach ( $attachment_ids as $attachment_id ) {
if ( $video_thumb ) {
if ( intval( $video_position ) == $loop + 1 ) {
printf(
'<div class="video-thumb">%s</div>',
$video_thumb
);
}
}
echo apply_filters(
'woocommerce_single_product_image_thumbnail_html',
sprintf(
'<div>%s</div>',
wp_get_attachment_image( $attachment_id, apply_filters( 'single_product_small_thumbnail_size', 'shop_thumbnail' ) )
),
$attachment_id,
$post->ID
);
$loop ++;
}
}
if ( $video_thumb ) {
if ( $video_position > count( $attachment_ids ) + 1 ) {
printf(
'<div class="video-thumb">%s</div>',
$video_thumb
);
}
}
?>
</div>
</div>
<?php
}
}
/**
* Change number of columns when display cross sells products
*
* @param int $cl
*
* @return int
*/
function cross_sells_columns( $cross_columns ) {
return apply_filters( 'grd_cross_sells_columns', 4 );
}
/**
* Change number of columns when display cross sells products
*
* @param int $cl
*
* @return int
*/
function cross_sells_numbers( $cross_numbers ) {
return apply_filters( 'grd_cross_sells_total', 4 );
}
/**
* Display badge for new product or featured product
*
* @since 1.0
*/
function product_ribbons() {
global $product;
if ( ! intval( grd_get_option( 'show_badges' ) ) ) {
return;
}
$output = array();
// Change the default sale ribbon
if ( $product->is_featured() ) {
$hot = grd_get_option( 'hot_text' );
if ( ! $hot ) {
$hot = esc_html__( 'Hot', 'grd' );
}
$output[] = '<span class="featured ribbon">' . esc_html( $hot ) . '</span>';
}
if ( $output ) {
printf( '<span class="ribbons">%s</span>', implode( '', $output ) );
}
}
}