我想在 WooCommerce 中提供第三个价格:
到目前为止,我将其添加到管理区域和前端中以使其可见,但无论我尝试什么,我都无法使其与购物车一起使用,因为我需要它从 3 到 1 检查,例如:如果有选项 3 ( Super Sale PRice),则为该价格,如果有 2 个(折扣价),则为该价格,如果有 1 个(仅正价),则为该价格。 所有这些都不应与可变产品混淆,而仅适用于简单产品。
这是我的代码:
/**
* Function to render UI in Admin Product add/edit page
*/
function show_custom_price_admin() {
global $thepostid;
woocommerce_wp_text_input(
array(
'id' => 'custom_price',
'name' => '_custom_price',
'value' => get_post_meta( $thepostid, '_custom_price', true ),
'class' => 'wc_input_price short',
'label' => __( 'Custom Price ($)', 'vg' ),
)
);
}
add_action( 'woocommerce_product_options_pricing', 'show_custom_price_admin' );
/**
* Function to update custom price Admin Product add/edit page
*
* @param int $post_id Product's post id.
*/
function process_product_custom_data( $post_id ) {
$product = wc_get_product( $post_id );
$product->update_meta_data(
'_custom_price',
wc_clean( wp_unslash( filter_input( INPUT_POST, '_custom_price' ) ) )
);
$product->save();
}
add_action( 'woocommerce_process_product_meta', 'process_product_custom_data' );
/**
* Function to show custom price front end page
*/
function show_custom_price_frontend() {
global $post;
$custom_price = get_post_meta( $post->ID, '_custom_price', true );
if ( $custom_price ) {
$custom_price = wc_price( $custom_price );
printf( '<p class="price">%s</p>', $custom_price );
}
}
add_action( 'woocommerce_before_add_to_cart_form', 'show_custom_price_frontend' );
到目前为止,我将其添加到管理区域和前端中以使其可见,但无论我尝试什么,我都无法使其与购物车一起使用,因为我需要它从 3 到 1 检查,例如:如果有选项 3 ( Super Sale PRice),则为该价格,如果有 2 个(折扣价),则为该价格,如果有 1 个(仅正价),则为该价格。 所有这些都不应与可变产品混淆,而仅适用于简单产品。
您的代码有点过时,并且缺少一些内容,如果在后端定义了自定义价格(对于简单产品),则设置和显示自定义价格:
/**
* Display custom price input field in Admin Product add/edit page
**/
add_action( 'woocommerce_product_options_pricing', 'admin_product_custom_price_input_field' );
function admin_product_custom_price_input_field() {
global $post, $product_object;
echo '<div class="pricing show_if_simple hidden">'; // Only on simple product
woocommerce_wp_text_input( array(
'id' => 'custom_price',
'value' => $product_object->get_meta( '_custom_price' ),
'class' => 'wc_input_price short',
'label' => __( 'Custom Price', 'vg' ) . ' (' . get_woocommerce_currency_symbol() . ')',
'data_type' => 'price',
) );
echo '</div>';
}
/**
* Save/update custom price Admin Product add/edit page
*
* @param object $product WC_Product instance object
**/
function saves_product_custom_metadata( $product ) {
$price_value = isset( $_POST['custom_price'] ) ? wc_clean( wp_unslash( $_POST['custom_price'] ) ) : null;
$product->update_meta_data('_custom_price', $price_value );
}
add_action( 'woocommerce_admin_process_product_object', 'saves_product_custom_metadata' );
/**
* Display formatted custom price on front end
*
* @param string $price_html Formatted custom price html
* @param object $product WC_Product instance object
**/
function custom_get_price_html( $price_html, $product ) {
if ( ! $product->is_type('simple') ) {
return $price_html;
}
if ( $custom_price = $product->get_meta( '_custom_price' ) ) {
return wc_price( wc_get_price_to_display( $product, array( 'price' => $custom_price ) ) )
. $product->get_price_suffix();
}
return $price_html;
}
add_filter( 'woocommerce_get_price_html', 'custom_get_price_html', 100, 2 );
/**
* Set custom cart item price
*
* @param object $cart WC_Cart instance object
**/
function add_( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Loop through cart items
foreach ( $cart->get_cart() as $item ) {
$product = $item['data'];
if ( $custom_price = $product->get_meta( '_custom_price' ) ) {
$product->set_price( $custom_price );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'cart_set_custom_price', 1000 );
/**
* Display custom cart item price
*
* @param object $cart WC_Cart instance object
* @param array $cart_item cart item data
**/
function filter_cart_item_price( $price, $cart_item ) {
if ( $custom_price = $cart_item['data']->get_meta( '_custom_price' ) ) {
$args = array( 'price' => $custom_price );
if ( WC()->cart->display_prices_including_tax() ) {
$product_price = wc_get_price_including_tax( $cart_item['data'], $args );
} else {
$product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );
}
return wc_price( $product_price );
}
return $price;
}
add_filter( 'woocommerce_cart_item_price', 'filter_cart_item_price', 100, 2 );
应该可以。