电子邮件,管理员订单和“谢谢”页面上的WooCommerce 4.0自定义结帐和ACF字段值

Mostapha Marbouh

我很难将我的自定义字段值打印到电子邮件通知,订购管理员和“谢谢”页面。我浏览了StackOverflow,尝试了找到的每个答案,但不幸的是无法正常工作,但我无法弄清楚问题:我正在尝试传递附加checkout字段的值,它只打印带有空白值的强标签,而电子邮件中没有任何显示,这是到目前为止的代码:

//new pickup location checkout field
add_action( 'woocommerce_before_order_notes', 'pickup_location_custom_checkout_field' );

function pickup_location_custom_checkout_field( $checkout ) {

    echo '<div><h3>' . __('Pick-up location') . '</h3>';

    woocommerce_form_field( 'pick_up_location', array(
        'type'          => 'text',
        'class'         => array('notes'),
        'label'         => __('<span style="color:red">[IMPORTANT]</span> Where should we meet you?'),
        'placeholder'   => __('Please enter your accomodation name or the nearest pick-up point if not accessible by car'),
        'required'     => true,
        ), $checkout->get_value( 'pick_up_location' ));

    echo '</div>';

}

// Save the pickup location data to the order meta
add_action( 'woocommerce_checkout_create_order', 'pickup_location_checkout_field_update_order_meta' );
function pickup_location_checkout_field_update_order_meta( $order_id ) {
    if (!empty($_POST['pick_up_location'])) {
        update_post_meta( $order_id, 'Pick-up location', sanitize_text_field( $_POST['pick_up_location']));
    }
}

// Display 'pickup location' on the order edit page (backend)
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'pickup_location_checkout_field_order_page', 10, 1 );
function pickup_location_checkout_field_order_page($order){
    global $post_id;
    $order = new WC_Order( $post_id );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . get_post_meta($order->get_id(), '_pick_up_location', true ) . '</p>';

// Display 'pickup location' in "Order received" and "Order view" pages (frontend)
add_action( 'woocommerce_order_details_after_order_table', 'display_client_pickup_data_in_orders', 10 );
function display_client_pickup_data_in_orders( $order ) {
    global $post_id;
    $order = new WC_Order( $post_id );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . get_post_meta($order->get_id(), '_pick_up_location', true ) . '</p>';
}

// Display 'pickup location data' in Email notifications
add_filter( 'woocommerce_email_order_meta_fields', 'display_client_pickup_data_in_emails', 10, 3 );

function display_client_pickup_data_in_emails( $fields, $sent_to_admin, $order ) {
    $fields['Pickup Location'] = array(
        'label' => __( 'Pickup Location' ),
        'value' => get_post_meta( $order->get_id(), 'pick_up_location', true ),
    );
    return $fields;
}

不管我尝试什么,该代码仅打印标签,而没有来自结帐表单的任何值。我知道这个问题已经问过很多遍了,但是我尝试了每个答案超过6天而没有运气。我还需要提及的是,我在该项目中使用的是Woocommerce Bookings。谢谢你的帮助


[更新:]在购物车,管理订单,客户订单,结帐和电子邮件中保存并显示ACF字段。感谢@ 7uc1f3r的详细解释,他的回答帮助我以类似的方式显示了ACF字段,它也基于@LoicTheAztec的this回答

在ATC上方的产品页面上显示自定义字段:

// Displaying Pick-up time custom field value in single product page
add_action( 'woocommerce_before_add_to_cart_button', 'add_pickup_time_custom_field', 0 );
function add_pickup_time_custom_field() {
    global $product;
    //(compatibility with WC +3) 
    $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

    echo "<div class='pickup-time-atc'>";
    echo "<span>Pick-up time: </span>";
    echo get_field( 'pick_up_time', $product_id );
    echo "</div>";

    return true;
}

在单个产品页面中显示自定义字段值

将接送时间自定义字段保存到购物车和会话中

// Saving Pick-up time custom field into cart and session
add_filter( 'woocommerce_add_cart_item_data', 'save_pickup_time_custom_field', 10, 2 );
function save_pickup_time_custom_field( $cart_item_data, $product_id ) {
    $custom_field_value = get_field( 'pick_up_time', $product_id, true );
    if( !empty( $custom_field_value ) ) 
    {
        $cart_item_data['pick_up_time'] = $custom_field_value;
    }
    return $cart_item_data;
}

在购物车和结帐时呈现提货时间自定义字段元

// Render Pick-up time meta on cart and checkout
add_filter( 'woocommerce_get_item_data', 'render_pickuptime_meta_on_cart_and_checkout', 10, 2 );
function render_pickuptime_meta_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['pick_up_time'] ) ) {
        $custom_items[] = array( "name" => "Pickup time", "value" => $cart_item['pick_up_time'] );
    }
    return $custom_items;
}

在购物车和结帐时呈现自定义字段元

将自定义字段元添加到订单管理员详细信息

// Add pickup time custom field meta to order admin
add_action( 'woocommerce_checkout_create_order_line_item', 'pickuptime_checkout_create_order_line_item', 10, 4 );
function pickuptime_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
  if( isset( $values['pick_up_time'] ) ) {
    $item->add_meta_data(
      __( 'Pickup time' ),
      $values['pick_up_time'],
      true
    );
  }
}

将自定义字段元添加到订单管理员详细信息

将提取时间自定义字段元添加到电子邮件

// Add pickup time custom field meta to emails
add_filter( 'woocommerce_order_item_name', 'pickuptime_order_item_emails', 10, 2 );
function pickuptime_order_item_emails( $product_name, $item ) {
  if( isset( $item['pick_up_time'] ) ) {
    $product_name .= sprintf(
      '<ul"><li>%s: %s</li></ul>',
      __( '<span style="color:red !important">Pickup time</span>' ),
      esc_html( $item['pick_up_time'] )
     ); 
  }
  return $product_name;
}

将提取时间自定义字段元添加到电子邮件

如果您发现任何错误或改进方法,请发表评论,谢谢。

Woocommerce 4.0.0和Wordpress 5.3.2

7uc1f3r

逐步检查您的代码

update_post_meta( $order_id, 'Pick-up location', sanitize_text_field( $_POST['pick_up_location']));
echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . get_post_meta($order->get_id(), '_pick_up_location', true ) . '</p>';
'value' => get_post_meta( $order->get_id(), 'pick_up_location', true ),

您可以使用Pick-up location_pick_up_locationpick_up_location作为meta_key而这应该是3倍的值相同。

您还会错过按pickup_location_checkout_field_order_page功能关闭的标记

您还会在某些参数上使用错误的参数,等等。

试试这个

//new pickup location checkout field
add_action( 'woocommerce_before_order_notes', 'pickup_location_custom_checkout_field' );
function pickup_location_custom_checkout_field( $checkout ) {
    echo '<div><h3>' . __('Pick-up location') . '</h3>';

    woocommerce_form_field( 'pick_up_location', array(
        'type'          => 'text',
        'class'         => array('notes'),
        'label'         => __('<span style="color:red">[IMPORTANT]</span> Where should we meet you?'),
        'placeholder'   => __('Please enter your accomodation name or the nearest pick-up point if not accessible by car'),
        'required'     => true,
        ), $checkout->get_value( 'pick_up_location' ));

    echo '</div>';
}

// Save the pickup location data to the order meta
add_action( 'woocommerce_checkout_create_order', 'pickup_location_checkout_field_update_order_meta', 10, 2 );
function pickup_location_checkout_field_update_order_meta( $order, $data ) {    
    if ( !empty( $_POST['pick_up_location']) ) {
        $order->update_meta_data( '_pick_up_location', sanitize_text_field( $_POST['pick_up_location'] ) ); // Order meta data
    }
}

// Display 'pickup location' on the order edit page (backend)
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'pickup_location_checkout_field_order_page', 10, 1 );
function pickup_location_checkout_field_order_page( $order ) {
    $pick_up_location = $order->get_meta( '_pick_up_location' );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . $pick_up_location . '</p>';
}

// Display 'pickup location' in "Order received" and "Order view" pages (frontend)
add_action( 'woocommerce_order_details_after_order_table', 'display_client_pickup_data_in_orders', 10 );
function display_client_pickup_data_in_orders( $order ) {
    $pick_up_location = $order->get_meta( '_pick_up_location' );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . $pick_up_location . '</p>';
}

// Display 'pickup location data' in Email notifications
add_filter( 'woocommerce_email_order_meta_fields', 'display_client_pickup_data_in_emails', 10, 3 );
function display_client_pickup_data_in_emails( $fields, $sent_to_admin, $order ) {
    $fields['Pickup Location'] = array(
        'label' => __( 'Pickup Location' ),
        'value' => $order->get_meta( '_pick_up_location' ),
    );
    return $fields;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Woocommerce管理员,订单和电子邮件中显示自定义付款字段

使Woocommerce(3.8.0)管理员电子邮件中包含我在结帐页面上的自定义字段数据

WooCommerce管理员订单页面-删除电子邮件和电话上的超链接

将管理员电子邮件设置为WooCommerce取消和失败订单的密件抄送

在Woocommerce管理员电子邮件通知中显示产品自定义字段值

在订单总数中为Woocommerce谢谢页面和电子邮件添加新行

在Woocommerce管理员订单列表自定义列中显示结帐字段值

在WooCommerce电子邮件通知中为管理员显示自定义字段

仅对WooCommerce管理员电子邮件通知显示自定义字段

在WooCommerce管理员订单页面上将产品自定义字段显示为订单项元

在WooCommerce订单和电子邮件通知中显示自定义字段值

如何向管理员和客户发送暂停 WooCommerce 电子邮件通知

在opencart(2.0.3.1)订单电子邮件(客户和管理员)的运输成本上增加税金

在WooCommerce的电子邮件和订单页面中保存并显示产品自定义数据

在Woocommerce管理员订单页面中保存订单项自定义字段

在Woocommerce管理员电子邮件通知中显示产品ACF值

在电子邮件通知上显示WooCommerce自定义结帐字段值

在Woocommerce订单和电子邮件中显示产品变体的自定义字段

如何为WooCommerce订单页面(管理员)添加自定义字段?

Woocommerce管理员编辑订单页面常规部分中的自定义可编辑字段

在Woocommerce购物车和结帐项目中显示自定义字段的值

重新排列和自定义woocommerce结帐字段

调用并显示WooCommerce自定义结帐字段值

在Woocommerce中捕获自定义结帐字段值

如何在WooCommerce管理员单笔订单中显示自定义结帐账单字段

发送给管理员的 WooCommerce 电子邮件通知中的自定义格式地址部分

根据商品自定义字段的最高值在购物车和结帐页面上添加通知

在Woocommerce管理员订单编辑页面中以编程方式添加自定义订单注释

在Woocommerce订单和电子邮件中的订单总数之后添加自定义文本