Я хотел бы добавить новый вариант в раскрывающийся список вариантов акций для продукта. По умолчанию «Нет на складе», «На складе», и я хотел бы добавить третий вариант.
Я нашел метод, который отображает выпадающий список (в классе-wc-meta-box-product-data.php)
// Stock status woocommerce_wp_select( array( 'id' => '_stock_status', 'wrapper_class' => 'hide_if_variable', 'label' => __( 'Stock status', 'woocommerce' ), 'options' => array( 'instock' => __( 'In stock', 'woocommerce' ), 'outofstock' => __( 'Out of stock', 'woocommerce' ) ), 'desc_tip' => true, 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ) ) ); do_action( 'woocommerce_product_options_stock_status' );
Но я не хочу напрямую редактировать класс Woocommerce, чтобы мы могли обновлять Woocommerce, не теряя при этом никакого пользовательского кода. Есть ли способ переопределить этот метод?
для любого заинтересованного, вот полное решение, основанное на подходе Лейлы. Предупреждение! Мое решение предназначено для работы только с отключенной опцией «управлять запасами» WooCommerce! Я не работаю с точными суммами на складе. Весь код идет на functions.php
, как обычно.
Удаление поля выпадающего списка состояния. Добавление класса CSS для выделения моего нового настраиваемого поля. В раскрывающемся списке появилась новая опция «По запросу».
function add_custom_stock_type() { ?> <script type="text/javascript"> jQuery(function(){ jQuery('._stock_status_field').not('.custom-stock-status').remove(); }); </script> <?php woocommerce_wp_select( array( 'id' => '_stock_status', 'wrapper_class' => 'hide_if_variable custom-stock-status', 'label' => __( 'Stock status', 'woocommerce' ), 'options' => array( 'instock' => __( 'In stock', 'woocommerce' ), 'outofstock' => __( 'Out of stock', 'woocommerce' ), 'onrequest' => __( 'On Request', 'woocommerce' ), // The new option !!! ), 'desc_tip' => true, 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ) ) ); } add_action('woocommerce_product_options_stock_status', 'add_custom_stock_type');
К сожалению, WooCommerce сохранит только значения «instock» или «outofstock» с помощью собственных функций. Поэтому после обработки данных продукта я снова должен повторно сохранить свой запас.
function save_custom_stock_status( $product_id ) { update_post_meta( $product_id, '_stock_status', wc_clean( $_POST['_stock_status'] ) ); } add_action('woocommerce_process_product_meta', 'save_custom_stock_status',99,1);
И последнее: мне нужно изменить данные, возвращаемые get_availability()
. Когда «управление запасами» отключено, WooCommerce снова знает значения «instock» и «outofstock». Таким образом, я проверяю состояние запасов самостоятельно.
function woocommerce_get_custom_availability( $data, $product ) { switch( $product->stock_status ) { case 'instock': $data = array( 'availability' => __( 'In stock', 'woocommerce' ), 'class' => 'in-stock' ); break; case 'outofstock': $data = array( 'availability' => __( 'Out of stock', 'woocommerce' ), 'class' => 'out-of-stock' ); break; case 'onrequest': $data = array( 'availability' => __( 'On request', 'woocommerce' ), 'class' => 'on-request' ); break; } return $data; } add_action('woocommerce_get_availability', 'woocommerce_get_custom_availability', 10, 2);
Может быть, это не пуленепробиваемое решение … В конце концов, я его обновлю.
Ну, я закончил тем, что скрыл выпадающий вариант опциона на акции в Javascript
add_action('woocommerce_product_options_stock_status', 'add_custom_stock_type'); function add_custom_stock_type() { // Stock status - We remove the default one ?> <script type="text/javascript"> jQuery('_stock_status').remove(); </script> <?php }
и создал новый, используя этот учебник: http://www.remicorson.com/mastering-woocommerce-products-custom-fields/ Не уверен, что это самое чистое решение, но оно по крайней мере не касается основных файлов! 🙂