2
votes

Caveat: I'm a solo freelance designer not a developer ;-)

I've created a custom field in the Wordpress user meta called membership.

I've tried the following code to save the WooCommerce Product Name to the membership custom field on checkout with help from this answer.

Updated attempt:

function wascc_woocommerce_checkout_update_user_meta_membership ( $customer_id, $posted ) {

    if (isset($posted['$orderid'])) {
        $order = $posted['$orderid'];
    }
    $theorder = new WC_Order( $order );
    $items = $theorder->get_items();

    foreach ( $items as $item ) {
        $product_name = $item['name'];
    }

    if (!(empty($product_name))) {
        update_user_meta( $customer_id, 'membership', $product_name);
    }   

}

add_action( 'woocommerce_checkout_update_user_meta', 'wascc_woocommerce_checkout_update_user_meta_membership', 10, 2 );

It produces no error, but does not save the product name to membership.

Help appreciated.

Last question may be related.

1
Please re-read @Reigel's answer that you've accepted. The 2nd parameter is $posted, which contains the $_POST[] values and not $order_id that you are using in the code above. Because the code cannot find a valid order, its not saving the meta. - Anand Shah
use woocommerce_checkout_update_order_meta from your last question... it has the order id... and you can get customer id from order id... I can't give full code right now cause I'm on mobile... - Reigel
I can't see where the order_id is in woocommerce_checkout_update_order_meta. - Steve
I've updated my attempt above @Reigel. - Steve

1 Answers

2
votes

as I've commented out, you should use woocommerce_checkout_update_order_meta.

Something like this:

function wascc_woocommerce_checkout_update_user_meta_membership ( $order_id ) {

    $theorder = new WC_Order( $order_id );
    $items = $theorder->get_items();

    foreach ( $items as $item ) {
        $product_name = $item['name'];
    }

    if (!(empty($product_name))) {

        // Gets the customer/user ID associated with the order. Guests are 0.
        $customer_id = $theorder->get_user_id();

        update_user_meta( $customer_id, 'membership', $product_name );

    }   

}

add_action( 'woocommerce_checkout_update_order_meta', 'wascc_woocommerce_checkout_update_user_meta_membership' );

I have doubts with your foreach loop though... you are looping just to get the last item?