id = 'price_labels'; $this->short_desc = __( 'Custom Price Labels', 'woocommerce-jetpack' ); $this->desc = __( 'Create any custom price label for any product.', 'woocommerce-jetpack' ); $this->link_slug = 'woocommerce-custom-price-labels'; parent::__construct(); // Custom Price Labels - fields array $this->custom_tab_group_name = 'wcj_price_labels'; // for compatibility with Custom Price Label Pro plugin should use 'simple_is_custom_pricing_label' $this->custom_tab_sections = array( '_instead', '_before', '_between', '_after', ); $this->custom_tab_sections_titles = array( '_instead' => __( 'Instead of the price', 'woocommerce-jetpack' ), // for compatibility with Custom Price Label Pro plugin should use '' '_before' => __( 'Before the price', 'woocommerce-jetpack' ), '_between' => __( 'Between regular and sale prices', 'woocommerce-jetpack' ), '_after' => __( 'After the price', 'woocommerce-jetpack' ), ); $this->custom_tab_section_variations = array( '_text', '_enabled', '_home', '_products', '_single', '_page', '_cart', /*'_simple',*/ '_variable', '_variation', /*'_grouped',*/ ); $this->custom_tab_section_variations_titles = array( '_text' => '', // 'The label', '_enabled' => __( 'Enable', 'woocommerce-jetpack' ), // for compatibility with Custom Price Label Pro plugin should use '' '_home' => __( 'Hide on home page', 'woocommerce-jetpack' ), '_products' => __( 'Hide on products page', 'woocommerce-jetpack' ), '_single' => __( 'Hide on single', 'woocommerce-jetpack' ), '_page' => __( 'Hide on all pages', 'woocommerce-jetpack' ), '_cart' => __( 'Hide on cart page only', 'woocommerce-jetpack' ), // '_simple' => __( 'Hide for simple product', 'woocommerce-jetpack' ), '_variable' => __( 'Hide for main price', 'woocommerce-jetpack' ), '_variation' => __( 'Hide for all variations', 'woocommerce-jetpack' ), // '_grouped' => __( 'Hide for grouped product', 'woocommerce-jetpack' ), ); if ( $this->is_enabled() ) { if ( 'yes' === get_option( 'wcj_local_price_labels_enabled', 'yes' ) ) { // Meta box (admin) add_action( 'add_meta_boxes', array( $this, 'add_price_label_meta_box' ) ); add_action( 'save_post_product', array( $this, 'save_custom_price_labels' ), 999, 2 ); } // Prices Hooks $this->prices_filters = array( // Cart 'woocommerce_cart_item_price', // Composite Products 'woocommerce_composite_sale_price_html', 'woocommerce_composite_price_html', 'woocommerce_composite_empty_price_html', 'woocommerce_composite_free_sale_price_html', 'woocommerce_composite_free_price_html', // Booking Products 'woocommerce_get_price_html', // Simple Products 'woocommerce_empty_price_html', 'woocommerce_free_price_html', 'woocommerce_free_sale_price_html', 'woocommerce_price_html', 'woocommerce_sale_price_html', // Grouped Products 'woocommerce_grouped_price_html', // Variable Products 'woocommerce_variable_empty_price_html', 'woocommerce_variable_free_price_html', 'woocommerce_variable_free_sale_price_html', 'woocommerce_variable_price_html', 'woocommerce_variable_sale_price_html', // Variable Products - Variations 'woocommerce_variation_empty_price_html', 'woocommerce_variation_free_price_html', 'woocommerce_variation_price_html', 'woocommerce_variation_sale_price_html', // WooCommerce Subscription 'woocommerce_subscriptions_product_price_string', 'woocommerce_variable_subscription_price_html', // Entrada theme 'entrada_price', ); foreach ( $this->prices_filters as $the_filter ) { add_filter( $the_filter, array( $this, 'custom_price' ), 100, 2 ); } } } /** * save_custom_price_labels. */ function save_custom_price_labels( $post_id, $post ) { if ( ! isset( $_POST['woojetpack_price_labels_save_post'] ) ) { return; } foreach ( $this->custom_tab_sections as $custom_tab_section ) { foreach ( $this->custom_tab_section_variations as $custom_tab_section_variation ) { $option_name = $this->custom_tab_group_name . $custom_tab_section . $custom_tab_section_variation; if ( $custom_tab_section_variation == '_text' ) { if ( isset( $_POST[ $option_name ] ) ) { update_post_meta( $post_id, '_' . $option_name, $_POST[ $option_name ] ); } } else { if ( isset( $_POST[ $option_name ] ) ) { update_post_meta( $post_id, '_' . $option_name, $_POST[ $option_name ] ); } else { update_post_meta( $post_id, '_' . $option_name, 'off' ); } } } } } /** * add_price_label_meta_box. * * @version 2.4.8 */ function add_price_label_meta_box() { add_meta_box( 'wc-jetpack-price-labels', __( 'Booster: Custom Price Labels', 'woocommerce-jetpack' ), array( $this, 'create_price_label_meta_box' ), 'product', 'normal', 'high' ); } /* * create_price_label_meta_box - back end. * * @version 2.4.8 */ function create_price_label_meta_box() { $current_post_id = get_the_ID(); echo ''; echo ''; foreach ( $this->custom_tab_sections as $custom_tab_section ) { echo ''; } echo ''; echo ''; foreach ( $this->custom_tab_sections as $custom_tab_section ) { echo ''; } echo ''; echo ''; foreach ( $this->custom_tab_sections as $custom_tab_section ) { if ( '_instead' != $custom_tab_section ) $disabled_if_no_plus = apply_filters( 'booster_message', '', 'desc_above' ); else $disabled_if_no_plus = ''; echo ''; } echo ''; echo '

' . $this->custom_tab_sections_titles[ $custom_tab_section ] . '

'; echo '
    '; foreach ( $this->custom_tab_section_variations as $custom_tab_section_variation ) { $option_name = $this->custom_tab_group_name . $custom_tab_section . $custom_tab_section_variation; if ( $custom_tab_section_variation == '_text' ) { if ( $custom_tab_section != '_instead' ) { $disabled_if_no_plus = apply_filters( 'booster_message', '', 'readonly_string' ); } else { $disabled_if_no_plus = ''; } $label_text = get_post_meta( $current_post_id, '_' . $option_name, true ); $label_text = str_replace ( '"', '"', $label_text ); echo '
  • ' . $this->custom_tab_section_variations_titles[ $custom_tab_section_variation ] . '
  • '; } else { if ( '_home' === $custom_tab_section_variation ) { echo '
  • Hide by page type
  • '; } if ( '_variable' === $custom_tab_section_variation ) { echo '
  • Variable products
  • '; } if ( '_instead' != $custom_tab_section ) { $disabled_if_no_plus = apply_filters( 'booster_message', '', 'disabled_string' ); } else { $disabled_if_no_plus = ''; } echo '
  • ' . $this->custom_tab_section_variations_titles[ $custom_tab_section_variation ] . '
  • '; } } echo '
'; echo '
' . $disabled_if_no_plus . '
'; echo ''; } /* * customize_price. * * @todo recheck if `str_replace( 'From: ', '', $price );` is necessary? Also this works only for English WP installs. */ function customize_price( $price, $custom_tab_section, $custom_label ) { switch ( $custom_tab_section ) { case '_instead': $price = $custom_label; break; case '_before': $price = apply_filters( 'booster_option', $price, $custom_label . $price ); break; case '_between': $price = apply_filters( 'booster_option', $price, str_replace( ' ', '' . $custom_label . '', $price ) ); break; case '_after': $price = apply_filters( 'booster_option', $price, $price . $custom_label ); break; } return str_replace( 'From: ', '', $price ); } /* * custom_price - front end. * * @version 3.6.0 * @todo rewrite this with less filters (e.g. `woocommerce_get_price_html` only) - at least for `! WCJ_IS_WC_VERSION_BELOW_3` */ function custom_price( $price, $product ) { if ( ! wcj_is_frontend() ) { return $price; } $current_filter_name = current_filter(); if ( 'woocommerce_cart_item_price' === $current_filter_name ) { $product = $product['data']; } elseif ( 'entrada_price' === $current_filter_name ) { $product = wc_get_product(); } $_product_id = wcj_get_product_id_or_variation_parent_id( $product ); $_product_type = ( WCJ_IS_WC_VERSION_BELOW_3 ? $product->product_type : $product->get_type() ); if ( WCJ_IS_WC_VERSION_BELOW_3 && 'woocommerce_get_price_html' === $current_filter_name && ! in_array( $_product_type, apply_filters( 'wcj_price_labels_woocommerce_get_price_html_allowed_post_types', array( 'booking' ), $_product_type ) ) ) { return $price; } if ( ! WCJ_IS_WC_VERSION_BELOW_3 && 'woocommerce_variable_price_html' === $current_filter_name ) { return $price; } if ( ! WCJ_IS_WC_VERSION_BELOW_3 && 'woocommerce_get_price_html' === $current_filter_name && $product->is_type( 'variation' ) ) { $current_filter_name = 'woocommerce_variation_price_html'; } if ( ! WCJ_IS_WC_VERSION_BELOW_3 && 'woocommerce_get_price_html' === $current_filter_name && $product->is_type( 'variable' ) ) { $current_filter_name = 'woocommerce_variable_price_html'; } if ( 'subscription' === $_product_type && 'woocommerce_subscriptions_product_price_string' !== $current_filter_name ) { return $price; } if ( 'variable-subscription' === $_product_type && 'woocommerce_variable_subscription_price_html' !== $current_filter_name ) { return $price; } if ( 'subscription_variation' === $_product_type && 'woocommerce_subscriptions_product_price_string' !== $current_filter_name ) { return $price; } if ( 'subscription_variation' === $_product_type && 'woocommerce_subscriptions_product_price_string' === $current_filter_name ) { $current_filter_name = 'woocommerce_variation_subscription_price_html'; } // Global $do_apply_global = true; $products_incl = get_option( 'wcj_global_price_labels_products_incl', array() ); if ( ! empty( $products_incl ) ) { $do_apply_global = ( in_array( $_product_id, $products_incl ) ) ? true : false; } $products_excl = get_option( 'wcj_global_price_labels_products_excl', array() ); if ( ! empty( $products_excl ) ) { $do_apply_global = ( in_array( $_product_id, $products_excl ) ) ? false : true; } $product_categories = get_the_terms( $_product_id, 'product_cat' ); $product_categories_incl = get_option( 'wcj_global_price_labels_product_cats_incl', array() ); if ( ! empty( $product_categories_incl ) ) { $do_apply_global = false; if ( ! empty( $product_categories ) ) { foreach ( $product_categories as $product_category ) { if ( in_array( $product_category->term_id, $product_categories_incl ) ) { $do_apply_global = true; break; } } } } $product_categories_excl = get_option( 'wcj_global_price_labels_product_cats_excl', array() ); if ( ! empty( $product_categories_excl ) ) { $do_apply_global = true; if ( ! empty( $product_categories ) ) { foreach ( $product_categories as $product_category ) { if ( in_array( $product_category->term_id, $product_categories_excl ) ) { $do_apply_global = false; break; } } } } if ( $do_apply_global ) { // Check product type $product_types_incl = get_option( 'wcj_global_price_labels_product_types_incl', '' ); if ( ! empty( $product_types_incl ) ) { $do_apply_global = false; foreach ( $product_types_incl as $product_type_incl ) { if ( $product->is_type( $product_type_incl ) ) { $do_apply_global = true; break; } } } } if ( $do_apply_global ) { // Global price labels - Add text before price $text_to_add_before = apply_filters( 'booster_option', '', get_option( 'wcj_global_price_labels_add_before_text' ) ); if ( '' != $text_to_add_before ) { if ( apply_filters( 'wcj_price_labels_check_on_applying_label', true, $price, $text_to_add_before ) ) { $price = $text_to_add_before . $price; } } // Global price labels - Add text after price $text_to_add_after = get_option( 'wcj_global_price_labels_add_after_text' ); if ( '' != $text_to_add_after ) { if ( apply_filters( 'wcj_price_labels_check_on_applying_label', true, $price, $text_to_add_after ) ) { $price = $price . $text_to_add_after; } } // Global price labels - Between regular and sale prices $text_to_add_between_regular_and_sale = get_option( 'wcj_global_price_labels_between_regular_and_sale_text' ); if ( '' != $text_to_add_between_regular_and_sale ) { $price = apply_filters( 'booster_option', $price, str_replace( ' ', '' . $text_to_add_between_regular_and_sale . '', $price ) ); } // Global price labels - Remove text from price $text_to_remove = apply_filters( 'booster_option', '', get_option( 'wcj_global_price_labels_remove_text' ) ); if ( '' != $text_to_remove ) { $price = str_replace( $text_to_remove, '', $price ); } // Global price labels - Replace in price $text_to_replace = apply_filters( 'booster_option', '', get_option( 'wcj_global_price_labels_replace_text' ) ); $text_to_replace_with = apply_filters( 'booster_option', '', get_option( 'wcj_global_price_labels_replace_with_text' ) ); if ( '' != $text_to_replace && '' != $text_to_replace_with ) { $price = str_replace( $text_to_replace, $text_to_replace_with, $price ); } // Global price labels - Instead of the price if ( '' != ( $text_instead = get_option( 'wcj_global_price_labels_instead_text', '' ) ) ) { $price = $text_instead; } } // Per product if ( 'yes' === get_option( 'wcj_local_price_labels_enabled', 'yes' ) ) { foreach ( $this->custom_tab_sections as $custom_tab_section ) { $labels_array = array(); foreach ( $this->custom_tab_section_variations as $custom_tab_section_variation ) { $option_name = $this->custom_tab_group_name . $custom_tab_section . $custom_tab_section_variation; $labels_array[ 'variation' . $custom_tab_section_variation ] = get_post_meta( $_product_id, '_' . $option_name, true ); } if ( 'on' === $labels_array[ 'variation_enabled' ] ) { if ( ( 'on' === $labels_array['variation_home'] && is_front_page() ) || ( 'on' === $labels_array['variation_products'] && is_archive() ) || ( 'on' === $labels_array['variation_single'] && is_single() ) || ( 'on' === $labels_array['variation_page'] && is_page() && ! is_front_page() ) || ( 'on' === $labels_array['variation_cart'] && 'woocommerce_cart_item_price' === $current_filter_name ) || ( 'on' === $labels_array['variation_variable'] && in_array( $current_filter_name, array( 'woocommerce_variable_empty_price_html', 'woocommerce_variable_free_price_html', 'woocommerce_variable_free_sale_price_html', 'woocommerce_variable_price_html', 'woocommerce_variable_sale_price_html', 'woocommerce_variable_subscription_price_html', ) ) ) || ( 'on' === $labels_array['variation_variation'] && in_array( $current_filter_name, array( 'woocommerce_variation_empty_price_html', 'woocommerce_variation_free_price_html', 'woocommerce_variation_price_html', 'woocommerce_variation_sale_price_html', 'woocommerce_variation_subscription_price_html', // pseudo filter! ) ) ) ) { continue; } $price = $this->customize_price( $price, $custom_tab_section, $labels_array['variation_text'] ); } } } // Apply shortcodes WCJ()->shortcodes['products']->passed_product = $product; WCJ()->shortcodes['products_crowdfunding']->passed_product = $product; $result = do_shortcode( $price ); unset( WCJ()->shortcodes['products']->passed_product ); unset( WCJ()->shortcodes['products_crowdfunding']->passed_product ); return $result; } } endif; return new WCJ_Price_Labels();