2014-11-13 10 views
7

Vorrei aggiungere una nuova opzione all'elenco a discesa delle opzioni di stock per un prodotto. Per impostazione predefinita, c'è "Out of stock", "In stock" e vorrei aggiungere una terza opzione.Aggiungere stock option in woocommerce

ho trovato il metodo che consente di visualizzare il menu a discesa (in classe-wc-meta-box-prodotto-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'); 

Ma io non voglio modificare direttamente classe Woocommerce, in modo da può aggiornare Woocommerce senza perdere alcun codice personalizzato. C'è un modo per scavalcare questo metodo?

+0

Spiacente ma ciò che si sta cercando non è possibile senza alterare i file principali, le cui modifiche andranno perse durante l'aggiornamento. https://support.woothemes.com/hc/communities/public/questions/202868126-Adding-a-stock-choice –

+0

Ho già visto questo link ma mi chiedevo se ci fosse un'altra soluzione. Puoi controllare la mia risposta qui sotto. – Laila

risposta

0

Beh, ho finito per nascondere la prima discesa di stock option in 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 
    } 

e ha creato uno nuovo utilizzando questo tutorial: http://www.remicorson.com/mastering-woocommerce-products-custom-fields/ Non sono sicuro che sia la soluzione più pulita, ma non tocca i file principali almeno ! :)

12

per chiunque sia interessato, ecco la soluzione completa, basata sull'approccio di Laila. Avvertimento! La mia soluzione è destinata a funzionare solo con WooCommerce opzione "Gestisci stock" disabilitata! Non sto lavorando con quantità esatte di articoli in magazzino. Tutto il codice va a functions.php, come al solito.

back-end parte

Rimozione nativo campo discesa magazzino di stato. Aggiunta della classe CSS per distinguere il mio nuovo campo personalizzato. Dropdown ha ora la nuova opzione "Su richiesta".

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'); 

Purtroppo, WooCommerce salverà solo "instock" o "Outofstock" valori con le sue funzioni native. Quindi, dopo l'elaborazione dei dati di prodotto, devo ri-salvare di nuovo il mio stato di magazzino.

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); 

Template parte

E l'ultima cosa - devo modificare i dati restituiti dalla funzione di prodotto get_availability(). Quando "gestione delle scorte" è disattivato, WooCommerce conosce solo i valori "instock" e "outofstock", di nuovo. Quindi ho controllato lo stato delle scorte da solo.

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); 

Forse non è una soluzione a prova di proiettile ... Lo aggiorno, alla fine.

+0

Questo ha funzionato per me grazie. Hai le opzioni in magazzino, esaurito, 1-3 giorni e 3-5 giorni. – marijn

+0

Sembra come add_action ('woocommerce_get_availability', 'woocommerce_get_custom_availability', 10, 2); dovrebbe essere un add_filter per ottenere questo lavoro ,. –

+0

No, 'add_action' e' add_filter' sono le stesse funzioni. Vedi [add_action source code] (https://developer.wordpress.org/reference/functions/add_action/#source). Ma sì, dovrebbe essere add_filter per una migliore comprensione. – Marek