index of
/
home
/
thefkyzp
/
public_html
/
wp-content
/
themes
/
oceanwp
/
inc
/
woocommerce
/
File: /home/thefkyzp/public_html/wp-content/themes/oceanwp/inc/woocommerce/woocommerce-config.php
<?php /** * Perform all main WooCommerce configurations for this theme * * @package OceanWP WordPress theme */ // Start and run class. if ( ! class_exists( 'OceanWP_WooCommerce_Config' ) ) { class OceanWP_WooCommerce_Config { /** * Instance * * @var $instance */ private static $_instance; /** * Initiator * * @return object */ public static function instance() { if ( ! isset( self::$_instance ) ) { self::$_instance = new self(); } return self::$_instance; } /** * Main Class Constructor * * @since 1.0.0 */ public function __construct() { // Include helper functions. require_once OCEANWP_INC_DIR . 'woocommerce/woocommerce-helpers.php'; // Move default WooCommerce customizer sections to the theme section. add_action( 'customize_register', array( $this, 'woo_section' ), 11 ); // Register Woo sidebar. add_filter( 'widgets_init', array( $this, 'register_woo_sidebar' ) ); if ( ! is_admin() ) { // Remove default wrappers and add new ones. remove_action( 'woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10 ); remove_action( 'woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10 ); add_action( 'woocommerce_before_main_content', array( $this, 'content_wrapper' ), 10 ); add_action( 'woocommerce_after_main_content', array( $this, 'content_wrapper_end' ), 10 ); // Display correct sidebar for products. remove_action( 'woocommerce_sidebar', 'woocommerce_get_sidebar', 10 ); add_filter( 'ocean_get_sidebar', array( $this, 'display_woo_sidebar' ) ); // Set correct post layouts. add_filter( 'ocean_post_layout_class', array( $this, 'layouts' ) ); // Set correct both sidebars layout style. add_filter( 'ocean_both_sidebars_style', array( $this, 'bs_class' ) ); // Set correct mobile sidebar order. add_filter( 'ocean_sidebar_order', array( $this, 'sidebar_order' ) ); } // Woo mini cart style. add_action( 'wp_enqueue_scripts', array( $this, 'mini_cart_style' ) ); // If the custom WooCommerce features are not disabled. if ( 'yes' != get_theme_mod( 'ocean_woo_remove_custom_features', 'no' ) ) { // These filters/actions must run on init. add_action( 'init', array( $this, 'init' ) ); // Pagination. add_action( 'wp', array( $this, 'shop_pagination' ), 999 ); // Body classes. add_filter( 'body_class', array( $this, 'body_class' ) ); // Define accents. add_filter( 'ocean_primary_texts', array( $this, 'primary_texts' ) ); add_filter( 'ocean_primary_svg_icons', array( $this, 'primary_svg_icons' ) ); add_filter( 'ocean_primary_borders', array( $this, 'primary_borders' ) ); add_filter( 'ocean_primary_backgrounds', array( $this, 'primary_backgrounds' ) ); add_filter( 'ocean_hover_primary_backgrounds', array( $this, 'hover_primary_backgrounds' ) ); /* -------------------------------------------------------------------------------*/ /* - Front-End only actions/filters /*-------------------------------------------------------------------------------*/ if ( ! is_admin() ) { // Disable WooCommerce main page title. add_filter( 'woocommerce_show_page_title', '__return_false' ); // Disable WooCommerce css. add_filter( 'woocommerce_enqueue_styles', array( $this, 'disable_woo_css' ) ); // Remove the category description under the page title on taxonomy. add_filter( 'ocean_post_subheading', array( $this, 'post_subheading' ) ); // Show/hide next/prev on products. add_filter( 'ocean_has_next_prev', array( $this, 'next_prev' ) ); // Border colors. add_filter( 'ocean_border_color_elements', array( $this, 'border_color_elements' ) ); } // Main Woo Actions. add_action( 'wp_enqueue_scripts', array( $this, 'add_custom_scripts' ), 99 ); add_filter( 'ocean_localize_array', array( $this, 'localize_array' ) ); if ( get_theme_mod( 'ocean_woo_shop_result_count', true ) || get_theme_mod( 'ocean_woo_shop_sort', true ) || get_theme_mod( 'ocean_woo_grid_list', true ) || true == get_theme_mod( 'ocean_woo_off_canvas_filter', false ) ) { add_action( 'woocommerce_before_shop_loop', array( $this, 'add_shop_loop_div' ) ); } if ( true == get_theme_mod( 'ocean_woo_off_canvas_filter', false ) ) { add_filter( 'widgets_init', array( $this, 'register_off_canvas_sidebar' ) ); add_action( 'wp_footer', array( $this, 'get_off_canvas_sidebar' ) ); add_action( 'woocommerce_before_shop_loop', array( $this, 'off_canvas_filter_button' ), 10 ); } if ( get_theme_mod( 'ocean_woo_grid_list', true ) ) { add_action( 'woocommerce_before_shop_loop', array( $this, 'grid_list_buttons' ), 10 ); } if ( get_theme_mod( 'ocean_woo_shop_result_count', true ) || get_theme_mod( 'ocean_woo_shop_sort', true ) || get_theme_mod( 'ocean_woo_grid_list', true ) || true == get_theme_mod( 'ocean_woo_off_canvas_filter', false ) ) { add_action( 'woocommerce_before_shop_loop', array( $this, 'close_shop_loop_div' ), 40 ); } add_action( 'woocommerce_before_shop_loop_item', array( $this, 'add_shop_loop_item_inner_div' ) ); add_action( 'woocommerce_after_shop_loop_item', array( $this, 'archive_product_content' ), 10 ); add_action( 'woocommerce_after_shop_loop_item', array( $this, 'close_shop_loop_item_inner_div' ) ); add_action( 'woocommerce_before_subcategory_title', array( $this, 'add_container_wrap_category' ), 8 ); add_action( 'woocommerce_before_subcategory_title', array( $this, 'add_div_before_category_thumbnail' ), 9 ); add_action( 'woocommerce_before_subcategory_title', array( $this, 'close_div_after_category_thumbnail' ), 11 ); add_action( 'woocommerce_shop_loop_subcategory_title', array( $this, 'add_div_before_category_title' ), 9 ); add_action( 'woocommerce_shop_loop_subcategory_title', array( $this, 'add_category_description' ), 11 ); add_action( 'woocommerce_shop_loop_subcategory_title', array( $this, 'close_div_after_category_title' ), 12 ); add_action( 'woocommerce_shop_loop_subcategory_title', array( $this, 'close_container_wrap_category' ), 13 ); add_action( 'woocommerce_after_single_product_summary', array( $this, 'clear_summary_floats' ), 1 ); add_action( 'woocommerce_before_account_navigation', array( $this, 'oceanwp_before_account_navigation' ) ); add_action( 'woocommerce_after_account_navigation', array( $this, 'oceanwp_after_account_navigation' ) ); if ( get_option( 'woocommerce_enable_myaccount_registration' ) !== 'yes' ) { add_action( 'woocommerce_before_customer_login_form', array( $this, 'oceanwp_login_wrap_before' ) ); add_action( 'woocommerce_after_customer_login_form', array( $this, 'oceanwp_login_wrap_after' ) ); } if ( get_theme_mod( 'ocean_woo_category_image', 'no' ) == 'yes' ) { add_action( 'woocommerce_archive_description', array( $this, 'woocommerce_category_image' ), 2 ); } // Quick view. if ( get_theme_mod( 'ocean_woo_quick_view', true ) ) { if ( 'hover' != get_theme_mod( 'ocean_woo_products_style', 'default' ) ) { if ( 'gallery-slider' == get_theme_mod( 'ocean_woo_product_entry_style', 'image-swap' ) ) { add_action( 'ocean_after_product_entry_slider', array( $this, 'quick_view_button' ) ); } else { add_action( 'ocean_after_product_entry_image', array( $this, 'quick_view_button' ) ); } } add_action( 'wp_ajax_oceanwp_product_quick_view', array( $this, 'product_quick_view_ajax' ) ); add_action( 'wp_ajax_nopriv_oceanwp_product_quick_view', array( $this, 'product_quick_view_ajax' ) ); add_action( 'wp_footer', array( $this, 'quick_view_template' ) ); add_action( 'ocean_woo_quick_view_product_image', 'woocommerce_show_product_sale_flash', 10 ); add_action( 'ocean_woo_quick_view_product_image', array( $this, 'quick_view_image' ), 20 ); add_action( 'ocean_woo_quick_view_product_content', array( $this, 'single_product_content' ), 10 ); } // Ajax single product add to cart. add_action( 'wp_ajax_oceanwp_add_cart_single_product', array( $this, 'add_cart_single_product_ajax' ) ); add_action( 'wp_ajax_nopriv_oceanwp_add_cart_single_product', array( $this, 'add_cart_single_product_ajax' ) ); // Add cart overlay if ( 'yes' == get_theme_mod( 'ocean_woo_display_cart_product_added', 'no' ) ) { add_action( 'ocean_after_footer', array( $this, 'cart_overlay' ), 99 ); } // Add mobile menu mini cart. if ( get_theme_mod( 'ocean_woo_add_mobile_mini_cart', true ) ) { add_action( 'wp_footer', array( $this, 'get_mini_cart_sidebar' ) ); } // Remove default elements. remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20 ); add_action( 'woocommerce_before_template_part', array( $this, 'before_template_part' ), 10, 4 ); self::remove_elements(); // Remove the single product summary content to add the sortable control. remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_title', 5 ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_rating', 10 ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_excerpt', 20 ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40 ); add_action( 'woocommerce_single_product_summary', array( $this, 'single_product_content' ), 10 ); // Add product navigation. if ( true == get_theme_mod( 'ocean_woocommerce_display_navigation', true ) ) { add_action( 'woocommerce_before_single_product_summary', array( $this, 'product_next_prev_nav' ), 10 ); } // Add floating bar. if ( 'on' == get_theme_mod( 'ocean_woo_display_floating_bar', 'on' ) ) { add_action( 'ocean_before_main', array( $this, 'floating_bar' ) ); // Ajax add to cart. add_action( 'wp_ajax_oceanwp_add_cart_floating_bar', array( $this, 'add_cart_floating_bar_ajax' ) ); add_action( 'wp_ajax_nopriv_oceanwp_add_cart_floating_bar', array( $this, 'add_cart_floating_bar_ajax' ) ); } // Main Woo Filters. add_filter( 'wp_nav_menu_items', array( $this, 'menu_wishlist_icon' ), 10, 2 ); add_filter( 'wp_nav_menu_items', array( $this, 'menu_cart_icon' ), 10, 2 ); add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'menu_cart_icon_fragments' ) ); add_filter( 'woocommerce_general_settings', array( $this, 'remove_general_settings' ) ); add_filter( 'woocommerce_product_settings', array( $this, 'remove_product_settings' ) ); add_filter( 'loop_shop_per_page', array( $this, 'loop_shop_per_page' ), 20 ); add_filter( 'loop_shop_columns', array( $this, 'loop_shop_columns' ) ); add_filter( 'woocommerce_output_related_products_args', array( $this, 'related_product_args' ) ); add_filter( 'woocommerce_pagination_args', array( $this, 'pagination_args' ) ); add_filter( 'woocommerce_continue_shopping_redirect', array( $this, 'continue_shopping_redirect' ) ); add_filter( 'post_class', array( $this, 'add_product_classes' ), 40, 3 ); add_filter( 'post_class', array( $this, 'add_product_class_for_elementor' ) ); add_filter( 'product_cat_class', array( $this, 'product_cat_class' ) ); // Sale badge content. if ( 'percent' == get_theme_mod( 'ocean_woo_sale_badge_content', 'sale' ) ) { add_filter( 'woocommerce_sale_flash', array( $this, 'sale_flash' ), 10, 3 ); } // Add links Login/Register on the my account page. add_action( 'woocommerce_before_customer_login_form', array( $this, 'login_register_links' ) ); // Distraction free cart/checkout. add_filter( 'ocean_display_top_bar', array( $this, 'distraction_free' ), 11 ); add_filter( 'ocean_display_navigation', array( $this, 'distraction_free' ), 11 ); add_filter( 'osh_enable_sticky_header', array( $this, 'distraction_free' ), 11 ); add_filter( 'osp_display_side_panel', array( $this, 'distraction_free' ), 11 ); add_filter( 'ocean_display_page_header', array( $this, 'distraction_free' ), 11 ); add_filter( 'ocean_display_footer_widgets', array( $this, 'distraction_free' ), 11 ); add_filter( 'ocean_display_scroll_up_button', array( $this, 'distraction_free' ), 11 ); add_filter( 'osh_header_sticky_logo', array( $this, 'distraction_free' ), 11 ); add_filter( 'ofc_display_footer_callout', array( $this, 'distraction_free' ), 11 ); // Multi-step checkout. if ( true == get_theme_mod( 'ocean_woo_multi_step_checkout', false ) ) { // Checkout validation. add_action( 'wp_ajax_oceanwp_validate_checkout', array( $this, 'validate_checkout_callback' ) ); add_action( 'wp_ajax_nopriv_oceanwp_validate_checkout', array( $this, 'validate_checkout_callback' ) ); // Add checkout timeline template. add_action( 'woocommerce_before_checkout_form', array( $this, 'checkout_timeline' ), 10 ); // Change checkout template. add_filter( 'woocommerce_locate_template', array( $this, 'multistep_checkout' ), 10, 3 ); // Checkout hack. remove_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 ); remove_action( 'woocommerce_checkout_order_review', 'woocommerce_checkout_payment', 20 ); remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_login_form', 10 ); remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 ); add_action( 'ocean_woocommerce_checkout_order_review', 'woocommerce_order_review', 10 ); add_action( 'ocean_woocommerce_checkout_payment', 'woocommerce_checkout_payment', 20 ); add_action( 'ocean_checkout_login_form', array( $this, 'checkout_login_form' ), 10 ); add_action( 'ocean_woocommerce_checkout_coupon', 'woocommerce_checkout_coupon_form', 10 ); // Prevent empty shipping tab. add_filter( 'woocommerce_enable_order_notes_field', '__return_true' ); // Support to WooCommerce secure submit gateway. if ( class_exists( 'WC_Gateway_SecureSubmit' ) ) { $secure_submit_options = get_option( 'woocommerce_securesubmit_settings' ); if ( ! empty( $secure_submit_options['use_iframes'] ) && 'yes' == $secure_submit_options['use_iframes'] ) { add_filter( 'option_woocommerce_securesubmit_settings', array( $this, 'woocommerce_securesubmit_support' ), 10, 2 ); } } } // Add new typography settings. add_filter( 'ocean_typography_settings', array( $this, 'typography_settings' ) ); // WooCommerce Match Box extension single product layout support. add_action( 'woocommerce_match_box_single_product_layout', array( $this, 'remove_wc_match_box_single_product_summary' ), 10 ); } } // End __construct. /* -------------------------------------------------------------------------------*/ /* - Start Class Functions /*-------------------------------------------------------------------------------*/ /** * Move default WooCommerce customizer sections to the theme section. * * @since 1.5.0 */ public static function woo_section( $wp_customize ) { $wp_customize->get_section( 'woocommerce_checkout' )->panel = 'ocean_woocommerce_panel'; $wp_customize->get_section( 'woocommerce_store_notice' )->panel = 'ocean_woocommerce_panel'; $wp_customize->get_section( 'woocommerce_product_images' )->panel = 'ocean_woocommerce_panel'; $wp_customize->get_section( 'woocommerce_product_images' )->priority = 999; $wp_customize->get_control( 'woocommerce_shop_page_display' )->section = 'ocean_woocommerce_archives'; $wp_customize->get_control( 'woocommerce_category_archive_display' )->section = 'ocean_woocommerce_archives'; $wp_customize->get_control( 'woocommerce_default_catalog_orderby' )->section = 'ocean_woocommerce_archives'; $wp_customize->get_control( 'woocommerce_checkout_company_field' )->section = 'ocean_woocommerce_checkout'; $wp_customize->get_control( 'woocommerce_checkout_address_2_field' )->section = 'ocean_woocommerce_checkout'; $wp_customize->get_control( 'woocommerce_checkout_phone_field' )->section = 'ocean_woocommerce_checkout'; $wp_customize->get_control( 'woocommerce_checkout_highlight_required_fields' )->section = 'ocean_woocommerce_checkout'; if ( current_user_can( 'manage_privacy_options' ) ) { $wp_customize->get_control( 'wp_page_for_privacy_policy' )->section = 'ocean_woocommerce_checkout'; } $wp_customize->get_control( 'woocommerce_terms_page_id' )->section = 'ocean_woocommerce_checkout'; $wp_customize->get_control( 'woocommerce_checkout_privacy_policy_text' )->section = 'ocean_woocommerce_checkout'; $wp_customize->get_control( 'woocommerce_checkout_terms_and_conditions_checkbox_text' )->section = 'ocean_woocommerce_checkout'; } /** * Content wrapper. * * @since 1.4.7 */ public static function content_wrapper() { get_template_part( 'woocommerce/wc-content-wrapper' ); } /** * Content wrapper end. * * @since 1.4.7 */ public static function content_wrapper_end() { get_template_part( 'woocommerce/wc-content-wrapper-end' ); } /** * Register new WooCommerce sidebar. * * @since 1.0.0 */ public static function register_woo_sidebar() { // Return if custom sidebar disabled. if ( ! get_theme_mod( 'ocean_woo_custom_sidebar', true ) ) { return; } // Register new woo_sidebar widget area. register_sidebar( array( 'name' => esc_html__( 'WooCommerce Sidebar', 'oceanwp' ), 'id' => 'woo_sidebar', 'before_widget' => '<div id="%1$s" class="sidebar-box %2$s clr">', 'after_widget' => '</div>', 'before_title' => '<h4 class="widget-title">', 'after_title' => '</h4>', ) ); } /** * Display WooCommerce sidebar. * * @since 1.0.0 */ public static function display_woo_sidebar( $sidebar ) { // Alter sidebar display to show woo_sidebar where needed. if ( get_theme_mod( 'ocean_woo_custom_sidebar', true ) && is_active_sidebar( 'woo_sidebar' ) && is_woocommerce() ) { $sidebar = 'woo_sidebar'; } // Return correct sidebar return $sidebar; } /** * Tweaks the post layouts for WooCommerce archives and single product posts. * * @since 1.0.0 */ public static function layouts( $class ) { if ( oceanwp_is_woo_shop() || oceanwp_is_woo_tax() ) { $class = get_theme_mod( 'ocean_woo_shop_layout', 'left-sidebar' ); } elseif ( oceanwp_is_woo_single() ) { $class = get_theme_mod( 'ocean_woo_product_layout', 'left-sidebar' ); } return $class; } /** * Set correct both sidebars layout style. * * @since 1.4.0 */ public static function bs_class( $class ) { if ( oceanwp_is_woo_shop() || oceanwp_is_woo_tax() ) { $class = get_theme_mod( 'ocean_woo_shop_both_sidebars_style', 'scs-style' ); } elseif ( oceanwp_is_woo_single() ) { $class = get_theme_mod( 'ocean_woo_product_both_sidebars_style', 'scs-style' ); } return $class; } /** * Set correct mobile sidebar order. * * @since 1.6 */ public static function sidebar_order( $order ) { if ( oceanwp_is_woo_shop() || oceanwp_is_woo_tax() ) { $order = get_theme_mod( 'ocean_woo_shop_sidebar_order', 'content-sidebar' ); } elseif ( oceanwp_is_woo_single() ) { $order = get_theme_mod( 'ocean_woo_product_sidebar_order', 'content-sidebar' ); } return $order; } /** * Mini cart style. * * @since 1.0.0 */ public static function mini_cart_style() { // Register WooCommerce styles. wp_enqueue_style( 'oceanwp-woo-mini-cart', OCEANWP_CSS_DIR_URI . 'woo/woo-mini-cart.min.css' ); // If rtl. if ( is_RTL() ) { wp_enqueue_style( 'oceanwp-woo-mini-cart-rtl', OCEANWP_CSS_DIR_URI . 'woo/woo-mini-cart-rtl.css' ); } } /** * Runs on Init. * You can't remove certain actions in the constructor because it's too early. * * @since 1.0.0 */ public function init() { // Remove WooCommerce breadcrumbs. remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20, 0 ); // Alter upsells display. remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 ); if ( '0' != get_theme_mod( 'ocean_woocommerce_upsells_count', '3' ) ) { add_action( 'woocommerce_after_single_product_summary', array( $this, 'upsell_display' ), 15 ); } // Alter cross-sells display. remove_action( 'woocommerce_cart_collaterals', 'woocommerce_cross_sell_display' ); if ( '0' != get_theme_mod( 'ocean_woocommerce_cross_sells_count', '2' ) ) { add_action( 'woocommerce_cart_collaterals', array( $this, 'cross_sell_display' ) ); } // Add product thumbnail. if ( 'hover' != get_theme_mod( 'ocean_woo_products_style', 'default' ) ) { add_action( 'woocommerce_before_shop_loop_item_title', array( $this, 'loop_product_thumbnail' ), 10 ); } // Remove related products if is set to no. if ( 'on' != get_theme_mod( 'ocean_woocommerce_display_related_items', 'on' ) ) { remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 ); } // Remove orderby if disabled. if ( ! get_theme_mod( 'ocean_woo_shop_sort', true ) ) { remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 ); } // Add result count if not disabled. if ( get_theme_mod( 'ocean_woo_shop_result_count', true ) ) { add_action( 'woocommerce_before_shop_loop', array( $this, 'result_count' ), 31 ); } if ( defined( 'ELEMENTOR_WOOSTORE__FILE__' ) ) { remove_action( 'woocommerce_after_shop_loop_item_title', 'woostore_output_product_excerpt', 35 ); add_action( 'woocommerce_after_shop_loop_item', 'woostore_output_product_excerpt', 21 ); } if ( ! function_exists( 'yith_wcbm_shop_badge_container_start' ) && ! function_exists( 'yith_wcbm_shop_badge_container_end' ) ) { add_action( 'woocommerce_before_shop_loop_item_title', array( $this, 'yith_wcbm_shop_badge_container_start' ), 9 ); add_action( 'woocommerce_before_shop_loop_item_title', array( $this, 'yith_wcbm_shop_badge_container_end' ), 20 ); } if ( class_exists( 'WooCommerce_Germanized' ) ) { // Product entries. remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_delivery_time_info', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_delivery_time_info', 8 ) ); remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_gzd_template_loop_price_unit', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_price_unit', 11 ) ); remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_product_units', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_product_units', 9 ) ); remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_shipping_costs_info', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_shipping_costs_info', 7 ) ); remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_tax_info', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_after_shop_loop_item', 'woocommerce_gzd_template_loop_tax_info', 6 ) ); add_action( 'ocean_after_archive_product_inner', array( $this, 'woocommerce_germanized' ) ); // Single product. remove_action( 'woocommerce_single_product_summary', 'woocommerce_gzd_template_single_price_unit', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_single_product_summary', 'woocommerce_gzd_template_single_price_unit', 11 ) ); remove_action( 'woocommerce_single_product_summary', 'woocommerce_gzd_template_single_legal_info', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_single_product_summary', 'woocommerce_gzd_template_single_legal_info', 12 ) ); add_action( 'ocean_after_single_product_price', array( $this, 'woocommerce_germanized_single' ), 12 ); // Single product product units and delivery time info. remove_action( 'woocommerce_single_product_summary', 'woocommerce_gzd_template_single_delivery_time_info', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_single_product_summary', 'woocommerce_gzd_template_single_delivery_time_info', 27 ) ); remove_action( 'woocommerce_product_meta_start', 'woocommerce_gzd_template_single_product_units', WC_GZD_Hook_Priorities::instance()->get_priority( 'woocommerce_single_product_summary', 'woocommerce_gzd_template_single_product_units', 5 ) ); add_action( 'ocean_after_single_product_excerpt', array( $this, 'woocommerce_germanized_single_meta' ), 12 ); } if ( class_exists( 'YITH_WCWL' ) ) { add_action( 'wp_enqueue_scripts', 'ocean_dequeue_yith_wl_scripts' ); add_filter( 'yith_wcwl_button_label', 'owp_yith_wishlist_button_label' ); add_filter( 'yith_wcwl_browse_wishlist_label', 'owp_yith_wishlist_browse_button_label' ); } if ( class_exists( 'SitePress' ) ) { add_filter( 'wcml_multi_currency_ajax_actions', array( $this, 'add_action_to_multi_currency_ajax' ), 10, 1 ); } } /** * Add action to multi currency ajax. * * @param array $ajax_actions The ajax actions. * @since 3.0.0 */ public function add_action_to_multi_currency_ajax( $ajax_actions ) { $ajax_actions[] = 'oceanwp_product_quick_view'; return $ajax_actions; } /** * Remove elements. * * @since 1.0.0 */ public function remove_elements() { 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', 5 ); remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_show_product_loop_sale_flash', 10 ); remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 ); remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 ); remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 ); remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 ); } /** * Fix the issue in the Elementor Pro editor. * * @since 1.5.19 */ public function before_template_part( $template_name, $template_path, $located, $args ) { if ( class_exists( 'Elementor\Plugin' ) && \Elementor\Plugin::$instance->editor->is_edit_mode() ) { self::remove_elements(); } } /** * Pagination. * * @since 1.4.16 */ public function shop_pagination() { if ( 'infinite_scroll' == get_theme_mod( 'ocean_woo_pagination_style', 'standard' ) && is_woocommerce() ) { remove_action( 'woocommerce_after_shop_loop', 'woocommerce_pagination', 10 ); add_action( 'woocommerce_after_shop_loop', array( $this, 'infinite_pagination' ), 10 ); } } /** * Infinite scroll pagination. * * @since 1.4.16 */ public static function infinite_pagination() { global $wp_query; if ( $wp_query->max_num_pages <= 1 ) { return; } // Last text. $last = get_theme_mod( 'ocean_woo_infinite_scroll_last_text' ); $last = oceanwp_tm_translation( 'ocean_woo_infinite_scroll_last_text', $last ); $last = $last ? $last : esc_html__( 'End of content', 'oceanwp' ); // Error text. $error = get_theme_mod( 'ocean_woo_infinite_scroll_error_text' ); $error = oceanwp_tm_translation( 'ocean_woo_infinite_scroll_error_text', $error ); $error = $error ? $error : esc_html__( 'No more pages to load', 'oceanwp' ); // Output pagination HTML. ?> <div class="scroller-status"> <div class="loader-ellips infinite-scroll-request"> <span class="loader-ellips__dot"></span> <span class="loader-ellips__dot"></span> <span class="loader-ellips__dot"></span> <span class="loader-ellips__dot"></span> </div> <p class="scroller-status__message infinite-scroll-last"><?php echo esc_html( $last ); ?></p> <p class="scroller-status__message infinite-scroll-error"><?php echo esc_html( $error ); ?></p> </div> <div class="infinite-scroll-nav clr"> <div class="alignleft newer-posts"><?php echo get_previous_posts_link( '← ' . esc_html__( 'Newer Posts', 'oceanwp' ) ); ?></div> <div class="alignright older-posts"><?php echo get_next_posts_link( esc_html__( 'Older Posts', 'oceanwp' ) . ' →', $wp_query->max_num_pages ); ?></div> </div> <?php } /** * Helper method to get the version of the currently installed WooCommerce. * * @since 1.1.7 * @return string woocommerce version number or null. */ public static function get_wc_version() { return defined( 'WC_VERSION' ) && WC_VERSION ? WC_VERSION : null; } /** * Remove general settings from Woo Admin panel. * * @since 1.0.0 */ public static function remove_general_settings( $settings ) { $remove = array( 'woocommerce_enable_lightbox' ); foreach ( $settings as $key => $val ) { if ( isset( $val['id'] ) && in_array( $val['id'], $remove ) ) { unset( $settings[ $key ] ); } } return $settings; } /** * Remove product settings from Woo Admin panel. * * @since 1.0.0 */ public static function remove_product_settings( $settings ) { $remove = array( 'woocommerce_enable_lightbox', ); foreach ( $settings as $key => $val ) { if ( isset( $val['id'] ) && in_array( $val['id'], $remove ) ) { unset( $settings[ $key ] ); } } return $settings; } /** * Body classes * * @since 1.5.0 */ public static function body_class( $classes ) { // If dropdown categories widget style if ( 'dropdown' == get_theme_mod( 'ocean_woo_cat_widget_style', 'default' ) ) { $classes[] = 'woo-dropdown-cat'; } // Distraction free class. if ( ( is_cart() && true == get_theme_mod( 'ocean_woo_distraction_free_cart', false ) ) || ( is_checkout() && true == get_theme_mod( 'ocean_woo_distraction_free_checkout', false ) ) ) { $classes[] = 'distraction-free'; } // My Account page style. $style = get_theme_mod( 'ocean_woo_account_page_style', 'original' ); if ( 'side' == $style ) { $classes[] = 'account-side-style'; } else { $classes[] = 'account-original-style'; } // Return. return $classes; } /** * Add Custom WooCommerce scripts. * * @since 1.0.0 */ public static function add_custom_scripts() { $active_status = true; if ( class_exists( 'Ocean_eCommerce' ) ) { if ( function_exists( 'oec_get_theme_version' ) ) { $active_status = oec_get_theme_version(); } } if ( ! class_exists( 'Ocean_eCommerce' ) || true === $active_status ) { // Register WooCommerce styles wp_enqueue_style( 'oceanwp-woocommerce', OCEANWP_CSS_DIR_URI . 'woo/woocommerce.min.css' ); wp_enqueue_style( 'oceanwp-woo-star-font', OCEANWP_CSS_DIR_URI . 'woo/woo-star-font.min.css' ); // If rtl if ( is_RTL() ) { wp_enqueue_style( 'oceanwp-woocommerce-rtl', OCEANWP_CSS_DIR_URI . 'woo/woocommerce-rtl.css' ); } // If products hover style if ( 'hover' == get_theme_mod( 'ocean_woo_products_style', 'default' ) ) { wp_enqueue_style( 'oceanwp-woo-hover-style', OCEANWP_CSS_DIR_URI . 'woo/hover-style.min.css' ); } // If quick view. if ( get_theme_mod( 'ocean_woo_quick_view', true ) ) { wp_enqueue_style( 'oceanwp-woo-quick-view', OCEANWP_CSS_DIR_URI . 'woo/woo-quick-view.min.css' ); } // If whislist. if ( class_exists( 'TInvWL_Wishlist' ) || class_exists( 'YITH_WCWL' ) ) { wp_enqueue_style( 'oceanwp-wishlist', OCEANWP_CSS_DIR_URI . 'woo/wishlist.min.css' ); } // If floating bar if ( 'on' == get_theme_mod( 'ocean_woo_display_floating_bar', 'on' ) && oceanwp_is_woo_single() ) { wp_enqueue_style( 'oceanwp-woo-floating-bar', OCEANWP_CSS_DIR_URI . 'woo/woo-floating-bar.min.css' ); } // If multi step checkout if ( true == get_theme_mod( 'ocean_woo_multi_step_checkout', false ) && is_checkout() ) { wp_enqueue_style( 'oceanwp-woo-multistep-checkout', OCEANWP_CSS_DIR_URI . 'woo/woo-multistep-checkout.min.css' ); } } // If products hover style if ( 'hover' == get_theme_mod( 'ocean_woo_products_style', 'default' ) ) { wp_enqueue_script( 'oceanwp-woo-hover-style', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-hover-style.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If dropdown category widget style if ( 'dropdown' == get_theme_mod( 'ocean_woo_cat_widget_style', 'default' ) ) { wp_enqueue_script( 'oceanwp-woo-cat-widget', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-cat-widget.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If vertical thumbnails style if ( 'vertical' == get_theme_mod( 'ocean_woo_product_thumbs_layout', 'horizontal' ) ) { wp_enqueue_script( 'oceanwp-woo-thumbnails', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-thumbnails.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If quick view. if ( get_theme_mod( 'ocean_woo_quick_view', true ) ) { wp_enqueue_script( 'oceanwp-woo-quick-view', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-quick-view.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); wp_enqueue_script( 'wc-add-to-cart-variation' ); wp_enqueue_script( 'flexslider' ); } // If single product ajax add to cart if ( true == get_theme_mod( 'ocean_woo_product_ajax_add_to_cart', false ) && oceanwp_is_woo_single() ) { wp_enqueue_script( 'oceanwp-woo-ajax-addtocart', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-ajax-add-to-cart.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If floating bar if ( 'on' == get_theme_mod( 'ocean_woo_display_floating_bar', 'on' ) && oceanwp_is_woo_single() ) { wp_enqueue_script( 'oceanwp-woo-floating-bar', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-floating-bar.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If display cart when product added if ( 'yes' == get_theme_mod( 'ocean_woo_display_cart_product_added', 'no' ) ) { wp_enqueue_script( 'oceanwp-woo-display-cart', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-display-cart.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If off canvas filter if ( true == get_theme_mod( 'ocean_woo_off_canvas_filter', false ) && ( oceanwp_is_woo_shop() || oceanwp_is_woo_tax() ) ) { wp_enqueue_script( 'oceanwp-woo-off-canvas', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-off-canvas.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If mobile menu mini cart if ( get_theme_mod( 'ocean_woo_add_mobile_mini_cart', true ) ) { wp_enqueue_script( 'oceanwp-woo-mini-cart', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-mini-cart.min.js', array( 'oceanwp-main' ), OCEANWP_THEME_VERSION, true ); } // If multi step checkout if ( true == get_theme_mod( 'ocean_woo_multi_step_checkout', false ) && is_checkout() ) { $woo_deps = array( 'wc-checkout', 'wc-country-select' ); if ( class_exists( 'WC_Ship_Multiple' ) ) { $woo_deps[] = 'wcms-country-select'; } wp_enqueue_script( 'oceanwp-woo-multistep-checkout', OCEANWP_JS_DIR_URI . 'wp-plugins/woocommerce/woo-multi-step-checkout.min.js', $woo_deps, OCEANWP_THEME_VERSION, true ); } // The Cart Fragments script. wp_enqueue_script( 'wc-cart-fragments' ); } /** * Localize array. * * @since 1.5.0 */ public static function localize_array( $array ) { // If single product ajax add to cart if ( true == get_theme_mod( 'ocean_woo_product_ajax_add_to_cart', false ) ) { $array['is_cart'] = is_cart(); $array['cart_url'] = apply_filters( 'ocean_woocommerce_add_to_cart_redirect', wc_get_cart_url() ); } // If multi step checkout if ( true == get_theme_mod( 'ocean_woo_multi_step_checkout', false ) ) { $array['ajax_url'] = admin_url( 'admin-ajax.php' ); $array['login_reminder_enabled'] = 'yes' == get_option( 'woocommerce_enable_checkout_login_reminder', 'yes' ) ? true : false; $array['is_logged_in'] = is_user_logged_in(); $array['no_account_btn'] = esc_html__( 'I don’t have an account', 'oceanwp' ); $array['next'] = esc_html__( 'Next', 'oceanwp' ); } // If quick view, ajax add to cart or floating bar if ( get_theme_mod( 'ocean_woo_quick_view', true ) || true == get_theme_mod( 'ocean_woo_product_ajax_add_to_cart', false ) || 'on' == get_theme_mod( 'ocean_woo_display_floating_bar', 'on' ) ) { $array['ajax_url'] = admin_url( 'admin-ajax.php' ); $array['cart_url'] = apply_filters( 'woocommerce_add_to_cart_redirect', wc_get_cart_url(), null ); $array['cart_redirect_after_add'] = get_option( 'woocommerce_cart_redirect_after_add' ); } // Add the View Cart here to avoid the undefined word on the related products $array['view_cart'] = esc_html__( 'View cart', 'oceanwp' ); // Check if the floating bar is enabled for the quantity button $array['floating_bar'] = get_theme_mod( 'ocean_woo_display_floating_bar', 'on' ); // Grouped product button text in the quick view $array['grouped_text'] = esc_html__( 'View products', 'oceanwp' ); $array['multistep_checkout_error'] = __( 'Some required fields are empty. Please fill the required fields to go to the next step.', 'oceanwp' ); return $array; } /** * Single Product add to cart ajax request. * * @since 1.5.0 */ public static function add_cart_single_product_ajax() { $product_id = sanitize_text_field( $_POST['product_id'] ); $variation_id = sanitize_text_field( $_POST['variation_id'] ); $variation = $_POST['variation']; $quantity = sanitize_text_field( $_POST['quantity'] ); if ( $variation_id ) { WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation ); } else { WC()->cart->add_to_cart( $product_id, $quantity ); } die(); } /** * Add cart overlay. * * @since 1.5.0 */ public static function cart_overlay() { ?> <div class="owp-cart-overlay"></div> <?php } /** * Get mini cart sidebar. * * @since 1.5.0 */ public static function get_mini_cart_sidebar() { // Style $cart_style = get_theme_mod( 'ocean_woo_cart_dropdown_style', 'compact' ); // Define classes $classes = array( 'oceanwp-cart-sidebar' ); // Cart style if ( 'compact' != $cart_style ) { $classes[] = $cart_style; } // Turn classes into string $classes = implode( ' ', $classes ); echo '<div id="oceanwp-cart-sidebar-wrap">'; echo '<div class="' . $classes . '">'; echo '<a href="#" class="oceanwp-cart-close">×</a>'; echo '<p class="owp-cart-title">' . esc_html__( 'Cart', 'oceanwp' ) . '</p><div class="divider"></div>'; echo '<div class="owp-mini-cart">'; the_widget( 'WC_Widget_Cart', 'title=' ); echo '</div>'; echo '</div>'; echo '<div class="oceanwp-cart-sidebar-overlay"></div>'; echo '</div>'; } /** * Adds an opening div "oceanwp-toolbar" around top elements. * * @since 1.1.1 */ public static function add_shop_loop_div() { echo '<div class="oceanwp-toolbar clr">'; } /** * Register off canvas filter sidebar. * * @since 1.5.0 */ public static function register_off_canvas_sidebar() { register_sidebar( array( 'name' => esc_html__( 'Off-Canvas Filters', 'oceanwp' ), 'description' => esc_html__( 'Widgets in this area are used in the off canvas sidebar. To enable the Off Canvas filter, go to the WooCommerce > Archives section of the customizer and enable the Display Filter Button option.', 'oceanwp' ), 'id' => 'owp_off_canvas_sidebar', 'before_widget' => '<div id="%1$s" class="sidebar-box %2$s clr">', 'after_widget' => '</div>', 'before_title' => '<h4 class="widget-title">', 'after_title' => '</h4>', ) ); } /** * Get Off Canvas Sidebar. * * @since 1.5.0 */ public static function get_off_canvas_sidebar() { // Return if is not in shop page if ( ! oceanwp_is_woo_shop() && ! oceanwp_is_woo_tax() ) { return; } if ( function_exists( 'wc_get_template' ) ) { wc_get_template( 'owp-off-canvas-sidebar.php' ); } } /** * Add off canvas filter button. * * @since 1.5.0 */ public static function off_canvas_filter_button() { // Return if is not in shop page if ( ! oceanwp_is_woo_shop() && ! oceanwp_is_woo_tax() ) { return; } // Get filter text $text = get_theme_mod( 'ocean_woo_off_canvas_filter_text' ); $text = oceanwp_tm_translation( 'ocean_woo_off_canvas_filter_text', $text ); $text = $text ? $text : esc_html__( 'Filter', 'oceanwp' ); $output = '<a href="#" class="oceanwp-off-canvas-filter">' . oceanwp_icon( 'menu', false ) . '<span class="off-canvas-filter-text">' . esc_html( $text ) . '</span></a>'; echo apply_filters( 'oceanwp_off_canvas_filter_button_output', $output ); } /** * Add grid/list buttons. * * @since 1.1.1 */ public static function grid_list_buttons() { // Return if is not in shop page if ( ! oceanwp_is_woo_shop() && ! oceanwp_is_woo_tax() ) { return; } // Titles $grid_view = esc_html__( 'Grid view', 'oceanwp' ); $list_view = esc_html__( 'List view', 'oceanwp' ); // Active class if ( 'list' == get_theme_mod( 'ocean_woo_catalog_view', 'grid' ) ) { $list = 'active '; $grid = ''; } else { $grid = 'active '; $list = ''; } $grid_view_icon = oceanwp_icon( 'grid', false ); $list_view_icon = oceanwp_icon( 'list', false ); $output = '<nav class="oceanwp-grid-list"><a href="#" id="oceanwp-grid" title="' . esc_html( $grid_view ) . '" class="' . esc_attr( $grid ) . ' grid-btn">' . $grid_view_icon . '</a><a href="#" id="oceanwp-list" title="' . esc_html( $list_view ) . '" class="' . esc_attr( $list ) . ' list-btn">' . $list_view_icon . '</a></nav>'; echo apply_filters( 'oceanwp_grid_list_buttons_output', $output ); } /** * Closes the opening div "oceanwp-toolbar" around top elements. * * @since 1.1.1 */ public static function close_shop_loop_div() { echo '</div>'; } /** * Add result count. * * @since 1.1.1 */ public static function result_count() { // Return if is not in shop page if ( ( ! oceanwp_is_woo_shop() && ! is_product_category() && ! is_product_tag() && ! ocean_is_wc_attribute() ) || is_search() ) { return; } get_template_part( 'woocommerce/result-count' ); } /** * Returns correct posts per page for the shop * * @since 1.0.0 */ public static function loop_shop_per_page() { if ( get_theme_mod( 'ocean_woo_shop_result_count', true ) ) { $posts_per_page = ( isset( $_GET['products-per-page'] ) ) ? sanitize_text_field( wp_unslash( $_GET['products-per-page'] ) ) : get_theme_mod( 'ocean_woo_shop_posts_per_page', '12' ); if ( $posts_per_page == 'all' ) { $posts_per_page = wp_count_posts( 'product' )->publish; } } else { $posts_per_page = get_theme_mod( 'ocean_woo_shop_posts_per_page' ); $posts_per_page = $posts_per_page ? $posts_per_page : '12'; } return $posts_per_page; } /** * Change products per row for the main shop. * * @since 1.0.0 */ public static function loop_shop_columns() { $columns = get_theme_mod( 'ocean_woocommerce_shop_columns', '3' ); $columns = $columns ? $columns : '3'; return $columns; } /** * Change products per row for upsells. * * @since 1.0.0 */ public static function upsell_display() { // Get count $count = get_theme_mod( 'ocean_woocommerce_upsells_count', '3' ); $count = $count ? $count : '3'; // Get columns $columns = get_theme_mod( 'ocean_woocommerce_upsells_columns', '3' ); $columns = $columns ? $columns : '3'; // Alter upsell display woocommerce_upsell_display( $count, $columns ); } /** * Change products per row for crossells. * * @since 1.0.0 */ public static function cross_sell_display() { // Get count $count = get_theme_mod( 'ocean_woocommerce_cross_sells_count', '2' ); $count = $count ? $count : '2'; // Get columns $columns = get_theme_mod( 'ocean_woocommerce_cross_sells_columns', '2' ); $columns = $columns ? $columns : '2'; // Alter cross-sell display woocommerce_cross_sell_display( $count, $columns ); } /** * Alter the related product arguments. * * @since 1.0.0 */ public static function related_product_args() { // Get global vars global $product, $orderby, $related; // Get posts per page $posts_per_page = get_theme_mod( 'ocean_woocommerce_related_count', '3' ); $posts_per_page = $posts_per_page ? $posts_per_page : '3'; // Get columns $columns = get_theme_mod( 'ocean_woocommerce_related_columns', '3' ); $columns = $columns ? $columns : '3'; // Return array return array( 'posts_per_page' => $posts_per_page, 'columns' => $columns, ); } /** * Adds an opening div "product-inner" around product entries. * * @since 1.0.0 */ public static function add_shop_loop_item_inner_div() { echo '<div class="product-inner clr">'; } /** * Adds an out of stock tag to the products. * * @since 1.0.0 */ public static function add_out_of_stock_badge() { if ( function_exists( 'oceanwp_woo_product_instock' ) && ! oceanwp_woo_product_instock() ) { $label = esc_html__( 'Out of Stock', 'oceanwp' ); ?> <div class="outofstock-badge"> <?php echo esc_html( apply_filters( 'ocean_woo_outofstock_text', $label ) ); ?> </div><!-- .product-entry-out-of-stock-badge --> <?php } } /** * Returns our product thumbnail from our template parts based on selected style in theme mods. * * @since 1.0.0 */ public static function loop_product_thumbnail() { if ( function_exists( 'wc_get_template' ) ) { // Get entry product media style $style = get_theme_mod( 'ocean_woo_product_entry_style' ); $style = $style ? $style : 'image-swap'; // Get entry product media template part wc_get_template( 'loop/thumbnail/' . $style . '.php' ); } } /** * Archive product content. * * @since 1.1.4 */ public static function archive_product_content() { if ( function_exists( 'wc_get_template' ) ) { if ( 'hover' == get_theme_mod( 'ocean_woo_products_style', 'default' ) ) { wc_get_template( 'owp-archive-product-hover.php' ); } else { wc_get_template( 'owp-archive-product.php' ); } } } /** * Closes the "product-inner" div around product entries. * * @since 1.0.0 */ public static function close_shop_loop_item_inner_div() { echo '</div><!-- .product-inner .clr -->'; } /** * Quick view button. * * @since 1.5.0 */ public static function quick_view_button() { global $product; $button = '<a href="#" id="product_id_' . $product->get_id() . '" class="owp-quick-view" data-product_id="' . $product->get_id() . '" aria-label="' . esc_attr__( 'Quickly preview product', 'oceanwp' ) . ' ' . $product->get_name() . '">' . oceanwp_icon( 'eye', false ) . ' ' . esc_html( oceanwp_theme_strings( 'owp-string-woo-quick-view-text', false ) ) . '</a>'; echo apply_filters( 'ocean_woo_quick_view_button_html', $button ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** * Quick view ajax. * * @since 1.5.0 */ public static function product_quick_view_ajax() { if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'oceanwp' ) ) { wp_die(); } if ( ! isset( $_POST['product_id'] ) ) { wp_die(); } $product_id = intval( $_POST['product_id'] ); // wp_query for the product. wp( 'p=' . $product_id . '&post_type=product' ); ob_start(); get_template_part( 'woocommerce/quick-view-content' ); $output = ob_get_clean(); echo wp_json_encode( array( 'output' => $output ) ); wp_die(); } /** * Quick view template. * * @since 1.5.0 */ public static function quick_view_template() { get_template_part( 'woocommerce/quick-view' ); } /** * Quick view image. * * @since 1.5.0 */ public static function quick_view_image() { get_template_part( 'woocommerce/quick-view-image' ); } /** * Clear floats after single product summary. * * @since 1.0.0 */ public static function clear_summary_floats() { echo '<div class="clear-after-summary clr"></div>'; } /** * Single product content. * * @since 1.1.9 */ public static function single_product_content() { if ( function_exists( 'wc_get_template' ) ) { wc_get_template( 'owp-single-product.php' ); } } /** * Add product navigation. * * @since 1.5.0 */ public static function product_next_prev_nav() { global $post; $next_post = get_next_post( true, '', 'product_cat' ); $prev_post = get_previous_post( true, '', 'product_cat' ); $ocean_next_prev_prod_content = ''; if ( is_a( $prev_post, 'WP_Post' ) ) { $next_arrow = is_rtl() ? oceanwp_icon( 'angle_right', false ) : oceanwp_icon( 'angle_left', false ); ob_start(); ?> <li class="prev-li"> <a href="<?php echo esc_url( get_the_permalink( $prev_post->ID ) ); ?>" class="owp-nav-link prev" rel="next" aria-label="<?php echo esc_attr( oceanwp_theme_strings( 'owp-string-wai-prev-product', false ) ); ?>"><?php echo $next_arrow; ?></a> <a href="<?php echo esc_url( get_the_permalink( $prev_post->ID ) ); ?>" class="owp-nav-text prev-text"><?php echo esc_html( oceanwp_theme_strings( 'owp-string-woo-nav-prev-product', false ) ); ?></a> <div class="owp-nav-thumb"> <a title="<?php echo esc_attr( get_the_title( $prev_post->ID ) ); ?>" href="<?php echo esc_url( get_the_permalink( $prev_post->ID ) ); ?>"><?php echo get_the_post_thumbnail( $prev_post->ID, apply_filters( 'single_product_small_thumbnail_size', 'shop_thumbnail' ) ); ?></a> </div> </li> <?php $ocean_next_prev_prod_content .= ob_get_clean(); } if ( is_a( $next_post, 'WP_Post' ) ) { $prev_arrow = is_rtl() ? oceanwp_icon( 'angle_left', false ) : oceanwp_icon( 'angle_right', false ); ob_start(); ?> <li class="next-li"> <a href="<?php echo esc_url( get_the_permalink( $next_post->ID ) ); ?>" class="owp-nav-text next-text"><?php echo esc_html( oceanwp_theme_strings( 'owp-string-woo-nav-next-product', false ) ); ?></a> <a href="<?php echo esc_url( get_the_permalink( $next_post->ID ) ); ?>" class="owp-nav-link next" rel="next" aria-label="<?php echo esc_attr( oceanwp_theme_strings( 'owp-string-wai-next-product', false ) ); ?>"><?php echo $prev_arrow; ?></i></a> <div class="owp-nav-thumb"> <a title="<?php echo esc_attr( get_the_title( $next_post->ID ) ); ?>" href="<?php echo esc_url( get_the_permalink( $next_post->ID ) ); ?>"><?php echo get_the_post_thumbnail( $next_post->ID, apply_filters( 'single_product_small_thumbnail_size', 'shop_thumbnail' ) ); ?></a> </div> </li> <?php $ocean_next_prev_prod_content .= ob_get_clean(); } ?> <div class="owp-product-nav-wrap clr"> <ul class="owp-product-nav"> <?php echo $ocean_next_prev_prod_content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped above. ?> </ul> </div> <?php } /** * Add floating bar. * * @since 1.5.0 */ public static function floating_bar() { // Return if is not single product if ( ! oceanwp_is_woo_single() ) { return; } // Get product object. $product = wc_get_product( get_the_ID() ); // Floating bar conditional $fb_woo_cond = get_theme_mod( 'ocean_single_conditional', false ); // Floating Bar conditional vars. $fb_show_cond = ''; $fb_show_cond = ( is_user_logged_in() && true === $fb_woo_cond ); // Floating Bar Heading tag. $fb_h_tag = 'h2'; $fb_h_tag = apply_filters( 'ocean_floating_bar_h_tag', $fb_h_tag ); ?> <div class="owp-floating-bar"> <div class="container clr"> <div class="left"> <p class="selected"><?php echo esc_html( oceanwp_theme_strings( 'owp-string-woo-floating-bar-selected', false ) ); ?></p> <<?php echo esc_attr( $fb_h_tag ); ?> class="entry-title" itemprop="name"><?php echo wp_trim_words( $product->get_title(), '4' ); ?></<?php echo esc_attr( $fb_h_tag ); ?>> </div> <?php if ( false === $fb_woo_cond || $fb_show_cond ) { ?> <div class="right"> <div class="product_price"> <p class="price"><?php echo $product->get_price_html(); ?></p> </div> <?php } ?> <?php // If out of stock. if ( 'outofstock' == $product->get_stock_status() ) { ?> <p class="stock out-of-stock"><?php echo esc_html( oceanwp_theme_strings( 'owp-string-woo-floating-bar-out-stock', false ) ); ?></p> <?php } elseif ( false === $fb_woo_cond || $fb_show_cond ) { if ( $product && $product->is_type( 'simple' ) && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) { echo self::floating_bar_add_to_cart( $product ); } else { ?> <button type="submit" class="button top"><?php echo esc_html( oceanwp_theme_strings( 'owp-string-woo-floating-bar-select-btn', false ) ); ?></button> <?php } } else { // Get price message display state. $fb_woo_cond_msg = get_theme_mod( 'ocean_woo_single_cond_msg', 'yes' ); if ( 'yes' === $fb_woo_cond_msg ) { // Get Add to Cart button replacement message. $fb_woo_msg_txt = get_theme_mod( 'ocean_woo_single_cond_msg_text' ); $fb_woo_msg_txt = $fb_woo_msg_txt ? $fb_woo_msg_txt : esc_html__( 'Log in to view price and purchase', 'oceanwp' ); ?> <div class="right"> <p class="selected"><?php echo esc_html( $fb_woo_msg_txt ); ?></p> </div> <?php } } if ( false === $fb_woo_cond || $fb_show_cond ) { ?> </div> <?php } ?> </div> </div> <?php } /** * Floating bar add to cart button. * * @since 1.5.0 */ public static function floating_bar_add_to_cart( $product ) { $html = '<form action="' . esc_url( $product->add_to_cart_url() ) . '" class="cart" method="post" enctype="multipart/form-data">'; $html .= woocommerce_quantity_input( array( 'min_value' => apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ), 'max_value' => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ), 'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( wp_unslash( $_POST['quantity'] ) ) : $product->get_min_purchase_quantity(), // WPCS: CSRF ok, input var ok. ), $product, false ); $html .= '<button type="submit" name="add-to-cart" value="' . get_the_ID() . '" class="floating_add_to_cart_button button alt">' . esc_html( $product->add_to_cart_text() ) . '</button>'; $html .= '</form>'; return $html; } /** * Floating bar add to cart ajax request. * * @since 1.5.0 */ public static function add_cart_floating_bar_ajax() { if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'oceanwp' ) ) { wp_die(); } $product_id = sanitize_text_field( $_POST['product_id'] ); $quantity = sanitize_text_field( $_POST['quantity'] ); $cart_item_key = WC()->cart->add_to_cart( $product_id, $quantity ); echo $cart_item_key; wp_die(); } /** * Add wrap and user info to the account navigation. * * @since 1.0.0 */ public static function oceanwp_before_account_navigation() { // Name to display $current_user = wp_get_current_user(); if ( $current_user->display_name ) { $name = $current_user->display_name; } else { $name = esc_html__( 'Welcome!', 'oceanwp' ); } $name = apply_filters( 'ocean_user_profile_name_text', $name ); echo '<div class="woocommerce-MyAccount-tabs clr">'; echo '<div class="oceanwp-user-profile clr">'; echo '<div class="image">' . get_avatar( $current_user->user_email, 128 ) . '</div>'; echo '<div class="user-info">'; echo '<p class="name">' . esc_attr( $name ) . '</p>'; echo '<a class="logout" href="' . esc_url( wp_logout_url( get_permalink() ) ) . '">' . esc_html__( 'Logout', 'oceanwp' ) . '</a>'; echo '</div>'; echo '</div>'; } /** * Add wrap to the account navigation. * * @since 1.0.0 */ public static function oceanwp_after_account_navigation() { echo '</div>'; } /** * Adds container wrap for the thumbnail and title of the categories products. * * @since 1.1.1.1 */ public static function add_container_wrap_category() { echo '<div class="product-inner clr">'; } /** * Adds a container div before the thumbnail for the categories products. * * @since 1.1.1.1 */ public static function add_div_before_category_thumbnail( $category ) { echo '<div class="woo-entry-image clr">'; echo '<a href="' . esc_url( get_term_link( $category, 'product_cat' ) ) . '">'; } /** * Close a container div before the thumbnail for the categories products. * * @since 1.1.1.1 */ public static function close_div_after_category_thumbnail() { echo '</a>'; echo '</div>'; } /** * Adds a container div before the thumbnail for the categories products. * * @since 1.1.1.1 */ public static function add_div_before_category_title( $category ) { echo '<div class="woo-entry-inner clr">'; echo '<a href="' . esc_url( get_term_link( $category, 'product_cat' ) ) . '">'; } /** * Add description if list view for the categories products. * * @since 1.1.1.1 */ public static function add_category_description( $category ) { // Close category link openend in add_div_before_category_title() echo '</a>'; // Var $term = get_term( $category->term_id, 'product_cat' ); $description = $term->description; $length = get_theme_mod( 'ocean_woo_list_excerpt_length', '60' ); // Description if ( get_theme_mod( 'ocean_woo_grid_list', true ) && $description ) { echo '<div class="woo-desc">'; echo '<div class="description">'; if ( ! $length ) { echo wp_kses_post( strip_shortcodes( $description ) ); } else { echo wp_trim_words( strip_shortcodes( $description ), $length ); } echo '</div>'; echo '</div>'; } } /** * Close a container div before the thumbnail for the categories products. * * @since 1.1.1.1 */ public static function close_div_after_category_title() { echo '</div>'; } /** * Close container wrap for the thumbnail and title of the categories products. * * @since 1.1.1.1 */ public static function close_container_wrap_category() { echo '</div>'; } /** * Before my account login. * * @since 1.0.0 */ public static function oceanwp_login_wrap_before() { echo '<div class="oceanwp-loginform-wrap">'; } /** * After my account login. * * @since 1.0.0 */ public static function oceanwp_login_wrap_after() { echo '</div>'; } /** * Display the categories featured images. * * @since 1.0.0 */ public static function woocommerce_category_image() { if ( is_product_category() ) { global $wp_query; $cat = $wp_query->get_queried_object(); $thumbnail_id = get_term_meta( $cat->term_id, 'thumbnail_id', true ); $image = wp_get_attachment_url( $thumbnail_id ); if ( $image ) { echo '<div class="category-image"><img src="' . $image . '" alt="' . $cat->name . '" /></div>'; } } } /** * Tweaks pagination arguments. * * @since 1.0.0 */ public static function pagination_args( $args ) { // Nav icons. $p_arrow = is_rtl() ? oceanwp_icon( 'angle_right', false ) : oceanwp_icon( 'angle_left', false ); $n_arrow = is_rtl() ? oceanwp_icon( 'angle_left', false ) : oceanwp_icon( 'angle_right', false ); // Args. $args['prev_text'] = $p_arrow; $args['next_text'] = $n_arrow; return $args; } /** * Alter continue shoping URL. * * @since 1.0.0 */ public static function continue_shopping_redirect( $return_to ) { $shop_id = wc_get_page_id( 'shop' ); if ( function_exists( 'icl_object_id' ) ) { $shop_id = icl_object_id( $shop_id, 'page' ); } if ( $shop_id ) { $return_to = get_permalink( $shop_id ); } return $return_to; } /** * Add classes to WooCommerce product entries. * * @since 1.0.0 */ public static function add_product_classes( $classes ) { global $woocommerce_loop; // Vars $product = wc_get_product( get_the_ID() ); $content_alignment = get_theme_mod( 'ocean_woo_product_entry_content_alignment', 'center' ); $content_alignment = $content_alignment ? $content_alignment : 'center'; $thumbs_layout = get_theme_mod( 'ocean_woo_product_thumbs_layout', 'horizontal' ); $thumbs_layout = $thumbs_layout ? $thumbs_layout : 'horizontal'; $tabs_layout = get_theme_mod( 'ocean_woo_product_tabs_layout', 'horizontal' ); $tabs_layout = $tabs_layout ? $tabs_layout : 'horizontal'; $btn_style = get_theme_mod( 'ocean_woo_product_addtocart_style', 'normal' ); $btn_style = $btn_style ? $btn_style : 'normal'; // Product entries if ( $product && ! empty( $woocommerce_loop['columns'] ) ) { // If has rating. if ( $product->get_rating_count() ) { $classes[] = 'has-rating'; } // If product navigation if ( true == get_theme_mod( 'ocean_woocommerce_display_navigation', true ) ) { $classes[] = 'has-product-nav'; } // Column Alignment. $classes[] = 'col'; $classes[] = oceanwp_grid_class( $woocommerce_loop['columns'] ); $classes[] = 'owp-content-' . $content_alignment; // If infinite scroll. if ( 'infinite_scroll' == get_theme_mod( 'ocean_woo_pagination_style', 'standard' ) ) { $classes[] = 'item-entry'; } } // Single product if ( post_type_exists( 'product' ) ) { // Thumbnails layout $classes[] = 'owp-thumbs-layout-' . $thumbs_layout; // Add to cart button style $classes[] = 'owp-btn-' . $btn_style; // Tabs layout $classes[] = 'owp-tabs-layout-' . $tabs_layout; // If no thumbnails $thumbnails = get_post_meta( get_the_ID(), '_product_image_gallery', true ); if ( empty( $thumbnails ) ) { $classes[] = 'has-no-thumbnails'; } // Display product navigation. if ( true == get_theme_mod( 'ocean_woocommerce_display_navigation', true ) ) { $classes[] = 'has-product-nav'; } } // Sale badge style $sale_style = get_theme_mod( 'ocean_woo_sale_badge_style', 'square' ); if ( 'circle' == $sale_style ) { $classes[] = $sale_style . '-sale'; } return $classes; } /** * Add the product class to the Elementor editor to fix the product display issue. * * @since 1.5.18 */ public static function add_product_class_for_elementor( $classes ) { if ( in_array( 'type-product', $classes ) ) { $classes[] = 'product'; } return $classes; } /** * Disable woo css * * @since 1.4.7 */ public function disable_woo_css() { $styles = []; return $styles; } /** * Remove the category description under the page title on taxonomy. * * @since 1.4.7 */ public static function post_subheading( $return ) { if ( is_woocommerce() && is_product_taxonomy() ) { $return = false; } return $return; } /** * Disables the next/previous links. * * @since 1.0.0 */ public static function next_prev( $return ) { if ( is_woocommerce() && is_singular( 'product' ) ) { $return = false; } return $return; } /** * Adds color accents for WooCommerce styles. * * @since 1.0.0 */ public static function primary_texts( $texts ) { return array_merge( array( '.woocommerce-MyAccount-navigation ul li a:before', '.woocommerce-checkout .woocommerce-info a', '.woocommerce-checkout #payment ul.payment_methods .wc_payment_method>input[type=radio]:first-child:checked+label:before', '.woocommerce-checkout #payment .payment_method_paypal .about_paypal', '.woocommerce ul.products li.product li.category a:hover', '.woocommerce ul.products li.product .button:hover', '.woocommerce ul.products li.product .product-inner .added_to_cart:hover', '.product_meta .posted_in a:hover', '.product_meta .tagged_as a:hover', '.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover', '.woocommerce div.product .woocommerce-tabs ul.tabs li.active a', '.woocommerce .oceanwp-grid-list a.active', '.woocommerce .oceanwp-grid-list a:hover', '.woocommerce .oceanwp-off-canvas-filter:hover', '.widget_shopping_cart ul.cart_list li .owp-grid-wrap .owp-grid a.remove:hover', '.widget_product_categories li a:hover ~ .count', '.widget_layered_nav li a:hover ~ .count', '.woocommerce ul.products li.product:not(.product-category) .woo-entry-buttons li a:hover', ), $texts ); } /** * Adds color accents for SVG icons. * * @since 1.0.0 */ public static function primary_svg_icons( $svg_icons ) { return array_merge( array( '.woocommerce .oceanwp-grid-list a.active .owp-icon use', '.woocommerce .oceanwp-grid-list a:hover .owp-icon use', ), $svg_icons ); } /** * Adds border accents for WooCommerce styles. * * @since 1.0.0 */ public static function primary_borders( $borders ) { return array_merge( array( '.current-shop-items-dropdown' => array( 'top' ), '.woocommerce div.product .woocommerce-tabs ul.tabs li.active a' => array( 'bottom' ), '.wcmenucart-details.count:before', '.woocommerce ul.products li.product .button:hover', '.woocommerce ul.products li.product .product-inner .added_to_cart:hover', '.woocommerce div.product .woocommerce-tabs ul.tabs li.active a', '.woocommerce .oceanwp-grid-list a.active', '.woocommerce .oceanwp-grid-list a:hover', '.woocommerce .oceanwp-off-canvas-filter:hover', '.owp-product-nav li a.owp-nav-link:hover', '.widget_shopping_cart_content .buttons .button:first-child:hover', '.widget_shopping_cart ul.cart_list li .owp-grid-wrap .owp-grid a.remove:hover', '.widget_product_categories li a:hover ~ .count', '.woocommerce .widget_product_categories li.current-cat > a ~ .count', '.woocommerce .widget_product_categories li.current-cat > a:before', '.widget_layered_nav li a:hover ~ .count', '.woocommerce .widget_layered_nav li.chosen a ~ .count', '.woocommerce .widget_layered_nav li.chosen a:before', '#owp-checkout-timeline.arrow .active .timeline-wrapper:before' => array( 'top', 'bottom' ), '#owp-checkout-timeline.arrow .active .timeline-wrapper:after' => array( 'left', 'right' ), '.bag-style:hover .wcmenucart-cart-icon .wcmenucart-count', '.bag-style:hover .wcmenucart-cart-icon .wcmenucart-count:after', '.show-cart .wcmenucart-cart-icon .wcmenucart-count', '.show-cart .wcmenucart-cart-icon .wcmenucart-count:after', '.woocommerce ul.products li.product:not(.product-category) .woo-product-gallery .active a', '.woocommerce ul.products li.product:not(.product-category) .woo-product-gallery a:hover', ), $borders ); } /** * Adds background accents for WooCommerce styles. * * @since 1.0.0 */ public static function primary_backgrounds( $backgrounds ) { return array_merge( array( '.woocommerce div.product div.images .open-image', '.wcmenucart-details.count', '.woocommerce-message a', '.woocommerce-error a', '.woocommerce-info a', '.woocommerce .widget_price_filter .ui-slider .ui-slider-handle', '.woocommerce .widget_price_filter .ui-slider .ui-slider-range', '.owp-product-nav li a.owp-nav-link:hover', '.woocommerce div.product.owp-tabs-layout-vertical .woocommerce-tabs ul.tabs li a:after', '.woocommerce .widget_product_categories li.current-cat > a ~ .count', '.woocommerce .widget_product_categories li.current-cat > a:before', '.woocommerce .widget_layered_nav li.chosen a ~ .count', '.woocommerce .widget_layered_nav li.chosen a:before', '#owp-checkout-timeline .active .timeline-wrapper', '.bag-style:hover .wcmenucart-cart-icon .wcmenucart-count', '.show-cart .wcmenucart-cart-icon .wcmenucart-count', '.woocommerce ul.products li.product:not(.product-category) .image-wrap .button', ), $backgrounds ); } /** * Adds background hover accents for WooCommerce styles. * * @since 1.0.0 */ public static function hover_primary_backgrounds( $hover ) { return array_merge( array( '.woocommerce div.product div.images .open-image:hover', '.woocommerce-error a:hover', '.woocommerce-info a:hover', '.woocommerce-message a:hover', '.woocommerce-message a:focus', '.woocommerce .button:focus', '.woocommerce ul.products li.product:not(.product-category) .image-wrap .button:hover', ), $hover ); } /** * Adds border color elements for WooCommerce styles. * * @since 1.0.0 */ public static function border_color_elements( $elements ) { return array_merge( array( '.woocommerce table.shop_table', '.woocommerce table.shop_table td', '.woocommerce-cart .cart-collaterals .cart_totals tr td', '.woocommerce-cart .cart-collaterals .cart_totals tr th', '.woocommerce table.shop_table tth', '.woocommerce table.shop_table tfoot td', '.woocommerce table.shop_table tfoot th', '.woocommerce .order_details', '.woocommerce .shop_table.order_details tfoot th', '.woocommerce .shop_table.customer_details th', '.woocommerce .cart-collaterals .cross-sells', '.woocommerce-page .cart-collaterals .cross-sells', '.woocommerce .cart-collaterals .cart_totals', '.woocommerce-page .cart-collaterals .cart_totals', '.woocommerce .cart-collaterals h2', '.woocommerce .cart-collaterals h2', '.woocommerce .cart-collaterals h2', '.woocommerce-cart .cart-collaterals .cart_totals .order-total th', '.woocommerce-cart .cart-collaterals .cart_totals .order-total td', '.woocommerce ul.order_details', '.woocommerce .shop_table.order_details tfoot th', '.woocommerce .shop_table.customer_details th', '.woocommerce .woocommerce-checkout #customer_details h3', '.woocommerce .woocommerce-checkout h3#order_review_heading', '.woocommerce-checkout #payment ul.payment_methods', '.woocommerce-checkout form.login', '.woocommerce-checkout form.checkout_coupon', '.woocommerce-checkout-review-order-table tfoot th', '.woocommerce-checkout #payment', '.woocommerce ul.order_details', '.woocommerce #customer_login > div', '.woocommerce .col-1.address', '.woocommerce .col-2.address', '.woocommerce-checkout .woocommerce-info', '.woocommerce div.product form.cart', '.product_meta', '.woocommerce div.product .woocommerce-tabs ul.tabs', '.woocommerce #reviews #comments ol.commentlist li .comment_container', 'p.stars span a', '.woocommerce ul.product_list_widget li', '.woocommerce .widget_shopping_cart .cart_list li', '.woocommerce.widget_shopping_cart .cart_list li', '.woocommerce ul.product_list_widget li:first-child', '.woocommerce .widget_shopping_cart .cart_list li:first-child', '.woocommerce.widget_shopping_cart .cart_list li:first-child', '.widget_product_categories li a', '.woocommerce .oceanwp-toolbar', '.woocommerce .products.list .product', ), $elements ); } /** * Alter WooCommerce category classes * * @since 1.0.0 */ public static function product_cat_class( $classes ) { global $woocommerce_loop; $classes[] = 'col'; $classes[] = oceanwp_grid_class( $woocommerce_loop['columns'] ); return $classes; } /** * Adds wishlist icon to menu * * @since 1.5.0 */ public static function menu_wishlist_icon( $items, $args ) { // Return items if is in the Elementor edit mode, to avoid error. if ( OCEANWP_ELEMENTOR_ACTIVE && \Elementor\Plugin::$instance->editor->is_edit_mode() ) { return $items; } // Return. if ( ! ocean_woo_wishlist() || true != get_theme_mod( 'ocean_woo_wishlist_icon', false ) || 'main_menu' != $args->theme_location ) { return $items; } $wl_plugin = get_theme_mod( 'ocean_woo_wl_plugin', 'ti_wl' ); $items .= '<li class="woo-wishlist-link">'; if ( 'ti_wl' === $wl_plugin ) { $items .= do_shortcode( '[ti_wishlist_products_counter]' ); } elseif ( 'yith_wl' === $wl_plugin ) { // Get YITH Wishlist URL. $wishlist_url = YITH_WCWL()->get_last_operation_url(); $woo_wl_count = ocean_woo_wishlist_count(); $items .= '<a href="' . esc_url( $wishlist_url ) . '">' . oceanwp_icon( 'heart', false ) . '<span class="count">' . esc_html( $woo_wl_count ) . '</i></span></a>'; } $items .= '</li>'; // Return menu items. return $items; } /** * Adds cart icon to menu * * @since 1.0.0 */ public static function menu_cart_icon( $items, $args ) { // Return items if is in the Elementor edit mode, to avoid error if ( OCEANWP_ELEMENTOR_ACTIVE && \Elementor\Plugin::$instance->editor->is_edit_mode() ) { return $items; } // Only used for the main menu if ( 'main_menu' != $args->theme_location ) { return $items; } // Get style $style = oceanwp_menu_cart_style(); $header_style = oceanwp_header_style(); // Return items if no style if ( ! $style ) { return $items; } // Add cart link to menu items if ( 'full_screen' == $header_style ) { $items .= '<li class="woo-cart-link"><a href="' . esc_url( wc_get_cart_url() ) . '">' . esc_html__( 'Your cart', 'oceanwp' ) . '</a></li>'; } else { $items .= self::get_cart_icon(); } // Return menu items return $items; } /** * Add cart icon * * @since 1.5.0 */ public static function get_cart_icon() { // Style $style = oceanwp_menu_cart_style(); $header_style = oceanwp_header_style(); $cart_style = get_theme_mod( 'ocean_woo_cart_dropdown_style', 'compact' ); // Toggle class $toggle_class = 'toggle-cart-widget'; // Define classes to add to li element $classes = array( 'woo-menu-icon' ); // Add style class $classes[] = 'wcmenucart-toggle-' . $style; // If bag style if ( 'yes' == get_theme_mod( 'ocean_woo_menu_bag_style', 'no' ) ) { $classes[] = 'bag-style'; } // Cart style if ( 'compact' != $cart_style ) { $classes[] = $cart_style; } // Prevent clicking on cart and checkout if ( 'custom_link' != $style && ( is_cart() || is_checkout() ) ) { $classes[] = 'nav-no-click'; } // Add toggle class else { $classes[] = $toggle_class; } // Turn classes into string $classes = implode( ' ', $classes ); ob_start(); ?> <li class="<?php echo esc_attr( $classes ); ?>"> <?php oceanwp_wcmenucart_menu_item(); ?> <?php if ( 'drop_down' == $style && 'full_screen' != $header_style && 'vertical' != $header_style ) { ?> <div class="current-shop-items-dropdown owp-mini-cart clr"> <div class="current-shop-items-inner clr"> <?php the_widget( 'WC_Widget_Cart', 'title=' ); ?> </div> </div> <?php } ?> </li> <?php return ob_get_clean(); } /** * Add menu cart item to the Woo fragments so it updates with AJAX * * @since 1.0.0 */ public static function menu_cart_icon_fragments( $fragments ) { ob_start(); oceanwp_wcmenucart_menu_item(); $fragments['li.woo-menu-icon a.wcmenucart, .oceanwp-mobile-menu-icon a.wcmenucart'] = ob_get_clean(); return $fragments; } /** * Sale badge content * * @since 1.5.0 */ public static function sale_flash() { global $product; if ( $product->is_type( 'simple' ) || $product->is_type( 'external' ) ) { $r_price = $product->get_regular_price(); $s_price = $product->get_sale_price(); $percent = round( ( ( floatval( $r_price ) - floatval( $s_price ) ) / floatval( $r_price ) ) * 100 ); } elseif ( $product->is_type( 'variable' ) ) { $available_variations = $product->get_available_variations(); $maximumper = 0; for ( $i = 0; $i < count( $available_variations ); ++ $i ) { $variation_id = $available_variations[ $i ]['variation_id']; $variable_product = new WC_Product_Variation( $variation_id ); if ( ! $variable_product->is_on_sale() ) { continue; } $r_price = $variable_product->get_regular_price(); $s_price = $variable_product->get_sale_price(); $percent = round( ( ( floatval( $r_price ) - floatval( $s_price ) ) / floatval( $r_price ) ) * 100 ); if ( $percent > $maximumper ) { $maximumper = $percent; } } $percent = sprintf( __( '%s', 'oceanwp' ), $maximumper ); } else { $percent = '<span class="onsale">' . __( 'Sale!', 'oceanwp' ) . '</span>'; return $percent; } $value = '-' . esc_html( $percent ) . '%'; return '<span class="onsale">' . esc_html( $value ) . '</span>'; } /** * Add links Login/Register on the my account page * * @since 1.5.0 */ public static function login_register_links() { // Return if not Original style if ( 'original' != get_theme_mod( 'ocean_woo_account_page_style', 'original' ) ) { return; } // Var $registration = get_option( 'woocommerce_enable_myaccount_registration' ); // Define classes $classes = array( 'owp-account-links' ); // If registration disabled if ( 'yes' != $registration ) { $classes[] = 'registration-disabled'; } // Turn classes into string $classes = implode( ' ', $classes ); // Login text $text = esc_html__( 'Login', 'oceanwp' ); $html = '<ul class="' . $classes . '">'; $html .= '<li class="login">'; if ( 'yes' == $registration ) { $html .= '<a href="#" class="owp-account-link current">' . $text . '</a>'; } else { $html .= '<span class="owp-account-link current">' . $text . '</span>'; } $html .= '</li>'; // If registration if ( 'yes' == $registration ) { $html .= '<li class="or">' . esc_html__( 'Or', 'oceanwp' ) . '</li>'; $html .= '<li class="register">'; $html .= '<a href="#" class="owp-account-link">' . esc_html__( 'Register', 'oceanwp' ) . '</a>'; $html .= '</li>'; } $html .= '</ul>'; echo $html; } /** * Distraction free on cart/checkout * * @since 1.5.0 */ public static function distraction_free( $return ) { if ( ( is_cart() && true == get_theme_mod( 'ocean_woo_distraction_free_cart', false ) ) || ( is_checkout() && true == get_theme_mod( 'ocean_woo_distraction_free_checkout', false ) ) ) { $return = false; } // Return return $return; } /** * Validate multi-step checkout fields. * * @since 1.5.17 */ public function validate_checkout_callback() { $posted_data = isset( $_POST['posted_data'] ) ? $_POST['posted_data'] : array(); $WC_Checkout = new WC_Checkout(); $errors = new WP_Error(); $skipped = array(); $data = array( 'terms' => (int) isset( $posted_data['terms'] ), 'createaccount' => (int) ! empty( $posted_data['createaccount'] ), 'payment_method' => isset( $posted_data['payment_method'] ) ? wc_clean( $posted_data['payment_method'] ) : '', 'shipping_method' => isset( $posted_data['shipping_method'] ) ? wc_clean( $posted_data['shipping_method'] ) : '', 'ship_to_different_address' => ! empty( $posted_data['ship_to_different_address'] ) && ! wc_ship_to_billing_address_only(), 'woocommerce_checkout_update_totals' => isset( $posted_data['woocommerce_checkout_update_totals'] ), ); foreach ( $WC_Checkout->get_checkout_fields() as $fieldset_key => $fieldset ) { if ( isset( $data['ship_to_different_address'] ) ) { if ( 'shipping' === $fieldset_key && ( ! $data['ship_to_different_address'] || ! WC()->cart->needs_shipping_address() ) ) { continue; } } if ( isset( $data['createaccount'] ) ) { if ( 'account' === $fieldset_key && ( is_user_logged_in() || ( ! $WC_Checkout->is_registration_required() && empty( $data['createaccount'] ) ) ) ) { continue; } } foreach ( $fieldset as $key => $field ) { $type = sanitize_title( isset( $field['type'] ) ? $field['type'] : 'text' ); switch ( $type ) { case 'checkbox': $value = isset( $posted_data[ $key ] ) ? 1 : ''; break; case 'multiselect': $value = isset( $posted_data[ $key ] ) ? implode( ', ', wc_clean( $posted_data[ $key ] ) ) : ''; break; case 'textarea': $value = isset( $posted_data[ $key ] ) ? wc_sanitize_textarea( $posted_data[ $key ] ) : ''; break; default: $value = isset( $posted_data[ $key ] ) ? wc_clean( $posted_data[ $key ] ) : ''; break; } $data[ $key ] = apply_filters( 'woocommerce_process_checkout_' . $type . '_field', apply_filters( 'woocommerce_process_checkout_field_' . $key, $value ) ); } } if ( in_array( 'shipping', $skipped ) && ( WC()->cart->needs_shipping_address() || wc_ship_to_billing_address_only() ) ) { foreach ( $this->get_checkout_fields( 'shipping' ) as $key => $field ) { $data[ $key ] = isset( $data[ 'billing_' . substr( $key, 9 ) ] ) ? $data[ 'billing_' . substr( $key, 9 ) ] : ''; } } foreach ( $WC_Checkout->get_checkout_fields() as $fieldset_key => $fieldset ) { if ( $fieldset_key != $_POST['type'] ) { continue; } if ( isset( $data['ship_to_different_address'] ) ) { if ( 'shipping' === $fieldset_key && ( ! $data['ship_to_different_address'] || ! WC()->cart->needs_shipping_address() ) ) { continue; } } if ( isset( $data['createaccount'] ) ) { if ( 'account' === $fieldset_key && ( is_user_logged_in() || ( ! $WC_Checkout->is_registration_required() && empty( $data['createaccount'] ) ) ) ) { continue; } } foreach ( $fieldset as $key => $field ) { if ( ! isset( $data[ $key ] ) ) { continue; } $required = ! empty( $field['required'] ); $format = array_filter( isset( $field['validate'] ) ? (array) $field['validate'] : array() ); $field_label = isset( $field['label'] ) ? $field['label'] : ''; switch ( $fieldset_key ) { case 'shipping': /* translators: %s: field name */ $field_label = sprintf( __( 'Shipping %s', 'oceanwp' ), $field_label ); break; case 'billing': /* translators: %s: field name */ $field_label = sprintf( __( 'Billing %s', 'oceanwp' ), $field_label ); break; } if ( in_array( 'postcode', $format ) ) { $country = isset( $data[ $fieldset_key . '_country' ] ) ? $data[ $fieldset_key . '_country' ] : WC()->customer->{"get_{$fieldset_key}_country"}(); $data[ $key ] = wc_format_postcode( $data[ $key ], $country ); if ( '' !== $data[ $key ] && ! WC_Validation::is_postcode( $data[ $key ], $country ) ) { $errors->add( 'validation', sprintf( __( '%s is not a valid postcode / ZIP.', 'oceanwp' ), '<strong>' . esc_html( $field_label ) . '</strong>' ) ); } } if ( in_array( 'phone', $format ) ) { $data[ $key ] = wc_format_phone_number( $data[ $key ] ); if ( '' !== $data[ $key ] && ! WC_Validation::is_phone( $data[ $key ] ) ) { /* translators: %s: phone number */ $errors->add( 'validation', sprintf( __( '%s is not a valid phone number.', 'oceanwp' ), '<strong>' . esc_html( $field_label ) . '</strong>' ) ); } } if ( in_array( 'email', $format ) && '' !== $data[ $key ] ) { $data[ $key ] = sanitize_email( $data[ $key ] ); if ( ! is_email( $data[ $key ] ) ) { /* translators: %s: email address */ $errors->add( 'validation', sprintf( __( '%s is not a valid email address.', 'oceanwp' ), '<strong>' . esc_html( $field_label ) . '</strong>' ) ); continue; } } if ( '' !== $data[ $key ] && in_array( 'state', $format ) ) { $country = isset( $data[ $fieldset_key . '_country' ] ) ? $data[ $fieldset_key . '_country' ] : WC()->customer->{"get_{$fieldset_key}_country"}(); $valid_states = WC()->countries->get_states( $country ); if ( ! empty( $valid_states ) && is_array( $valid_states ) && sizeof( $valid_states ) > 0 ) { $valid_state_values = array_map( 'wc_strtoupper', array_flip( array_map( 'wc_strtoupper', $valid_states ) ) ); $data[ $key ] = wc_strtoupper( $data[ $key ] ); if ( isset( $valid_state_values[ $data[ $key ] ] ) ) { // With this part we consider state value to be valid as well, convert it to the state key for the valid_states check below. $data[ $key ] = $valid_state_values[ $data[ $key ] ]; } if ( ! in_array( $data[ $key ], $valid_state_values ) ) { /* translators: 1: state field 2: valid states */ $errors->add( 'validation', sprintf( __( '%1$s is not valid. Please enter one of the following: %2$s', 'oceanwp' ), '<strong>' . esc_html( $field_label ) . '</strong>', implode( ', ', $valid_states ) ) ); } } } if ( $required && '' === $data[ $key ] ) { /* translators: %s: field name */ $errors->add( 'required-field', apply_filters( 'woocommerce_checkout_required_field_notice', sprintf( __( '%s is a required field.', 'oceanwp' ), '<strong>' . esc_html( $field_label ) . '</strong>' ), $field_label ) ); } } } $html = ''; $valid = true; if ( $errors->get_error_messages() ) { $valid = false; $html = '<div class="woocommerce-NoticeGroup woocommerce-NoticeGroup-checkout"><ul class="woocommerce-error" role="alert">'; foreach ( $errors->get_error_messages() as $message ) { $html .= '<li>' . $message . '</li>'; } $html .= '</ul></div>'; } wp_send_json( array( 'valid' => $valid, 'html' => $html, ) ); wp_die(); } /** * Checkout timeline template. * * @since 1.5.0 */ public static function checkout_timeline() { get_template_part( 'woocommerce/checkout/checkout-timeline' ); } /** * Change checkout template * * @since 1.5.0 */ public function multistep_checkout( $template, $template_name, $template_path ) { if ( 'checkout/form-checkout.php' == $template_name ) { $template = OCEANWP_THEME_DIR . '/woocommerce/checkout/form-multistep-checkout.php'; $theme_file = get_stylesheet_directory() . '/woocommerce/checkout/form-multistep-checkout.php'; if ( file_exists( $theme_file ) ) { $template = $theme_file; } } // Return return $template; } /** * Checkout login form. * * @since 1.5.0 */ public static function checkout_login_form( $login_message ) { woocommerce_login_form( array( 'message' => $login_message, 'redirect' => wc_get_page_permalink( 'checkout' ), 'hidden' => false, ) ); // If WooCommerce social login if ( class_exists( 'WC_Social_Login' ) ) { do_shortcode( '[woocommerce_social_login_buttons]' ); } } /** * Support to WooCommerce secure submit gateway * * @since 1.5.0 */ public static function woocommerce_securesubmit_support( $value, $options ) { $value['use_iframes'] = 'no'; return $value; } /** * Add typography options for the WooCommerce product title * * @since 1.0.0 */ public static function typography_settings( $settings ) { $settings['woo_product_title'] = array( 'label' => esc_html__( 'WooCommerce Product Title', 'oceanwp' ), 'target' => '.woocommerce div.product .product_title', 'defaults' => array( 'font-size' => '24', 'color' => '#333333', 'line-height' => '1.4', 'letter-spacing' => '0.6', ), ); $settings['woo_product_price'] = array( 'label' => esc_html__( 'WooCommerce Product Price', 'oceanwp' ), 'target' => '.woocommerce div.product p.price', 'defaults' => array( 'font-size' => '36', 'line-height' => '1', 'letter-spacing' => '0', ), ); $settings['woo_single_add_to_cart'] = array( 'label' => esc_html__( 'WooCommerce Product Add To Cart', 'oceanwp' ), 'target' => '.woocommerce .owp-btn-normal .summary form button.button, .woocommerce .owp-btn-big .summary form button.button, .woocommerce .owp-btn-very-big .summary form button.button', 'exclude' => array( 'font-color' ), 'defaults' => array( 'font-size' => '12', 'text-transform' => 'uppercase', 'line-height' => '1.5', 'letter-spacing' => '1', ), ); $settings['woo_single_notice'] = array( 'label' => esc_html__( 'WooCommerce Product Notice', 'oceanwp' ), 'target' => '.woocommerce div.owp-woo-single-cond-notice span, .woocommerce div.owp-woo-single-cond-notice a', 'exclude' => array( 'font-color' ), 'defaults' => array( 'font-size' => '18', 'font-weight' => '600', 'text-transform' => 'capitalize', 'line-height' => '2', 'letter-spacing' => '1.5', ), ); $settings['woo_archive_title'] = array( 'label' => esc_html__( 'WooCommerce Archive Title', 'oceanwp' ), 'target' => '.woocommerce ul.products li.product li.title h2, .woocommerce ul.products li.product li.title a', 'exclude' => array( 'font-color' ), 'defaults' => array( 'font-size' => '14', 'line-height' => '1.5', 'letter-spacing' => '0', ), ); $settings['woo_archive_cats'] = array( 'label' => esc_html__( 'WooCommerce Archive Category', 'oceanwp' ), 'target' => '.woocommerce ul.products li.product li.category, .woocommerce ul.products li.product li.category a', 'exclude' => array( 'font-color' ), 'defaults' => array( 'font-size' => '12', 'line-height' => '1', 'letter-spacing' => '0', ), ); $settings['woo_archive_price'] = array( 'label' => esc_html__( 'WooCommerce Archive Price', 'oceanwp' ), 'target' => '.woocommerce ul.products li.product .price', 'exclude' => array( 'font-color' ), 'defaults' => array( 'font-size' => '18', 'line-height' => '1', 'letter-spacing' => '0', ), ); $settings['woo_product_add_to_cart'] = array( 'label' => esc_html__( 'WooCommerce Archive Add To Cart', 'oceanwp' ), 'target' => '.woocommerce ul.products li.product .button, .woocommerce ul.products li.product .product-inner .added_to_cart', 'exclude' => array( 'font-color' ), 'defaults' => array( 'font-size' => '12', 'line-height' => '1.5', 'letter-spacing' => '1', ), ); $settings['woo_archive_notice'] = array( 'label' => esc_html__( 'WooCommerce Archive Notice', 'oceanwp' ), 'target' => '.woocommerce ul.products li.owp-woo-cond-notice span, .woocommerce ul.products li.owp-woo-cond-notice a', 'exclude' => array( 'font-color' ), 'defaults' => array( 'font-size' => '16', 'font-weight' => '600', 'text-transform' => 'capitalize', 'line-height' => '1', 'letter-spacing' => '1', ), ); $settings['woo_store_notice'] = array( 'label' => esc_html__( 'WooCommerce Store Notice', 'oceanwp' ), 'target' => '.woocommerce-store-notice.demo_store', 'defaults' => array( 'color' => '#ffffff', 'line-height' => '2', 'letter-spacing' => '1.5', ), ); $settings['woo_store_notice_dismiss_link'] = array( 'label' => esc_html__( 'WooCommerce Store Notice Dismiss', 'oceanwp' ), 'target' => '.demo_store .woocommerce-store-notice__dismiss-link', 'defaults' => array( 'color' => '#ffffff', 'line-height' => '2', 'letter-spacing' => '1.5', ), ); return $settings; } /** * Supports WooCommerce Match Box extension by removing * duplicate single product summary features on the * product page. * * @since 1.2.9 * @static * @author Sébastien Dumont * @global object WC_Product $product */ public function remove_wc_match_box_single_product_summary() { global $product; if ( $product->is_type( 'mix-and-match' ) ) { remove_action( 'woocommerce_single_product_summary', array( $this, 'single_product_content' ), 10 ); add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 ); } } /** * Compatibility with YITH WooCommerce Badge. * * @since 1.5.23 */ public function yith_wcbm_shop_badge_container_start() { do_action( 'yith_wcbm_theme_badge_container_start' ); } /** * Compatibility with YITH WooCommerce Badge. * * @since 1.5.23 */ public function yith_wcbm_shop_badge_container_end() { do_action( 'yith_wcbm_theme_badge_container_end' ); } /** * Compatibility with WooCommerce Germanized. * * @since 1.5.6 */ public function woocommerce_germanized() { echo '<li class="wc-gzd">'; foreach ( wc_gzd_get_product_loop_shopmarks() as $shopmark ) { $callback = $shopmark->get_callback(); if ( function_exists( $callback ) && $shopmark->is_enabled() && in_array( $shopmark->get_type(), array( 'unit_price', 'tax', 'shipping_costs', 'delivery_time', 'units' ), true ) ) { call_user_func( $callback ); } } echo '</li>'; } public function woocommerce_germanized_single() { echo '<div class="wc-gzd-single">'; foreach ( wc_gzd_get_single_product_shopmarks() as $shopmark ) { $callback = $shopmark->get_callback(); if ( function_exists( $callback ) && $shopmark->is_enabled() && in_array( $shopmark->get_type(), array( 'unit_price', 'legal', 'shipping_costs' ), true ) ) { call_user_func( $callback ); } } echo '</div>'; } /** * Compatibility with WooCommerce Germanized Single Product meta template. * * @since 2.0 */ public function woocommerce_germanized_single_meta() { echo '<div class="wc-gzd-single-meta">'; foreach ( wc_gzd_get_single_product_shopmarks() as $shopmark ) { $callback = $shopmark->get_callback(); if ( function_exists( $callback ) && $shopmark->is_enabled() && in_array( $shopmark->get_type(), array( 'unit_price', 'delivery_time' ), true ) ) { call_user_func( $callback ); } } echo '</div>'; } } } OceanWP_WooCommerce_Config::instance();