Я использую сценарий ниже в моей дочерней теме WordPress functions.php, чтобы перезаписать цену, но приведенный ниже код влияет на все продукты.
Не могли бы вы помочь мне «не запускать» нижеприведенный код, если продукт относится к определенной категории «рубашки», «игры»?
function calculate_cart_total( $cart_object ) {
foreach ( WC()->cart->get_cart() as $key => $value ) {
if (is_array($valueArray)) {
foreach ( $valueArray as $k => $value ) {
if ($value['wccpf_cost']) {
$additionalPrice = $value['wccpf_cost']['user_val'];
}
}
}
}
$additionalPrice = $value['wccpf_cost']['user_val'];
foreach ( WC()->cart->get_cart() as $key => $value ) {
if ( method_exists( $value['data'], "set_price" ) ) {
$value['data']->set_price( $additionalPrice );
} else {
$value['data']->price = ($additionalPrice );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_cart_total', 99 );
Приведенный выше код работает без сбоев для всех продуктов, но я не хочу запускать этот код для всех продуктов, так как этот код требуется.
Я пробовал условные теги, такие как is_product_category( array( 'shirts', 'games' ) ), но они не работают.
Или есть какой-то конкретный способ в WordPress вместо functions.php, чтобы я мог запускать приведенный выше код для определенных продуктов или категорий только там, где это требуется?
Я также выполнил поиск в Google, но не смог найти идеального решения.






В вашем коде есть некоторые ошибки и ошибки ... Поскольку $valueArray не определен в вашем коде, первый цикл foreach не имеет никакого эффекта, и код становится активным после него. Чтобы настроить таргетинг на категории товаров в корзине, вы можете использовать условную функцию WordPress has_term().
Попробуйте вместо этого (для Woocommerce 3+):
// Updating cart item prices conditionally
add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 100, 1 );
function custom_cart_item_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Your product categories to avoid
$categories = array("shirts", "games");
foreach ( $cart->get_cart() as $cart_item ) {
if ( isset($cart_item['wccpf_cost']['user_val']) && ! has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
$cart_item['data']->set_price($cart_item['wccpf_cost']['user_val']);
}
}
}
Код находится в файле function.php вашей активной дочерней темы (или активной темы). Должно сработать.
Но если вы хотите настроить таргетинг на родительские категории продуктов, вам нужно будет вместо этого использовать в своем коде настраиваемую условную функцию has_product_categories():
// Custom conditional function that handle parent product categories too
function has_product_categories( $categories, $product_id = 0 ) {
$parent_term_ids = $categories_ids = array(); // Initializing
$taxonomy = 'product_cat';
$product_id = $product_id == 0 ? get_the_id() : $product_id;
if ( is_string( $categories ) ) {
$categories = (array) $categories; // Convert string to array
}
// Convert categories term names and slugs to categories term ids
foreach ( $categories as $category ){
$result = (array) term_exists( $category, $taxonomy );
if ( ! empty( $result ) ) {
$categories_ids[] = reset($result);
}
}
// Loop through the current product category terms to get only parent main category term
foreach( get_the_terms( $product_id, $taxonomy ) as $term ){
if ( $term->parent > 0 ){
$parent_term_ids[] = $term->parent; // Set the parent product category
$parent_term_ids[] = $term->term_id; // (and the child)
} else {
$parent_term_ids[] = $term->term_id; // It is the Main category term and we set it.
}
}
return array_intersect( $categories_ids, array_unique($parent_term_ids) ) ? true : false;
}
// Updating cart item prices conditionally
add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 100, 1 );
function custom_cart_item_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Your product categories to avoid
$categories = array("shirts", "games");
foreach ( $cart->get_cart() as $cart_item ) {
if ( isset($cart_item['wccpf_cost']['user_val']) && ! has_product_categories( $cart_item['product_id'], $categories ) ) {
$cart_item['data']->set_price($cart_item['wccpf_cost']['user_val']);
}
}
}
Код находится в файле function.php вашей активной дочерней темы (или активной темы). Должно сработать.
Связанные темы:
Большое спасибо за предоставленный обновленный окончательный код, так как у меня не так много знаний о php, это действительно полезно. Спасибо, что исправили и обновили пост :)