在最近的订单模板和管理订单(woocommerce)上显示产品发布类型高级自定义字段

时间:2022-10-25 10:14:52

I’m trying to display the fields I have created in the recent order template of WooCommerce and I’m not very knowledgeable in PHP.

我正在尝试显示我在最近的WooCommerce订单模板中创建的字段,而且我对PHP不是很了解。

I have created a field called sessions and registered as a product post type. Once a user purchase a product I want thats customs fields "sessions" values to be displayed in the My account > Recent orders (template).

我创建了一个名为sessions的字段,并注册为产品发布类型。用户购买产品后,我希望海关字段“会话”值显示在我的帐户>最近订单(模板)中。

I tried looking for answers and solutions and I seem to be stuck.

我试着寻找答案和解决方案,但我似乎陷入困境。

Here is the customized code of my-order.php template that I have been working on. I have been hacking it for days and can't seem to display this values in my recent orders table.

这是我一直在研究的my-order.php模板的自定义代码。我已经黑了几天了,似乎无法在我最近的订单表中显示这些值。

Updated - added images to and more description to clarify my problem

更新 - 添加图像和更多描述,以澄清我的问题

1.) As you can see here I created two types of fields and registered them as product post type

1.)正如你在这里看到的,我创建了两种类型的字段并将它们注册为产品发布类型

在最近的订单模板和管理订单(woocommerce)上显示产品发布类型高级自定义字段

2.) Then I placed a value on those two fields I have created

2.)然后我在我创建的那两个字段上放置了一个值

在最近的订单模板和管理订单(woocommerce)上显示产品发布类型高级自定义字段

3.) Once a user or customer purchase the item/product/package. I want those two values to be shown on the recent orders of the user my-account template under the column "Sessions"

3.)用户或客户购买物品/产品/包装后。我希望这两个值显示在“会话”列下用户my-account模板的最近订单上

在最近的订单模板和管理订单(woocommerce)上显示产品发布类型高级自定义字段

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

$my_orders_columns = apply_filters( 'woocommerce_my_account_my_orders_columns', array(
    'order-number'   => __( 'Package', 'woocommerce' ),
    'sessions'       => __( 'Session', 'woocommerce' ),
    'order-total'    => __( 'Package Prize', 'woocommerce' ),
    'order-date'     => __( 'Date', 'woocommerce' ),
    'order-end-date' => __( 'End Date', 'woocommerce'),
    'order-status'   => __( 'Status', 'woocommerce' ),
    'order-actions'  => ' ',
) );

$customer_orders = get_posts( apply_filters( 'woocommerce_my_account_my_orders_query', array(
    'numberposts' => $order_count,
    'meta_key'    => '_customer_user',
    'meta_value'  => get_current_user_id(),
    'post_type'   => wc_get_order_types( 'view-orders' ),
    'post_status' => array_keys( wc_get_order_statuses() )
) ) );

if ( $customer_orders ) : ?>

    <h2><?php // echo apply_filters( 'woocommerce_my_account_my_orders_title', __( 'Recent Orders', 'woocommerce' ) ); ?></h2>

    <table class="shop_table shop_table_responsive my_account_orders">

        <thead>
            <tr>
                <?php foreach ( $my_orders_columns as $column_id => $column_name ) : ?>
                    <th class="<?php echo esc_attr( $column_id ); ?>"><span class="nobr"><?php echo esc_html( $column_name ); ?></span></th>
                <?php endforeach; ?>
            </tr>
        </thead>

        <tbody>
            <?php foreach ( $customer_orders as $customer_order ) :
                $order      = wc_get_order( $customer_order );
                $item_count = $order->get_item_count();
                ?>
                <tr class="order">
                    <?php foreach ( $my_orders_columns as $column_id => $column_name ) : ?>
                        <td class="<?php echo esc_attr( $column_id ); ?>" data-title="<?php echo esc_attr( $column_name ); ?>">
                            <?php if ( has_action( 'woocommerce_my_account_my_orders_column_' . $column_id ) ) : ?>
                                <?php do_action( 'woocommerce_my_account_my_orders_column_' . $column_id, $order ); ?>

                            <?php elseif ( 'order-number' === $column_id ) : ?>
                                <?php foreach($order->get_items() as $item) {
                                    $product_name = $item['name'];

                                } ?>

                                <?php echo $product_name;?>

                            <?php elseif ( 'session'  === $column_id ) : ?>
                                <?php if (get_field('session_period', $product->id) ) :  ?>



                            <?php endif; ?>


                            <?php elseif ( 'order-total' === $column_id ) : ?>
                                <?php echo sprintf( _n( '%s', '%s', $item_count, 'woocommerce' ), $order->get_formatted_order_total(), $item_count ); ?>

                            <?php elseif ( 'order-date' === $column_id ) : ?>
                                <time datetime="<?php echo date( 'Y-m-d', strtotime( $order->order_date ) ); ?>" title="<?php echo esc_attr( strtotime( $order->order_date ) ); ?>"><?php echo date_i18n( get_option( 'date_format' ), strtotime( $order->order_date ) ); ?></time>

                            <?php /* Order End Date */ ?>
                            <?php elseif ( 'order-end-date' === $column_id ) : ?>
                                <?php if (get_field('date_ended', $order->id) ) :    ?>
                                <p class="sendungsnummer"><?php the_field('date_ended', $order->id); ?>

                            <?php endif; ?>

                            <?php elseif ( 'order-status' === $column_id ) : ?>
                                <?php echo wc_get_order_status_name( $order->get_status() ); ?>


                            <?php elseif ( 'order-actions' === $column_id ) : ?>
                                <?php
                                    $actions = array(
                                        'pay'    => array(
                                            'url'  => $order->get_checkout_payment_url(),
                                            'name' => __( 'Pay', 'woocommerce' )
                                        ),
                                        'view'   => array(
                                            'url'  => $order->get_view_order_url(),
                                            'name' => __( 'View', 'woocommerce' )
                                        ),
                                        'cancel' => array(
                                            'url'  => $order->get_cancel_order_url( wc_get_page_permalink( 'myaccount' ) ),
                                            'name' => __( 'Cancel', 'woocommerce' )
                                        )
                                    );

                                    if ( ! $order->needs_payment() ) {
                                        unset( $actions['pay'] );
                                    }

                                    if ( ! in_array( $order->get_status(), apply_filters( 'woocommerce_valid_order_statuses_for_cancel', array( 'pending', 'failed' ), $order ) ) ) {
                                        unset( $actions['cancel'] );
                                    }

                                    /* -------- View Button --------
                                    if ( $actions = apply_filters( 'woocommerce_my_account_my_orders_actions', $actions, $order ) ) {
                                        foreach ( $actions as $key => $action ) {
                                            echo '<a href="' . esc_url( $action['url'] ) . '" class="button ' . sanitize_html_class( $key ) . '">' . esc_html( $action['name'] ) . '</a>';
                                        }
                                    }
                                    */
                                ?>
                            <?php endif; ?>
                        </td>
                    <?php endforeach; ?>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
<?php endif; ?>

1 个解决方案

#1


18  

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:

在这里,我们采用的方法与使用ACF插件制作的自定义字段不同。我们创建了一个包含2个字段的专用元数据箱,位于后端产品页面的右侧列中,使用以下代码:

//
//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.

注意:您将此代码粘贴到活动子主题或主题的function.php文件中。

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:

您不需要为这些简单字段使用ACF插件。您还会找到缺少的代码来检索订单ID,产品ID并显示在我的帐户>最近订单表,会话数据:

// 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:

您将使用产品ID(或帖子ID)和模板中的Wordpress函数get_post_meta()访问此数据:

// 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:

这种方法更专业,更清洁:

在最近的订单模板和管理订单(woocommerce)上显示产品发布类型高级自定义字段

This is based on a different problem but some kind of similar:
WooCommerce : Add custom Metabox to admin order page

这基于一个不同的问题,但有些类似:WooCommerce:将自定义Metabox添加到管理订单页面

#1


18  

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:

在这里,我们采用的方法与使用ACF插件制作的自定义字段不同。我们创建了一个包含2个字段的专用元数据箱,位于后端产品页面的右侧列中,使用以下代码:

//
//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.

注意:您将此代码粘贴到活动子主题或主题的function.php文件中。

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:

您不需要为这些简单字段使用ACF插件。您还会找到缺少的代码来检索订单ID,产品ID并显示在我的帐户>最近订单表,会话数据:

// 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:

您将使用产品ID(或帖子ID)和模板中的Wordpress函数get_post_meta()访问此数据:

// 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:

这种方法更专业,更清洁:

在最近的订单模板和管理订单(woocommerce)上显示产品发布类型高级自定义字段

This is based on a different problem but some kind of similar:
WooCommerce : Add custom Metabox to admin order page

这基于一个不同的问题,但有些类似:WooCommerce:将自定义Metabox添加到管理订单页面