Во-первых, трудно помочь, поскольку мы ничего не знаем о вашем пользовательском типе поста в «студии» и о том, как на нем устанавливаются данные для клиентов.
В некоторых ошибках и пропущенных вещахваш код, как в ваших IF
выражениях, где вам нужно использовать условную функцию in_array()
.
Я пытался угадать, как данные задаются в wpcf-listing-option
метаданных для вашего studio
пользовательского типа записи, и я предполагаю, что это число между 1
(один)и 7
(семь).
Также в вашем коде, когда вы перебираете $studio_query
, для $studio_listing_name
и $studio_listing_option
вы всегда будете получать значения из последнегоэлемент из цикла ... так что в вашей логике что-то не так.
В следующем коде я нацеливаюсь на указанный вами идентификатор продукта только (без каких-либо гарантий, он должен помочь, даже если он не работает полностью) :
add_action( 'woocommerce_before_calculate_totals', 'customize_cart_item_details', 20, 1);
function customize_cart_item_details( $cart ) {
// This is necessary for WC 3.0+
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Avoiding hook repetition (when using price calculations for example)
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 || ! is_user_logged_in() )
return;
// ID of the product I've set up
$defined_product_id = 2938;
$customer_id = get_current_user_id();
// Get "studio" custom post objects
$studio_query = get_posts( array(
'post_type' => 'studio',
'post_status' => 'published',
'posts_per_page' => 1,
'author' => $customer_id
) );
// Get the first "studio" post for the current user
$studio = reset( $studio_query );
$studio_name = $studio->post_title;
$studio_option = get_post_meta( $studio->ID, 'wpcf-listing-option', true );
if ( in_array( $studio_option, array( 1, 2 ) ) ) {
$new_price = 180;
} elseif ( in_array( $studio_option, array( 3, 4 ) ) ) {
$new_price = 345;
} elseif ( in_array( $studio_option, array( 5, 6, 7 ) ) ) {
$new_price = 690;
}
$new_name = sprintf(
__( "Payment for 2020 Listing: %s - %s - Listing Option %s", "woocommerce" ),
$customer_id, $studio_name, $studio_option
);
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item ) {
// Only for the defined product ID (or variation ID)
if ( in_array( $defined_product_id, [ $cart_item['product_id'], $cart_item['variation_id'] ] ) ) {
$cart_item['data']->set_price( $new_price );
$cart_item['data']->set_name( $new_name );
}
}
}