В WooCommerce я делаю форму добавления / изменения продукта (в интерфейсе). Мне нужно отобразить поля для изменения стоимости доставки установленных методов, как в панели администратора.
Как мне это сделать?
Вот мой фактический код:
<form> <!-- Various input fields --> <?php foreach ($shipping_methods as $method) { ?> <lebel> <h3><?php echo $method ?></h3> <input type="number" value="<?php //hook for input - output to make changes of shipping price of this method??Which one ?>"> </lebel> <?php } ?> <input type="submit" value="<?php echo $edit_action ? "Save" : "Add"; ?> Product"> </form>
Поскольку методы доставки подключены к зоне доставки, WooCommerce необходимо знать, какая зона доставки клиентов. Таким образом, ваш скрипт не будет работать правильно, пока вы не получите эту информацию.
Чтобы получить эту информацию, клиент должен войти в систему или не войти в систему, необходимо добавить продукт в корзину …
Теперь правильный код для работы вашего скрипта:
// (temporary defining $edit_action for test purpose) // To be removed and replaced by yours $edit_action = true; ?> <form> <!-- Various input fields --> <?php // Get the active shipping methods (Customer is logged in or cart is not empty) $rates = WC()->session->get("shipping_for_package_0")['rates']; if( ! empty($rates) ){ foreach( $rates as $rate_key => $rate ){ $method_id = $rate->method_id; // The method ID slug $instance_id = $rate->instance_id; $rate_id = $rate_key; // The rate ID (maid of: $method_id + ':' + $instance_id) // Or $rate_id = $rate->id; $label = $rate->label; // The method ID Label $cost = $rate->cost; $taxes_array = $rate->taxes; ?> <label> <h3><?php echo $label ?></h3> <input type="number" value="<?php echo number_format($cost, 2); ?>"> </label> <?php } } ?> <input type="submit" value="<?php echo $edit_action ? "Save" : "Add"; ?> Product"> </form>
Протестировано и работает (только при определении зоны доставки клиента) …
Теперь, если вы хотите получить все, как при отправке параметров бэкэнд, вам необходимо:
Так что это намного сложнее …
Вот как начать, но я не нашел способ получить / установить стоимость, поскольку он отличается для каждого типа метода доставки …
// Initializing variable $zones = array(); // Rest of the World zone $zone = new \WC_Shipping_Zone(0); $zones[$zone->get_id()] = $zone->get_data(); $zones[$zone->get_id()]['formatted_zone_location'] = $zone->get_formatted_location(); $zones[$zone->get_id()]['shipping_methods'] = $zone->get_shipping_methods(); // Merging shipping zones $shipping_zones = array_merge( $zones, WC_Shipping_Zones::get_zones() ); foreach ( $shipping_zones as $shipping_zone ) { // Row output (for testing) // echo '<pre>'; print_r($shipping_zone); echo '</pre>'; $zone_id = $shipping_zone['id']; $zone_name = $zone_id == '0' ? __('Rest of the word', 'woocommerce') : $shipping_zone['zone_name']; $zone_locations = $shipping_zone['zone_locations']; // (It's an array) $zone_location_name = $shipping_zone['formatted_zone_location']; $zone_shipping_methods = $shipping_zone['shipping_methods']; foreach ( $zone_shipping_methods as $shipping_method_obj ) { // Row output (for testing) // echo '<pre>'; print_r($shipping_method_obj); echo '</pre>'; echo $shipping_method_obj->id.'<br>'; echo $shipping_method_obj->get_instance_id().'<br>'; echo $shipping_method_obj->get_rate_id().'<br>'; echo $shipping_method_obj->get_method_title().'<br>'; // Generic name echo $shipping_method_obj->get_title().'<br>'; // Customized name } }
Класс, который составляет стоимость доставки, – WC_Shipping_Rate
Другие связанные недавние ответы: Показать стоимость доставки на странице продукта – WooCommerce