2016-08-30 42 views
5

Üretim için birkaç gün eklemek üzere, ürün sayfalarının genel ayarları sekmesinde WooCommerce Yönetimi'nde bir Özel Alan oluşturdum. Bu özel alan değerini her bir ürünün adının üzerindeki alışveriş sepeti ve ödeme sayfalarına göstermek istiyorum.Yönetici ürün sayfalarında özel alan Kart ve kasada görüntülenir

İşte benim kodudur:

// Insert a Custom Admin Field 
function woo_add_custom_general_fields() { 

    echo '<div class="options_group">'; 

    woocommerce_wp_text_input(array( 
     'id'    => 'days_manufacture', 
     'label'    => __('Days for Manufacture', 'woocommerce'), 
     'placeholder'  => '', 
     'description'  => __('Insert here', 'woocommerce'), 
     'type'    => 'number', 
     'custom_attributes' => 
     array(
      'step' => 'any', 
      'min' => '1' 
     ) 
    )); 
    echo '</div>'; 
} 
add_action('woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields'); 


// Save field 
function woo_add_custom_general_fields_save($post_id){ 
    $woocommerce_number_field = $_POST['days_manufacture']; 
    if(!empty($woocommerce_number_field)) 
     update_post_meta($post_id, 'days_manufacture', esc_attr($woocommerce_number_field)); 
} 
add_action('woocommerce_process_product_meta', 'woo_add_custom_general_fields_save'); 


function save_days_field($cart_item_data, $product_id) { 
    if(isset($_REQUEST['days_manufacture'])) { 
     $cart_item_data[ 'days_manufacture' ] = get_post_meta($post->ID, 'days_manufacture',true); 

/* below statement make sure every add to cart action as unique line item */ 

    $cart_item_data['unique_key'] = md5(microtime().rand()); 
    } 
    return $cart_item_data; 
} 
add_action('woocommerce_add_cart_item_data', 'save_days_field', 10, 2); 


function render_meta_on_cart_and_checkout($cart_data, $cart_item = null) { 
    $custom_items = array(); 
    /* Woo 2.4.2 updates */ 
    if(!empty($cart_data)) { 
     $custom_items = $cart_data; 
    } 
    if(isset($cart_item['days_manufacture'])) { 
     $custom_items[] = array("name" => 'Days:', "value" => $cart_item['days_manufacture']); 
    } 
    return $custom_items; 
} 
add_filter('woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2); 

Ama sepeti ve ödeme sayfalarında özel alan değerini gösteremez olarak bu çalışmıyor.

Bunu nasıl başarabilirim?

Teşekkür

+0

Mükemmel, mükemmel çalıştı. Sen bir dahisin. Çok teşekkür ederim! Bir daha soru, eğer giymeden önce ürünümü ekrana göstermem gerekiyorsa .get_post_meta artık çalışmıyor. –

cevap

3

Ben kodunuzu test edilmiş ve söz konusu ürün özel alan sepeti ve ödeme sayfalarında görünmesi için bazı bölümlerini düzelttik. herhangi bir eklenti dosyasında da

// Insert a Custom Admin Field 
add_action('woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields'); 

function woo_add_custom_general_fields() { 

    echo '<div class="options_group">'; 

    woocommerce_wp_text_input(array(
     'id'    => 'days_manufacture', 
     'label'    => __('Days for Manufacture', 'woocommerce'), 
     'placeholder'  => '', 
     'description'  => __('Insert here', 'woocommerce'), 
     'type'    => 'number', 
     'custom_attributes' => array(
      'step' => 'any', 
      'min' => '1' 
     ), 
    )); 

    echo '</div>'; 
} 


// Save the field 
add_action('woocommerce_process_product_meta', 'woo_add_custom_general_fields_save'); 

function woo_add_custom_general_fields_save($post_id){ 
$woocommerce_number_field = $_POST['days_manufacture']; 
if(!empty($woocommerce_number_field)) 
    update_post_meta($post_id, 'days_manufacture', esc_attr($woocommerce_number_field)); 
} 


// Store custom field 
add_action('woocommerce_add_cart_item_data', 'save_days_field', 10, 2); 

function save_days_field($cart_item_data, $product_id) { 
    $special_item = get_post_meta($product_id , 'days_manufacture',true); 
    if(!empty($special_item)) { 
     $cart_item_data[ 'days_manufacture' ] = $special_item; 

     // below statement make sure every add to cart action as unique line item 
     $cart_item_data['unique_key'] = md5(microtime().rand()); 
     WC()->session->set('days_manufacture', $special_item); 
    } 
    return $cart_item_data; 
} 


// Render meta on cart and checkout 
add_filter('woocommerce_get_item_data', 'rendering_meta_field_on_cart_and_checkout', 10, 2); 

function rendering_meta_field_on_cart_and_checkout($cart_data, $cart_item) { 
    $custom_items = array(); 
    // Woo 2.4.2 updates 
    if(!empty($cart_data)) { 
     $custom_items = $cart_data; 
    } 
    if(isset($cart_item['days_manufacture'])) { 
     $custom_items[] = array("name" => __("Days", "woocommerce"), "value" => $cart_item['days_manufacture']); 
    } 
    return $custom_items; 
} 

Doğal olarak, bu aktif çocuk teması (veya tema) arasında function.php dosyasında gider ya: Burada

bu düzeltilmiş kodudur.

Bu kod test edilmiş ve çalışır.

Referans: WooCommerce : Add custom Metabox to admin order page