* Created on: 04/09/2018 * * @package Neve\Compatibility */ namespace Neve\Compatibility; use Neve\Views\Layouts\Layout_Sidebar; /** * Class Woocommerce * * @package Neve\Compatibility */ class Woocommerce { /** * Sidebar manager. * * @var \Neve\Views\Layouts\Layout_Sidebar */ private $sidebar_manager; /** * Initialize the module. */ public function init() { if ( ! class_exists( 'WooCommerce' ) ) { return; } $this->sidebar_manager = new Layout_Sidebar(); // Wrap content. add_action( 'neve_after_primary_start', array( $this, 'wrap_pages_start' ) ); add_action( 'neve_before_primary_end', array( $this, 'wrap_pages_end' ) ); add_action( 'woocommerce_before_main_content', array( $this, 'wrap_main_content_start' ), 15 ); add_action( 'woocommerce_after_main_content', array( $this, 'close_div' ), 15 ); // Handle shop sidebar. remove_action( 'woocommerce_sidebar', 'woocommerce_get_sidebar', 10 ); add_action( 'woocommerce_before_main_content', array( $this, 'shop_sidebar_left' ) ); add_action( 'woocommerce_sidebar', array( $this, 'shop_sidebar_right' ) ); /** * Change product page sidebar default position * Priority 9 to allow meta control to override this value */ add_filter( 'neve_sidebar_position', array( $this, 'product_page_sidebar_default_position' ), 9 ); // Remove WooCommerce wrap. remove_action( 'woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10 ); remove_action( 'woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10 ); add_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20, 0 ); add_filter( 'neve_post_meta_filters_post_id', array( $this, 'adapt_meta_for_shop_page' ) ); /** * Ensure cart contents update when products are added to the cart via AJAX */ add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'cart_link_fragment' ) ); add_filter( 'woocommerce_is_sold_individually', array( $this, 'remove_quantity' ), 10, 2 ); remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 ); add_filter( 'woocommerce_product_description_heading', '__return_false' ); add_filter( 'woocommerce_product_additional_information_heading', '__return_false' ); $this->edit_woocommerce_header(); $this->move_checkout_coupon(); $this->add_inline_selectors(); } /** * Remove quantity input on single product. * * @return bool */ public function remove_quantity() { if ( ! is_product() ) { return false; } return true; } /** * Change breadcrumb delimiter. * * @param array $default breadcrumbs defaults. * * @return mixed */ public function change_breadcrumbs_delimiter( $default ) { $default['delimiter'] = '»'; return $default; } /** * Change the default sidebar position for the product page. * * @param string $input - the value of the customizer control. * * @return string */ public function product_page_sidebar_default_position( $input ) { if ( is_product() ) { return get_theme_mod( 'neve_single_product_sidebar_layout', 'full-width' ); } return $input; } /** * Remove last breadcrumb on single product. * * @param array $crumbs breadcrumbs. * @param array $args breadcrumbs args. * * @return array */ public function remove_last_breadcrumb( $crumbs, $args ) { if ( ! is_product() ) { return $crumbs; } $length = sizeof( $crumbs ) - 1; $crumbs[ $length ][0] = ''; return $crumbs; } /** * Change functions hooked into woocommerce header. */ private function edit_woocommerce_header() { remove_action( 'woocommerce_archive_description', 'woocommerce_taxonomy_archive_description', 10 ); remove_action( 'woocommerce_archive_description', 'woocommerce_product_archive_description', 10 ); remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20 ); remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20 ); remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 ); add_action( 'nv_woo_header_bits', 'woocommerce_catalog_ordering', 30 ); add_filter( 'woocommerce_show_page_title', '__return_false' ); add_action( 'neve_before_shop_loop_content', array( $this, 'add_header_bits' ), 0 ); // Change breadcrumbs. add_filter( 'woocommerce_get_breadcrumb', array( $this, 'remove_last_breadcrumb' ), 10, 2 ); add_filter( 'woocommerce_breadcrumb_defaults', array( $this, 'change_breadcrumbs_delimiter' ) ); } /** * Add header for woocommerce pages. */ public function add_header_bits() { if ( ! is_shop() && ! is_product() && ! is_product_category() && ! is_product_taxonomy() && ! is_product_tag() ) { return; } echo '
'; woocommerce_breadcrumb(); woocommerce_result_count(); echo '
'; if ( is_product() ) { return; } echo '
'; $this->sidebar_toggle(); do_action( 'nv_woo_header_bits' ); echo '
'; } /** * Handle left shop sidebar. */ public function shop_sidebar_left() { $this->sidebar_manager->sidebar( 'shop', 'left' ); } /** * Handle right shop sidebar. */ public function shop_sidebar_right() { $this->sidebar_manager->sidebar( 'shop', 'right' ); } /** * Close div. */ public function close_div() { echo ''; } /** * Wrap main content start. */ public function wrap_main_content_start() { $before_shop_classes = apply_filters( 'neve_before_shop_classes', 'nv-index-posts nv-shop col' ); echo '
'; do_action( 'neve_before_shop_loop_content' ); } /** * Wrap start of woocommerce pages. */ public function wrap_pages_start() { if ( ! is_woocommerce() ) { return; } echo '
'; echo '
'; } /** * Wrap end of page. */ public function wrap_pages_end() { if ( ! is_woocommerce() ) { return; } $this->close_div(); $this->close_div(); } /** * Render sidebar toggle for responsive view. */ public function sidebar_toggle() { if ( ! $this->should_render_sidebar_toggle() ) { return; } $button_text = apply_filters( 'neve_filter_woo_sidebar_open_button_text', __( 'Filter', 'neve' ) . 'ยป' ); $button_attrs = apply_filters( 'neve_woocommerce_sidebar_filter_btn_data_attrs', '' ); echo '' . esc_html( $button_text ) . ''; } /** * Add inline selectors for woocommerce. */ private function add_inline_selectors() { add_filter( 'neve_link_color_filter', array( $this, 'add_link_color' ) ); add_filter( 'neve_link_hover_color_filter', array( $this, 'add_link_color' ) ); add_filter( 'neve_button_color_filter', array( $this, 'add_button_color' ) ); add_filter( 'neve_menu_items_color_filter', array( $this, 'add_menu_items_color' ) ); add_filter( 'neve_menu_items_hover_color_filter', array( $this, 'add_menu_items_hover_color' ) ); add_filter( 'neve_body_font_family_selectors', array( $this, 'add_font_families' ) ); } /** * Add selectors for menu item color. * * @param array $color_setup the color setup from Neve\Views\Inline\Colors. * * @return mixed */ public function add_menu_items_color( $color_setup ) { $color_setup['color']['selectors'] .= ', .menu-item-nav-cart .cart-count'; return $color_setup; } /** * Add selectors for menu item hover color. * * @param array $color_setup the color setup from Neve\Views\Inline\Colors. * * @return mixed */ public function add_menu_items_hover_color( $color_setup ) { $color_setup['color']['selectors'] .= ', .menu-item-nav-cart:hover .cart-count'; return $color_setup; } /** * Add font family selectors. * * @param string $selectors css selectors to apply body font family to. * * @return string */ public function add_font_families( $selectors ) { $selectors .= ',.cart_totals > h2, .cross-sells > h2, .woocommerce-billing-fields > h3, #order_review_heading, .woocommerce-shipping-fields > h3'; return $selectors; } /** * Add button color colors. * * @param array $color_setup the color setup from Neve\Views\Inline\Colors. * * @return array */ public function add_button_color( $color_setup ) { $color_setup['background']['selectors'] .= ',.woocommerce a.button.alt, .woocommerce a.button.alt:hover, .woocommerce a.button.button-primary, .woocommerce a.button.button-primary:hover, .woocommerce a.button.checkout-button, .woocommerce a.button.checkout-button:hover, .woocommerce button.button:disabled, .woocommerce button.button:disabled:hover, .woocommerce button.button:disabled[disabled], .woocommerce button.button:disabled[disabled]:hover, .woocommerce button.button.alt.single_add_to_cart_button.disabled, .woocommerce button.button.alt.single_add_to_cart_button.disabled:hover, .woocommerce button.button.alt.single_add_to_cart_button, .woocommerce button.button.alt.single_add_to_cart_button:hover, .woocommerce .actions > button[type=submit], .woocommerce .actions > button[type=submit]:hover, .woocommerce .checkout.wc-forward, .woocommerce .checkout.wc-forward:hover, .woocommerce button#place_order, .woocommerce button#place_order:hover, .woocommerce .return-to-shop > .button, .woocommerce .return-to-shop > .button:hover, #nv-primary-navigation .nv-nav-cart a.button.checkout.wc-forward, #nv-primary-navigation .nv-nav-cart a.button.checkout.wc-forward:hover'; return $color_setup; } /** * Add link colors. * * @param array $color_setup the color setup from Neve\Views\Inline\Colors. * * @return array */ public function add_link_color( $color_setup ) { $color_setup['color']['selectors'] .= ''; return $color_setup; } /** * Adapt the meta-box so it works on the shop page. * * @param string $post_id post id. * * @return string */ public function adapt_meta_for_shop_page( $post_id ) { if ( ! is_shop() ) { return $post_id; } return get_option( 'woocommerce_shop_page_id' ); } /** * Check if we should render the mobile sidebar toggle. * * @return bool */ private function should_render_sidebar_toggle() { if ( ! is_active_sidebar( 'shop-sidebar' ) ) { return false; } if ( is_shop() ) { $theme_mod = apply_filters( 'neve_sidebar_position', get_theme_mod( 'neve_shop_archive_sidebar_layout', 'right' ) ); if ( $theme_mod !== 'right' && $theme_mod !== 'left' ) { return false; } } if ( is_product() ) { $theme_mod = apply_filters( 'neve_sidebar_position', get_theme_mod( 'neve_single_product_sidebar_layout', 'right' ) ); if ( $theme_mod !== 'right' && $theme_mod !== 'left' ) { return false; } } return true; } /** * Does what it says. */ private function move_checkout_coupon() { /** * Checkout page * * @see move_coupon() * @see clear_coupon() */ add_action( 'woocommerce_before_checkout_form', array( $this, 'move_coupon' ) ); add_action( 'woocommerce_before_checkout_billing_form', array( $this, 'clear_coupon' ) ); } /** * Checkout page * Move the coupon field and message info after the order table. */ public function move_coupon() { wc_enqueue_js( '$( $( ".woocommerce-checkout div.woocommerce-info, .checkout_coupon, .woocommerce-form-login" ).detach() ).appendTo( "#neve-checkout-coupon" );' ); } /** * Checkout page * Add the id neve-checkout-coupon to be able to Move the coupon field and message info after the order table. */ public function clear_coupon() { echo '
'; } /** * Update the counter of products in cart. * * @param array $fragments WooFragments. * * @return mixed */ public function cart_link_fragment( $fragments ) { $fragments['.cart-icon-wrapper'] = ''; $fragments['.cart-icon-wrapper'] .= neve_cart_icon(); $fragments['.cart-icon-wrapper'] .= '' . __( 'Cart', 'neve' ) . ''; $fragments['.cart-icon-wrapper'] .= '' . WC()->cart->get_cart_contents_count() . ''; $fragments['.cart-icon-wrapper'] .= ''; return $fragments; } }