Here we are going on a different approach than custom fields made with ACF plugin. We create a dedicated metabox with 2 fields inside it, located on the right side column in backend product pages, with this code:
//
//Adding Meta container admin product pages
//
add_action( 'add_meta_boxes', 'cc_add_meta_boxes' );
if ( ! function_exists( 'cc_add_meta_boxes' ) )
{
function cc_add_meta_boxes()
{
global $woocommerce, $post;
add_meta_box( 'cc_other_fields', __('Sessions','woocommerce'), 'cc_add_other_fields_for_packaging', 'product', 'side', 'core' );
}
}
//
//adding Meta field in the meta container admin product pages
//
if ( ! function_exists( 'cc_save_wc_order_other_fields' ) )
{
function cc_add_other_fields_for_packaging()
{
global $woocommerce, $product, $post;
$meta_field_session_period = get_post_meta( $post->ID, '_session_period', true ) ? get_post_meta( $post->ID, '_session_period', true ) : '';
$meta_field_number_sessions = get_post_meta( $post->ID, '_number_sessions', true ) ? get_post_meta( $post->ID, '_number_sessions', true ) : '';
echo '<input type="hidden" name="cc_other_meta_field_nonce" value="' . wp_create_nonce() . '">
<p><label style="display:inline-block;" class="cc_opt_label">' . __( "Session period", "your_theme_slug" ) . '</label><br>
<input type="text" style="width:250px;";" name="session_period" placeholder="' . $meta_field_session_period . '" value="' . $meta_field_session_period . '"></p>
<p><label style="display:inline-block;" class="cc_opt_label">' . __( "Number of sessions", "your_theme_slug" ) . '</label><br>
<input type="text" style="width:250px;";" name="number_sessions" placeholder="' . $meta_field_number_sessions . '" value="' . $meta_field_number_sessions . '"><br></p>';
}
}
//Save the data of the product Meta fields pages
add_action( 'save_post', 'cc_save_product_other_fields', 10, 1 );
if ( ! function_exists( 'cc_save_product_other_fields' ) )
{
function cc_save_product_other_fields( $post_id ) {
// We need to verify this with the proper authorization (security stuff).
// Check if our nonce is set.
if ( ! isset( $_POST[ 'cc_other_meta_field_nonce' ] ) ) {
return $post_id;
}
$nonce = $_REQUEST[ 'cc_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, '_session_period', $_POST[ 'session_period' ] );
update_post_meta( $post_id, '_number_sessions', $_POST[ 'number_sessions' ] );
}
}
Note: you will paste this code in the function.php
file of active child theme or theme.
HOW TO USE IT IN YOUR TEMPLATE CODE + THE CORRECTED MISTAKES:
You will not need to use ACF plugin for those simple fields. You will find also the missing code to retrieve order ID, Product ID and to display on My account > recent orders table, the sessions data:
// This is your existing code:
<?php
<?php foreach ( $customer_orders as $customer_order ) :
$order = wc_get_order( $customer_order );
// This way you can retrieve order ID:
$order_id = $order->post->ID;
That you need for:
if (get_field('date_ended', $order_id) ) :
// or
if (get_field('date_ended', $order->post->id) ) :
// instead of:
//get_field('date_ended', $order->id)
// and use </p> instead of <p> at the end of this line:
<p class="sendungsnummer"><?php the_field('date_ended', $order->id); ?></p>
... / ...
foreach($order->get_items() as $item) {
$product_name = $item['name'];
// This way you can retrieve product ID:
$product_id = $item['product_id'];
... / ...
You will access this data with product ID (or post ID) and the Wordpress function get_post_meta()
in your template:
// Then you get your data fields with this two:
$session_period = get_post_meta( $product_id, '_session_period', true );
$number_sessions = get_post_meta( $product_id, '_number_sessions', true );
And you will use them, displaying their values this way:
echo $session_period; // For Session period
echo $number_sessions; // For Number of sessions
... / ...
elseif ( 'sessions' === $column_id ) // <=== It is 'sessions' instead of 'session' !!!
This approach is more professional and cleaner:
This is based on a different problem but some kind of similar:
WooCommerce : Add custom Metabox to admin order page