Я пытаюсь добавить в пользовательский stock_status для woocommerce 3.0 в wordpress.
Конечная цель состоит в том, чтобы добавить третью опцию инвентаризации на странице редактирования продукта «Вкл.» И отобразить состояние запаса на странице продукта.
Раньше я был в состоянии использовать этот метод здесь: добавьте опцию запаса в woocommerce , которая работает, чтобы добавить дополнительные параметры запаса в администратор продукта, но похоже, что с Woocommerce 3.0 есть что-то, превышающее мои настройки на фактической странице продукта. Он также работал над страницей продуктов, пока я не обновил ее до 3.0.
Мои функции.php:
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' ), 'onhold' => __( 'On Hold', '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'); 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); function woocommerce_get_custom_availability( $data, $product ) { switch( $product->get_stock_status ) { case 'onhold': $data = array( 'availability' => __( 'On Hold', 'woocommerce' ), 'class' => 'on-hold' ); break; 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; } return $data; } add_action('woocommerce_get_availability', 'woocommerce_get_custom_availability', 3, 2);
https://pastebin.com/EFtBVY9h
Я вижу в БД, что stock_status правильно устанавливает значение «On Hold», мой пользовательский статус, когда я выбираю его в admin, но это не применяется на странице фактических продуктов.
Чтобы проверить, я изменил свой price.php, чтобы просто вывести состояние запаса:
<p class="price"> <?php $stockamount = $product->get_stock_quantity(); $price = $product->get_price_html(); $stockstatus = $product->get_stock_status(); $pricelabelone = "Out of Stock"; $pricelabeltwo = "On Hold"; echo $stockstatus; ?> </p>
Однако, хотя я устанавливал продукты на «On Hold» (и это экономит), страница продукта всегда выводит «In Stock» (тестовый продукт: http://aegis-staging.byethost7.com/dgh/product/santa -cruz-h13-custom-42-cocobolo-and-moon-spruce / ).
Что мне не хватает?
Это решение может помочь вам решить вашу проблему. Используйте «get_post_meta ()» вместо использования get_stock_status (), чтобы получить статус запаса.
Пройдите код крюка «woocommerce_get_availability», как показано ниже.
function woocommerce_get_custom_availability( $data, $product ) { $stock_status = get_post_meta($product->id , '_stock_status' , true ); switch( $stock_status ) { case 'onhold': $data = array( 'availability' => __( 'On Hold', 'woocommerce' ), 'class' => 'on-hold' ); break; 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; } return $data; } add_action('woocommerce_get_availability', 'woocommerce_get_custom_availability', 3, 2);