2016-06-12 74 views
10

我目前成功添加一个字段,我WooCommerce产品页面,其显示值:结帐页面的购物车(前端)WooCommerce:添加自定义Metabox管理员订购页面

  • 上(前端),
  • 订购页面(前端),
  • 和管理单个订单页面(后端)。

问题:它没有显示为管理命令“自定义字段”中的自定义字段Metabox,其中包含值,但仅作为订单页面中的文本。

这是我工作的代码:

// Add the field to the product 
add_action('woocommerce_before_add_to_cart_button', 'my_custom_checkout_field'); 

function my_custom_checkout_field() { 
    echo '<div id="my_custom_checkout_field"><h3>'.__('My Field').'</h3>'; 
    echo '<label>fill in this field</label> <input type="text" name="my_field_name">'; 
    echo '</div>'; 
} 

// Store custom field 
function save_my_custom_checkout_field($cart_item_data, $product_id) { 
    if(isset($_REQUEST['my_field_name'])) { 
     $cart_item_data[ 'my_field_name' ] = $_REQUEST['my_field_name']; 
     /* 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_my_custom_checkout_field', 10, 2); 

// Render meta on cart and checkout 
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['my_field_name'])) { 
     $custom_items[] = array("name" => 'My Field', "value" => $cart_item['my_field_name']); 
    } 
    return $custom_items; 
} 
add_filter('woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2); 

// This is what I think needs changing? 

function subscription_order_meta_handler($item_id, $values, $cart_item_key) { 
    if(isset($values['my_field_name'])) { 
     wc_add_order_item_meta($item_id, "My Field", $values['my_field_name']); 
    } 
} 
add_action('woocommerce_add_order_item_meta', 'subscription_order_meta_handler', 1, 3); 

我认为这是一个需要改变代码的最后位。它目前显示订单项下的文字,因此我可能需要将wc_add_order_item_meta更改为其他内容?

我用尽了一切办法,但似乎并没有工作。当我的字段位于结帐页面上时,我可以使其工作,但不能从产品页面中将其拉出。

也许我缺少一个结帐流程片断?

+0

自定义字段将有一个DVD列表,所以输出将如下所示:DVD 1,DVD 2.我需要能够删除已发送的DVD,因此我不会将它们发送两次。 –

回答

20

UPDATE 2017/11/02(在Woocommerce完美作品3+)

首先我得到的一切工作已经预期,除了在后端所获得的价值my_field_name订单页面中的“自定义字段”Metabox。

然后,一个真正的噩梦后,我有发现一个相当不错的工作解决方案,比以前更好。在后端,你现在有显示正确的价值,就像这个截图自定义字段my_field_name自定义metabox:

screenshot


我的代码被分成两个部分。

1)后端Metabox为了页面,以示出从产品上的网页的自定义字段来正确的值的可编辑字段(前端):

// Adding Meta container admin shop_order pages 
add_action('add_meta_boxes', 'mv_add_meta_boxes'); 
if (! function_exists('mv_add_meta_boxes')) 
{ 
    function mv_add_meta_boxes() 
    { 
     add_meta_box('mv_other_fields', __('My Field','woocommerce'), 'mv_add_other_fields_for_packaging', 'shop_order', 'side', 'core'); 
    } 
} 

// Adding Meta field in the meta container admin shop_order pages 
if (! function_exists('mv_add_other_fields_for_packaging')) 
{ 
    function mv_add_other_fields_for_packaging() 
    { 
     global $post; 

     $meta_field_data = get_post_meta($post->ID, '_my_field_slug', true) ? get_post_meta($post->ID, '_my_field_slug', true) : ''; 

     echo '<input type="hidden" name="mv_other_meta_field_nonce" value="' . wp_create_nonce() . '"> 
     <p style="border-bottom:solid 1px #eee;padding-bottom:13px;"> 
      <input type="text" style="width:250px;";" name="my_field_name" placeholder="' . $meta_field_data . '" value="' . $meta_field_data . '"></p>'; 

    } 
} 

// Save the data of the Meta field 
add_action('save_post', 'mv_save_wc_order_other_fields', 10, 1); 
if (! function_exists('mv_save_wc_order_other_fields')) 
{ 

    function mv_save_wc_order_other_fields($post_id) { 

     // We need to verify this with the proper authorization (security stuff). 

     // Check if our nonce is set. 
     if (! isset($_POST[ 'mv_other_meta_field_nonce' ])) { 
      return $post_id; 
     } 
     $nonce = $_REQUEST[ 'mv_other_meta_field_nonce' ]; 

     //Verify that the nonce is valid. 
     if (! wp_verify_nonce($nonce)) { 
      return $post_id; 
     } 

     // If this is an autosave, our form has not been submitted, so we don't want to do anything. 
     if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { 
      return $post_id; 
     } 

     // Check the user's permissions. 
     if ('page' == $_POST[ 'post_type' ]) { 

      if (! current_user_can('edit_page', $post_id)) { 
       return $post_id; 
      } 
     } else { 

      if (! current_user_can('edit_post', $post_id)) { 
       return $post_id; 
      } 
     } 
     // --- Its safe for us to save the data ! --- // 

     // Sanitize user input and update the meta field in the database. 
     update_post_meta($post_id, '_my_field_slug', $_POST[ 'my_field_name' ]); 
    } 
} 

2)前端/后端:

•产品页面自定义字段(前端)。
•在购物车上显示此数据,结帐页面和感谢订单(前端)。
•显示订单页面上的数据(后端)

// Add the field to the product 
add_action('woocommerce_before_add_to_cart_button', 'my_custom_product_field'); 
function my_custom_product_field() { 
    echo '<div id="my_custom_field"> 
     <label>' . __('My Field') . ' </label> 
     <input type="text" name="my_field_name" value=""> 
    </div><br>'; 
} 

// Store custom field 
add_action('woocommerce_add_cart_item_data', 'save_my_custom_product_field', 10, 2); 
function save_my_custom_product_field($cart_item_data, $product_id) { 
    if(isset($_REQUEST['my_field_name'])) { 
     $cart_item_data[ 'my_field_name' ] = $_REQUEST['my_field_name']; 
     // below statement make sure every add to cart action as unique line item 
     $cart_item_data['unique_key'] = md5(microtime().rand()); 
     WC()->session->set('my_order_data', $_REQUEST['my_field_name']); 
    } 
    return $cart_item_data; 
} 

// Add a hidden field with the correct value to the checkout 
add_action('woocommerce_after_order_notes', 'my_custom_checkout_field'); 
function my_custom_checkout_field($checkout) { 
    $value = WC()->session->get('my_order_data'); 
    echo '<div id="my_custom_checkout_field"> 
      <input type="hidden" class="input-hidden" name="my_field_name" id="my_field_name" value="' . $value . '"> 
    </div>'; 
} 

// Save the order meta with hidden field value 
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta'); 
function my_custom_checkout_field_update_order_meta($order_id) { 
    if (! empty($_POST['my_field_name'])) { 
     update_post_meta($order_id, '_my_field_slug', $_POST['my_field_name']); 
    } 
} 

// Display field value on the order edit page (not in custom fields metabox) 
add_action('woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1); 
function my_custom_checkout_field_display_admin_order_meta($order){ 
    $my_custom_field = get_post_meta($order->id, '_my_field_slug', true); 
    if (! empty($my_custom_field)) { 
     echo '<p><strong>'. __("My Field", "woocommerce").':</strong> ' . get_post_meta($order->id, '_my_field_slug', true) . '</p>'; 
    } 
} 

// Render meta on cart and checkout 
add_filter('woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2); 
function render_meta_on_cart_and_checkout($cart_data, $cart_item = null) { 
    $custom_items = array(); 
    if(!empty($cart_data)) $custom_items = $cart_data; 

    if(isset($cart_item['my_field_name'])) 
     $custom_items[] = array("name" => 'My Field', "value" => $cart_item['my_field_name']); 

    return $custom_items; 
} 

// Add the information as meta data so that it can be seen as part of the order 
add_action('woocommerce_add_order_item_meta','add_values_to_order_item_meta', 10, 3); 
function add_values_to_order_item_meta($item_id, $cart_item, $cart_item_key) { 
    // lets add the meta data to the order (with a label as key slug) 
    if(! empty($cart_item['my_field_name'])) 
     wc_add_order_item_meta($item_id, __('My field label name'), $cart_item['my_field_name'], true); 
} 

一切工作为目前预计。

+0

我可以请你看看这里的wordpress自定义字段相关的问题http://stackoverflow.com/questions/43782429/wordpress-make-custom-field-values-clickable-to-retrive-them-later? –

+0

@IstiaqueAhmed对不起,但我只回答WooCommerce标记的问题。 – LoicTheAztec

相关问题