do 2. części pytania: Jeżeli używasz tylko proste typy produktów (bez odmian), a następnie można dodać pola niestandardowe cena do strony danych produktów i filtrować za pomocą woocommerce_get_price_html cenę.
add_filter('woocommerce_get_price_html','so24863612_custom_price');
function so24863612_custom_price(){
global $post;
$_postID = $post->ID;
$product = get_product($_postID);
$UK_price = get_post_meta($_postID, '_UK_price', true); //loads custom meta data
$return_price = $product->get_regular_price(); //default to regular price
if (!empty($UK_price)) {
$return_price = $UK_price;
}
return $return_price;
}
Można tworzyć i zapisywać pól niestandardowych na stronie produktu jak ten:
//Display custom fields on product data page in admin
add_action('woocommerce_product_options_general_product_data', 'so24963039_display_custom_general_tab_fields');
function so24963039_display_custom_general_tab_fields() {
global $woocommerce, $post;
$UK_price = get_post_meta($post->ID, '_UK_price', true);
woocommerce_wp_text_input(
array(
'id' => '_UK_price',
'label' => __('UK Price (£)', 'woocommerce'),
'value' => $UK_price,
'desc_tip' => 'false'
)
);
}
//Save custom fields to access via get_post_meta
add_action('woocommerce_process_product_meta', 'so24963039_save_custom_general_tab_fields');
function so24963039_save_custom_general_tab_fields ($post_id) {
$woocommerce_UK_price = $_POST['_UK_price'];
if(!empty($woocommerce_UK_price))
update_post_meta($post_id, '_UK_price', esc_attr($woocommerce_UK_price));
}
----------------- W przypadku produktów o Variations- ---------------------------
OSTRZEŻENIE: Produkty zmienne są znacznie bardziej skomplikowane i nie jestem prawie tak pewny w tej odpowiedzi tak jak ja z prostymi produktami część powyżej, ale tutaj jest moje obecne zrozumienie tak czy inaczej. Miałem pewne problemy z wyświetlaniem mini-cart, które musiałem włamać się przy użyciu tej metody (co wyjaśnię na końcu), ale sumy są obliczane poprawnie zarówno w mini-wózku, jak i zwykłym wózku.
Najpierw chcemy dodać nowe pola do każdego wariantu na karcie zmienności istniejących produktów:
add_action('woocommerce_product_after_variable_attributes', 'so24963039_variable_fields', 10, 2); //Display Fields
function so24963039_variable_fields($loop, $variation_data) {
echo '<tr><td>';
woocommerce_wp_text_input(
array(
'id' => '_variant_UK_price['.$loop.']',
'label' => __('UK Price (£)', 'woocommerce'),
'desc_tip' => 'false',
'value' => $variation_data['_variant_UK_price'][0]
)
);
echo '</td></tr>';
}
Musimy również dodać je dynamicznie, gdy użytkownik dodaje nowe warianty na stronie edycja produktu:
add_action('woocommerce_product_after_variable_attributes_js', 'so24963039_variable_fields_js'); //JS to add fields for dynamically added new variations
function so24963039_variable_fields_js(){ //add fields to new variations that get added
echo '<tr><td>';
woocommerce_wp_text_input(
array(
'id' => '_variant_UK_price[ + loop + ]',
'label' => __('UK Price (£)', 'woocommerce'),
'desc_tip' => 'false',
'value' => $variation_data['_variant_UK_price'][0]
)
);
echo '</td></tr>';
}
Następnie zapisz zmiany w polach niestandardowych w sprawie zmiany meta danych:
add_action('woocommerce_process_product_meta_variable', 'so24963039_save_variable_fields', 10, 1); //Save variation fields
function so24963039_save_variable_fields($post_id) {
if (isset($_POST['variable_sku'])) {
$variable_sku = $_POST['variable_sku'];
$variable_post_id = $_POST['variable_post_id'];
// Variant Tier 1 Price
$_variant_UK_price = $_POST['_variant_UK_price'];
for ($i = 0; $i < sizeof($variable_sku); $i++) {
$variation_id = (int) $variable_post_id[$i];
if (isset($_variant_UK_price[$i])) {
update_post_meta($variation_id, '_variant_UK_price', stripslashes($_variant_UK_price[$i]));
}
}
}
}
Teraz, gdy mamy nasze zwyczaj zmienności meta danych, możemy do niego dostęp w module zwyczaj cenowej tak:
add_filter('woocommerce_get_price_html','so24863612_custom_price');
function so24863612_custom_price(){
global $post;
$_postID = $post->ID;
$product = get_product($_postID);
$product_type = $product->product_type;
$UK_price = get_post_meta($_postID, '_UK_price', true); //covers simple products
if($product_type == 'variation'){ //override with variant prices
$UK_price = get_post_meta($_postID, '_variant_$UK_price', true);
}
$return_price = $product->get_regular_price(); //default to regular price
if (!empty($UK_price)) {
$return_price = $UK_price;
}
return $return_price;
}
Teraz wierzę, że część powinna mieć wszystko działa z wyjątkiem wyświetlaczu mini-koszyka. Z jakiegoś powodu wydaje mi się, że po prostu nie mogłem wymyślić, jak uzyskać dostęp do danych meta wariacji, aby zmusić go do prawidłowego wyświetlania w mini koszyku - tak jak znalazłem miejsce, w którym generowany był ekran mini-cart, ale miałem problemy uzyskanie odpowiedniej ścieżki kontekstowej w celu uzyskania dostępu do zmiennej niestandardowej, więc musiałem to zrobić w szablonie-tags.php i przekazać tablicę wartości niestandardowych do opcjonalnego parametru w mojej funkcji ceny niestandardowej. To wydaje się bardzo "złe", jeśli chodzi o sposób, w jaki powinniśmy robić różne rzeczy, ale wykonuje to zadanie. Jestem bardzo otwarty na "właściwe" rozwiązanie tej części problemu.
W szablonach tags.php:
<div class="small-7 large-7 columns"><?php
$product_title = $_product->get_title();
echo '<a class="cart_list_product_title" href="'.get_permalink($cart_item['product_id']).'">' . apply_filters('woocommerce_cart_widget_product_title', $product_title, $_product) . '</a>';
echo '<div class="cart_list_product_price">';
//original line: echo woocommerce_price($_product->get_price());
/*Custom Price Override Block*/
$_productID = $_product->id;
$product_type = $_product->product_type;
if($product_type == 'variation') {
$custom_field_data = $_product->product_custom_fields;
$regular_price = $custom_field_data['_regular_price'];
$custom_UK_price = $custom_field_data['_variant_UK_price'];
$custom_variant_prices = [$regular_price[0], $custom_UK_price[0]];
echo so24863612_get_custom_price($_productID, $custom_variant_prices);
} else {
echo so24863612_get_custom_price($_productID);
}
/*End Custom Price Override Block*/
echo ' /</div>';
echo '<div class="cart_list_product_quantity">'.__('Quantity', 'woocommerce').': '.$cart_item['quantity'].'</div>';
?></div>
Proszę sprawdzić odpowiedź –