Задать вопрос

Как в woocommerce изменить цену продукта в зависимости от текущей даты?

У товара есть обычная цена - выводится как обычно
Добавлено 3 поля для дополнительных цен - Цена1, Цена2, Цена3 (Поля добавлены для вариативного и простого товаров, все сохранятся, но пока не выводится)

Как сделать вывод, например Цена1 с 1 февраля по 15 февраля вместо обычной цены?
У простого товара, а так же у вариаций, в которых такая цена указана?
Это код полей для вариаций
add_action( 'woocommerce_product_after_variable_attributes', 'new_variable_fields', 10, 3 );

function new_variable_fields( $loop, $variation_data, $variation ) {
?>
	<tr>
		<td>
			<?php
			// Вторая цена
			woocommerce_wp_text_input( 
				array( 
					'id'          => 'variable_second_price['.$loop.']', 
					'label'       => __( 'Вторая цена', 'woocommerce' ),
					'value'       => get_post_meta($variation->ID, 'variable_second_price', true)
				)
			);
			?>
		</td>
	</tr>
	<tr>
		<td>
			<?php
			// Третья цена
			woocommerce_wp_text_input( 
				array( 
					'id'          => 'variable_third_price['.$loop.']', 
					'label'       => __( 'Третья цена', 'woocommerce' ),
					'value'       => get_post_meta($variation->ID, 'variable_third_price', true)
				)
			);
			?>
		</td>
	</tr>
	<tr>
		<td>
			<?php
			// Четвертая цена
			woocommerce_wp_text_input( 
				array( 
					'id'          => 'variable_fourth_price['.$loop.']', 
					'label'       => __( 'Четвертая цена', 'woocommerce' ),
					'value'       => get_post_meta($variation->ID, 'variable_fourth_price', true)
				)
			);
			?>
		</td>
	</tr>
<?php
}

add_action( 'woocommerce_product_after_variable_attributes_js', 'new_variable_fields_js' );

function new_variable_fields_js() {
?>
	<tr>
		<td>
			<?php
			// Вторая цена
			woocommerce_wp_text_input( 
				array( 
					'id'          => 'variable_second_price[ + loop + ]', 
					'label'       => __( 'Вторая цена', 'woocommerce' ),
					'value'       => ''
				)
			);
			?>
		</td>
	</tr>
	<tr>
		<td>
			<?php
			// Третья цена
			woocommerce_wp_text_input( 
				array( 
					'id'          => 'variable_third_price[ + loop + ]', 
					'label'       => __( 'Третья цена', 'woocommerce' ),
					'value'       => ''
				)
			);
			?>
		</td>
	</tr>
	<tr>
		<td>
			<?php
			// Четвертая цена
			woocommerce_wp_text_input( 
				array( 
					'id'          => 'variable_fourth_price[ + loop + ]', 
					'label'       => __( 'Четвертая цена', 'woocommerce' ),
					'value'       => ''
				)
			);
			?>
		</td>
	</tr>
<?php
}

add_action( 'woocommerce_save_product_variation', 'save_new_variable_fields', 10, 1 );

function save_new_variable_fields( $post_id ) {
	if (isset( $_POST['variable_sku'] ) ) :
		$variable_sku          = $_POST['variable_sku'];
		$variable_post_id      = $_POST['variable_post_id'];
		
		// Вторая цена
		$variable_second_price = $_POST['variable_second_price'];
		for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
			$variation_id = (int) $variable_post_id[$i];
			if ( isset( $variable_second_price[$i] ) ) {
				update_post_meta( $variation_id, 'variable_second_price', stripslashes( $variable_second_price[$i] ) );
			}
		endfor;
		
		// Третья цена
		$variable_third_price = $_POST['variable_third_price'];
		for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
			$variation_id = (int) $variable_post_id[$i];
			if ( isset( $variable_third_price[$i] ) ) {
				update_post_meta( $variation_id, 'variable_third_price', stripslashes( $variable_third_price[$i] ) );
			}
		endfor;
  
  		// Четвертая цена
		$variable_fourth_price = $_POST['variable_fourth_price'];
		for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
			$variation_id = (int) $variable_post_id[$i];
			if ( isset( $variable_fourth_price[$i] ) ) {
				update_post_meta( $variation_id, 'variable_fourth_price', stripslashes( $variable_fourth_price[$i] ) );
			}
		endfor;
		
	endif;
}


Это код полей для простого товара
add_action( 'woocommerce_product_options_pricing', 'new_simple_fields' );
function new_simple_fields() {
  	// Вторая цена
	woocommerce_wp_text_input( 
	  	array( 
			'id' 	=> 'second_price', 
			'class' => 'wc_input_price', 
			'label' => __( 'Вторая цена', 'woocommerce' ) . '(' . get_woocommerce_currency_symbol() . ')'
	  	)
	);
  	// Третья цена
	woocommerce_wp_text_input( 
	  	array( 
			'id' 	=> 'third_price', 
			'class' => 'wc_input_price', 
			'label' => __( 'Третья цена', 'woocommerce' ) . '(' . get_woocommerce_currency_symbol() . ')'
	  	)
	);
  	// Четвертая цена
	woocommerce_wp_text_input( 
	  	array( 
			'id' 	=> 'fourth_price', 
			'class' => 'wc_input_price', 
			'label' => __( 'Четвертая цена', 'woocommerce' ) . '(' . get_woocommerce_currency_symbol() . ')'
	  	)
	);
}

add_action( 'save_post', 'save_new_simple_fields' );
function save_new_simple_fields( $product_id ) {
  	// Если это автосохранение, то ничего не делаем, сохраняем данные только при нажатии на кнопку Обновить
  	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
	  	return;
  	// Вторая цена
  	if ( isset( $_POST['second_price'] ) ) {
		if ( is_numeric( $_POST['second_price'] ) ) {
	  	update_post_meta( $product_id, 'second_price', $_POST['second_price'] );
		}
  	} else {
		delete_post_meta( $product_id, 'second_price' );
  	}
	// Третья цена
  	if ( isset( $_POST['third_price'] ) ) {
		if ( is_numeric( $_POST['third_price'] ) ) {
	  	update_post_meta( $product_id, 'third_price', $_POST['third_price'] );
		}
  	} else {
		delete_post_meta( $product_id, 'third_price' );
  	}
	// Четвертая цена
  	if ( isset( $_POST['fourth_price'] ) ) {
		if ( is_numeric( $_POST['fourth_price'] ) ) {
	  	update_post_meta( $product_id, 'fourth_price', $_POST['fourth_price'] );
		}
  	} else {
		delete_post_meta( $product_id, 'fourth_price' );
  	}
}


Помогите пожалуйста вывести Цена 1, Цена 2, Цена 3 по дате (дату можно задать в коде, она меняться не будет) вместо обычной цены или цены вариации.
  • Вопрос задан
  • 1857 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Roman-Fov
если даты неизменны, то может CRON??? и никакой мороки...
Ответ написан
Комментировать
trampick
@trampick
Веб-разработчик
Я делал похожую вещь. В зависимости от количества товара в корзине менял цену за единицу. Я примерно опишу что и где нужно сделать для этого.
1. Шагом это надо создать произвольные поля для товаров с различными ценами - у Вас это вроде бы сделано. Сам я использую плагин ACF для добавления произвольных полей.
2. Надо в functions.php создать функцию, которое будет возвращать какую цену надо выводить. Пример функцииb:
function get_type_price(){
  $date = date('d.m.Y');
  if ($date == 'что то там') 
   return 2.
  if ($date == 'что то там') 
   return 3.
  return 1;
}


3. Дальше есть как минимум 2 варианта развития: простой и сложный.

Сложный (более гибкий):
- нужно поменять во всех шаблонах WC вывод цены. Добавить условие типа:
if (get_type_price() == 1) //делать что то
if (get_type_price() == 2) //делать что то
if (get_type_price() == 3) //делать что то

- нужно разобраться как работает class-wc-cart.php и переработать его в свою пользу:)) Суть в том что бы корзина правильно считала скидки, доставки. Что бы отправлялись письма с правильным списком товаров и т.д.
т.е. меняя просто вывод цены в шаблоне не достаточно.

Простой (подходит для Ваших условий)
- по умолчанию у товара WC есть свои произвольные поля цены: _price, _regular_price и т.д.
Нужно добавить условие типа
if (get_type_price() == 2) {
  update_post_meta(get_the_ID(), 'price', get_post_meta(get_the_ID(), 'second_price', true));
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы