Что ж, у меня проблема: мне интересно, как я могу создать дополнительные поля над разделами «количество товаров» и «добавить в корзину», чтобы клиент мог персонализировать свой продукт для себя. Я хотел бы иметь возможность сделать это самостоятельно в своей теме без плагинов, если только они не соответствуют этим целям.
Мне интересно, будет ли хорошим выбором использовать подключение «woocommerce_before_add_to_cart_button»? Как мне позже добавить значения этих входных данных к этому продукту, чтобы иметь возможность отображать их в сводке заказа?
В настоящее время у меня есть этот код, который добавляет само поле.
К сожалению, эти поля не отображаются ни в корзине, ни в сводке заказа, ни в АКП. Что я делаю не так? Это правильный путь?
function my_personalization_field() {
$html = '<div class = "personalization-field">';
$html .= '<label for = "personalization">Personalization:</label>';
$html .= '<input type = "text" id = "personalization" name = "my_personalization" />';
$html .= '</div>';
echo $html;
}
add_action('woocommerce_before_add_to_cart_button', 'my_personalization_field');
function my_adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
if ( isset($values['my_personalization']) ) {
$custom_value = $values['my_personalization'];
wc_add_order_item_meta($item_id, 'my_personalization', $custom_value );
}
}
add_action('woocommerce_add_order_item_meta','my_adding_custom_data_in_order_items_meta', 10, 3 );
function my_display_personalization_data_in_cart($product_name, $cart_item, $cart_item_key) {
if (isset($cart_item['my_personalization'])) {
$product_name .= '<br><small>Personalization: ' . esc_html($cart_item['my_personalization']) . '</small>';
}
return $product_name;
}
add_filter('woocommerce_cart_item_name', 'my_display_personalization_data_in_cart', 10, 3);
Вам нужно будет добавить эти данные в сеанс корзины, а затем вы сможете получить к ним доступ на странице корзины/оформления заказа/заказа.
// This captures additional posted information
function custom_add_item_data($cart_item_data, $product_id) {
global $woocommerce;
if (!isset($_POST['my_personalization']))
return $cart_item_data;
$new_value = array();
$new_value['my_personalization'] = $_POST['my_personalization'];
if (empty($cart_item_data)) {
return $new_value;
} else {
return array_merge($cart_item_data, $new_value);
}
}
add_filter('woocommerce_add_cart_item_data','custom_add_item_data',1,10);
// This captures the information from the previous function and attaches it to the item.
function custom_get_cart_items_from_session($item,$values,$key) {
if (array_key_exists( 'my_personalization', $values ) ) {
$item['my_personalization'] = $values['my_personalization'];
}
return $item;
}
add_filter('woocommerce_get_cart_item_from_session', 'custom_get_cart_items_from_session', 1, 3 );
Ваш код немного устарел и неполн. Попробуйте использовать следующий код замены, чтобы отобразить значение настраиваемого поля в корзине, оформлении заказа, заказах и уведомлениях по электронной почте:
add_action('woocommerce_before_add_to_cart_button', 'single_product_custom_field_display');
function single_product_custom_field_display() {
echo '<div class = "personalization-field">
<label for = "personalization">'.__('Personalization:').'</label>
<input type = "text" id = "personalization" name = "personalization" />
</div>';
}
// Save custom fields as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 20, 2 );
function add_custom_cart_item_data( $cart_item_data, $product_id ) {
if ( isset($_POST['personalization']) ) {
$cart_item_data['personalization'] = sanitize_text_field($_POST['personalization']);
}
return $cart_item_data;
}
// Display custom fields in Cart and Checkout
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 20, 2 );
function display_custom_cart_item_data( $cart_data, $cart_item ) {
if ( isset($cart_item['personalization']) ) {
$cart_data[] = array(
'key' => __('Personalization'),
'value' => $cart_item['personalization'],
);
}
return $cart_data;
}
// Save and display custom fields (custom order item metadata)
add_action( 'woocommerce_checkout_create_order_line_item', 'save_order_item_custom_meta_data6', 10, 4 );
function save_order_item_custom_meta_data6( $item, $cart_item_key, $values, $order ) {
if ( isset($values['personalization']) ) {
$item->update_meta_data('personalization', $values['personalization']);
}
}
// Add readable "meta key" label name replacement
add_filter('woocommerce_order_item_display_meta_key', 'filter_wc_order_item_display_meta_key6', 10, 3 );
function filter_wc_order_item_display_meta_key6( $display_key, $meta, $item ) {
if ( $item->get_type() === 'line_item' ) {
if ( $meta->key === 'personalization' ) {
$display_key = __('Personalization');
}
}
return $display_key;
}
Код находится в файле function.php вашей дочерней темы (или в плагине). Протестировано и работает.
На страницах корзины и оформления заказа:
На страницах заказов клиентов:
В уведомлениях по электронной почте:
На страницах заказов администратора:
Огромное спасибо за помощь, это то, что я искал! Теперь мне нужно углубиться в код и понять, как он работает, чтобы иметь возможность расширить его за счет большего количества других полей;) Что касается того, как он работает с другими типами полей, кроме type = "text", принцип будет таким же или будет Мне нужно обратить на что-то внимание? Например, было бы хорошей идеей хранить конфигурацию JSON в таком метаполе, чтобы для пользователя на внешнем интерфейсе она генерировалась сценарием?
Для нескольких полей это несложно, см. этот ответ или этот ответ
Спасибо за подсказку, к сожалению, я тоже это пробовала и в моем случае это не дало желаемого эффекта. Возможно, это будет полезно кому-то еще.