Для владельцев магазинов, использующих WooCommerce, доступна функция, которая позволяет покупателям вводить свою собственную цену на странице продукта. Назовем ее «динамическая цена для продукта». Это удобно для принятия пожертвований, оплаты счетов или предоставления опций для ввода кастомизированных сумм.
Для этого нужно создать простой продукт с ценой $0 и вставить фрагмент кода в functions.php, который найдете ниже. Это отобразит поле ввода, где покупатели смогут ввести свою цену. После того, как покупатель выбрал цену, она будет автоматически пере-определена в корзине, на странице оформления заказа и в самом заказе.
Для использования этой функции необходимо создать простой продукт и получить его ID, чтобы указать его в коде. Название продукта может быть любым, например, «Пожертвование» или «Оплата счета». Данный код вставьте в файл functions.php вашей темы.
add_action( 'woocommerce_before_add_to_cart_button', 'genius_product_price_input', 9 );
function genius_product_price_input() {
global $product;
//150891 - это ид продукта
if ( 150891 !== $product->get_id() ) return;
woocommerce_form_field( 'set_price', array(
'type' => 'text',
'required' => true,
'label' => 'Set price ' . get_woocommerce_currency_symbol(),
));
}
add_filter( 'woocommerce_add_to_cart_validation', 'genius_product_add_on_validation', 9999, 3 );
function genius_product_add_on_validation( $passed, $product_id, $qty ) {
if ( isset( $_POST['set_price'] ) && sanitize_text_field( $_POST['set_price'] ) == '' ) {
wc_add_notice( 'Set price is a required field', 'error' );
$passed = false;
}
return $passed;
}
add_filter( 'woocommerce_add_cart_item_data', 'genius_product_add_on_cart_item_data', 9999, 2 );
function genius_product_add_on_cart_item_data( $cart_item, $product_id ) {
if ( 150891 !== $product_id ) return $cart_item;
$cart_item['set_price'] = sanitize_text_field( $_POST['set_price'] );
return $cart_item;
}
add_action( 'woocommerce_before_calculate_totals', 'genius_alter_price_cart', 9999 );
function genius_alter_price_cart( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
if ( 150891 !== $product->get_id() ) continue;
$cart_item['data']->set_price( $cart_item['set_price'] );
}
}