1

I am using the FooEvents plugin to capture event attendee information on WooCommerce event products. When an order is placed, that plugin is saving the attendee information to the WooCommerce order meta as a custom field Array.

Using the Post Meta Inspector plugin, I am able to see that the attendee information is being saved as a meta key of WooCommerceEventsOrderTickets and with a value of:

'a:1:{i:1;a:1:{i:1;a:18:{s:26:"WooCommerceEventsProductID";i:454;s:24:"WooCommerceEventsOrderID";i:4609;s:27:"WooCommerceEventsTicketType";s:0:"";s:23:"WooCommerceEventsStatus";s:6:"Unpaid";s:27:"WooCommerceEventsCustomerID";s:2:"64";s:29:"WooCommerceEventsAttendeeName";s:13:"AttendeeFirst";s:33:"WooCommerceEventsAttendeeLastName";s:12:"AttendeeLast";s:30:"WooCommerceEventsAttendeeEmail";s:19:"jon@freshysites.com";s:34:"WooCommerceEventsAttendeeTelephone";s:12:"607-123-4567";s:32:"WooCommerceEventsAttendeeCompany";s:0:"";s:36:"WooCommerceEventsAttendeeDesignation";s:0:"";s:27:"WooCommerceEventsVariations";a:1:{s:33:"attribute_pa_registration-options";s:14:"nassgap-member";}s:28:"WooCommerceEventsVariationID";i:4078;s:22:"WooCommerceEventsPrice";s:118:"<span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>675.00</span>";s:35:"WooCommerceEventsPurchaserFirstName";s:3:"Jon";s:34:"WooCommerceEventsPurchaserLastName";s:6:"Fuller";s:31:"WooCommerceEventsPurchaserEmail";s:19:"example@gmail.com";s:37:"WooCommerceEventsCustomAttendeeFields";a:6:{s:24:"fooevents_custom_address";s:15:"123 Attendee St";s:21:"fooevents_custom_city";s:13:"Attendee City";s:31:"fooevents_custom_state/province";s:6:"Nevada";s:28:"fooevents_custom_postal_code";s:5:"13813";s:29:"fooevents_custom_organization";s:12:"Attendee LLC";s:22:"fooevents_custom_title";s:14:"Attendee Title";}}}}'

I am looking to grab the values within the array, to use that information — to be able to display certain field values within:

  • WooCommerce order emails
  • in the backend Orders table screen (as a new column)
  • within the "Order details" when viewing/editing the order, so that the data is more easily visible (e.g., below the Billing or Shipping details)

I would like to be able to grab certain meta values from the array, such as WooCommerceEventsAttendeeName, WooCommerceEventsAttendeeLastName, fooevents_custom_state/province, fooevents_custom_address, fooevents_custom_title, etc.

This PHP snippet will add a field to the Order Emails, but how to I edit this to that I can get it to display some of the meta from within that array?

 /**
 * Add a custom field (in an order) to the emails
 */
add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 );

function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    $fields['meta_key'] = array(
        'label' => __( 'Label' ),
        'value' => get_post_meta( $order->id, 'meta_key', true ),
    );
    return $fields;
}

Update:

I have echoed a the meta value of that key, for a particular WooCommerce order by using

echo '<pre>'; print_r( get_post_meta( '4609', 'WooCommerceEventsOrderTickets', true ) ); echo '</pre>';

This is what shows:

Array
(
    [1] => Array
        (
            [1] => Array
                (
                    [WooCommerceEventsProductID] => 454
                    [WooCommerceEventsOrderID] => 4609
                    [WooCommerceEventsTicketType] => 
                    [WooCommerceEventsStatus] => Unpaid
                    [WooCommerceEventsCustomerID] => 64
                    [WooCommerceEventsAttendeeName] => AttendeeFirst
                    [WooCommerceEventsAttendeeLastName] => AttendeeLast
                    [WooCommerceEventsAttendeeEmail] => jon@freshysites.com
                    [WooCommerceEventsAttendeeTelephone] => 607-123-4567
                    [WooCommerceEventsAttendeeCompany] => 
                    [WooCommerceEventsAttendeeDesignation] => 
                    [WooCommerceEventsVariations] => Array
                        (
                            [attribute_pa_registration-options] => nassgap-member
                        )

                    [WooCommerceEventsVariationID] => 4078
                    [WooCommerceEventsPrice] => $675.00
                    [WooCommerceEventsPurchaserFirstName] => Jon
                    [WooCommerceEventsPurchaserLastName] => Fuller
                    [WooCommerceEventsPurchaserEmail] => freshyjon@gmail.com
                    [WooCommerceEventsCustomAttendeeFields] => Array
                        (
                            [fooevents_custom_address] => 123 Attendee St
                            [fooevents_custom_city] => Attendee City
                            [fooevents_custom_state/province] => Nevada
                            [fooevents_custom_postal_code] => 13813
                            [fooevents_custom_organization] => Attendee LLC
                            [fooevents_custom_title] => Attendee Title
                        )

                )

        )

)
LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
Garconis
  • 773
  • 11
  • 31
  • @LoicTheAztec is there a way to unserialize it? It looks like this data is also stored in its own post type of event_magic_tickets which also includes a reference to the original order number: https://freshysites.d.pr/w1rUI0 It's being stored in the wp_postmeta db table: https://freshysites.d.pr/i2JOuM – Garconis May 10 '18 at 14:56
  • Within the `wp_postmeta` table, there is also the actual array as previously pasted here. The `meta_key` is `WooCommerceEventsOrderTickets` and the `meta_value` changes for each post (Order). One example is pasted in the question above. Here is a screenshot: https://freshysites.d.pr/YWSB5R Those post IDs are the WooCommerce orders. – Garconis May 10 '18 at 15:27
  • `print_` didn't work, but `print_r` did, if that's what you meant. I've updated the question above with the output of the array. – Garconis May 10 '18 at 15:47
  • 1
    sorry it was `print_r` instead of `print_` … So this will be much more useful now. thanks – LoicTheAztec May 10 '18 at 15:50

2 Answers2

2

Try something like the following (as I can't really test it, you may should arrange it):

add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 );
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    $event = get_post_meta( $order->get_id(), 'WooCommerceEventsOrderTickets', true );

    if( ! is_array($event) ) return $fields;

    $event = isset($event[1][1]) ? $event[1][1] : '';

    if( sizeof($event) == 0 ) return $fields;

    $custom = isset($event['WooCommerceEventsCustomAttendeeFields']) ? $event['WooCommerceEventsCustomAttendeeFields'] : '';

    // Set our array of needed data
    $fields_array = [
        __('First name')    => isset($event['WooCommerceEventsAttendeeName']) ? $event['WooCommerceEventsAttendeeName'] : '',
        __('Last name')     => isset($event['WooCommerceEventsAttendeeLastName']) ? $event['WooCommerceEventsAttendeeLastName'] : '',
        __('Title')         => isset($custom['fooevents_custom_title']) ? $custom['fooevents_custom_title'] : '',
        __('Organization')  => isset($custom['fooevents_custom_organization']) ? $custom['fooevents_custom_organization'] : '',
        __('Address')       => isset($custom['fooevents_custom_address']) ? $custom['fooevents_custom_address'] : '',
        __('City')          => isset($custom['fooevents_custom_city']) ? $custom['fooevents_custom_city'] : '',
        __('Postcode')      => isset($custom['fooevents_custom_postal_code']) ? $custom['fooevents_custom_postal_code'] : '',
        __('State')         => isset($custom['fooevents_custom_state/province']) ? $custom['fooevents_custom_state/province'] : '',
    ];

    // Loop though the data array to set the fields
    foreach( $fields_array as $label => $value ){
        if( ! empty($value) ){
            $fields[] = array(
                'label' => $label,
                'value' => $value,
            );
        }
    }

    return $fields;
}

Code goes in function.php file of your active child theme (or active theme). It should work.

You will get something like:

enter image description here

Garconis
  • 773
  • 11
  • 31
LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
  • Works great. Thanks! Any advice on being able to use some of these fields as columns in the admin orders table? Also, how would I add an `

    Attendee Info

    ` above the field output if/when there are fields?
    – Garconis May 10 '18 at 19:08
  • You could do everything in a complete different way, including a title and a similar kind of table like the order table with all that custom data inside it. But this is another thing that would not feet in comments over here… – LoicTheAztec May 10 '18 at 19:33
  • I've added a new question: https://stackoverflow.com/questions/50280473/add-woocommerce-order-meta-from-an-array-into-emails-and-as-columns-in-the-adm – Garconis May 10 '18 at 19:48
0

The meta data you've posted appears to be a serialized array. It seems you should simply be able to unserialize it and then loop through the array to retrieve your desired values.

$meta = get_post_meta( $order->id, 'meta_key', true );
$unserialized = unserialize($meta);
foreach ($unserialized as $key => $value) {
   // Isolate values
}
ethan
  • 985
  • 6
  • 10
  • Can you be a bit more descriptive in how to echo out the value of, say `WooCommerceEventsAttendeeName` and also `fooevents_custom_city` – Garconis May 10 '18 at 15:21