0

I'm trying to save the order-received URL in the Admin Area "Order Details Page".

According to this article posted 2 years, 7 months ago, it should work, but I followed all the Two Simple Steps described in the question, and it doesn't display any link with the order-received URL on the "Order Details Page" or on the "Orders List".

How to get order-received URL with key for each orders

I don't know IF there is some incompatibility with the woocommerce version. I don't know IF there was some changes in the environment variables.

Can anyone point me out where I am going wrong please?

Thanyou in advance!

Replicating what is described in the article:.

1 Step: @rur165

We can use the wc_get_endpoint_url function to get the order received page URL

To show this under your order list on the my-account page, you have to edit the template -

woocommerce/templates/my-account/orders.php.

On this template after line no. 67 I have used this code

/* How to get order-received URL with key for each orders */
$order_received_url = wc_get_endpoint_url( 'order-received', $order->get_id(), wc_get_checkout_url() );

$order_received_url = add_query_arg( 'key', $order->get_order_key(), $order_received_url );

echo '<a href="' . esc_url( $order_received_url ) . '" class="woocommerce-button button">' . esc_html( "See order received" ) . '</a>';

Here is the whole page:

<?php
/**
 * Orders
 *
 * Shows orders on the account page.
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/myaccount/orders.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce\Templates
 * @version 7.8.0
 */

defined( 'ABSPATH' ) || exit;

do_action( 'woocommerce_before_account_orders', $has_orders ); ?>

<?php if ( $has_orders ) : ?>

    <table class="woocommerce-orders-table woocommerce-MyAccount-orders shop_table shop_table_responsive my_account_orders account-orders-table">
        <thead>
            <tr>
                <?php foreach ( wc_get_account_orders_columns() as $column_id => $column_name ) : ?>
                    <th class="woocommerce-orders-table__header woocommerce-orders-table__header-<?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->orders as $customer_order ) {
                $order      = wc_get_order( $customer_order ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
                $item_count = $order->get_item_count() - $order->get_item_count_refunded();
                ?>
                <tr class="woocommerce-orders-table__row woocommerce-orders-table__row--status-<?php echo esc_attr( $order->get_status() ); ?> order">
                    <?php foreach ( wc_get_account_orders_columns() as $column_id => $column_name ) : ?>
                        <td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-<?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 ) : ?>
                                <a href="<?php echo esc_url( $order->get_view_order_url() ); ?>">
                                    <?php echo esc_html( _x( '#', 'hash before order number', 'woocommerce' ) . $order->get_order_number() ); ?>
                                </a>

                            <?php elseif ( 'order-date' === $column_id ) : ?>
                                <time datetime="<?php echo esc_attr( $order->get_date_created()->date( 'c' ) ); ?>"><?php echo esc_html( wc_format_datetime( $order->get_date_created() ) ); ?></time>

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

                            <?php elseif ( 'order-total' === $column_id ) : ?>
                                <?php
                                /* translators: 1: formatted order total 2: total order items */
                                echo wp_kses_post( sprintf( _n( '%1$s for %2$s item', '%1$s for %2$s items', $item_count, 'woocommerce' ), $order->get_formatted_order_total(), $item_count ) );
                                ?>

                            <?php elseif ( 'order-actions' === $column_id ) : ?>
                                <?php
                                $actions = wc_get_account_orders_actions( $order );

                                /* Line N° 67 - How to get order-received URL with key for each orders */
                                $order_received_url = wc_get_endpoint_url( 'order-received', $order->get_id(), wc_get_checkout_url() );
                                    $order_received_url = add_query_arg( 'key', $order->get_order_key(), $order_received_url );
                                    echo '<a href="' . esc_url( $order_received_url ) . '" class="woocommerce-button button">' . esc_html( "See order received" ) . '</a>';

                                    if ( ! empty( $actions ) ) {
                                    foreach ( $actions as $key => $action ) { // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
                                        echo '<a href="' . esc_url( $action['url'] ) . '" class="woocommerce-button' . esc_attr( $wp_button_class ) . ' button ' . sanitize_html_class( $key ) . '">' . esc_html( $action['name'] ) . '</a>';
                                    }
                                }
                                ?>
                            <?php endif; ?>
                        </td>
                    <?php endforeach; ?>
                </tr>
                <?php
            }
            ?>
        </tbody>
    </table>

    <?php do_action( 'woocommerce_before_account_orders_pagination' ); ?>

    <?php if ( 1 < $customer_orders->max_num_pages ) : ?>
        <div class="woocommerce-pagination woocommerce-pagination--without-numbers woocommerce-Pagination">
            <?php if ( 1 !== $current_page ) : ?>
                <a class="woocommerce-button woocommerce-button--previous woocommerce-Button woocommerce-Button--previous button<?php echo esc_attr( $wp_button_class ); ?>" href="<?php echo esc_url( wc_get_endpoint_url( 'orders', $current_page - 1 ) ); ?>"><?php esc_html_e( 'Previous', 'woocommerce' ); ?></a>
            <?php endif; ?>

            <?php if ( intval( $customer_orders->max_num_pages ) !== $current_page ) : ?>
                <a class="woocommerce-button woocommerce-button--next woocommerce-Button woocommerce-Button--next button<?php echo esc_attr( $wp_button_class ); ?>" href="<?php echo esc_url( wc_get_endpoint_url( 'orders', $current_page + 1 ) ); ?>"><?php esc_html_e( 'Next', 'woocommerce' ); ?></a>
            <?php endif; ?>
        </div>
    <?php endif; ?>

<?php else : ?>

    <?php wc_print_notice( esc_html__( 'No order has been made yet.', 'woocommerce' ) . ' <a class="woocommerce-Button button' . esc_attr( $wp_button_class ) . '" href="' . esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ) . '">' . esc_html__( 'Browse products', 'woocommerce' ) . '</a>', 'notice' ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment ?>

<?php endif; ?>

<?php do_action( 'woocommerce_after_account_orders', $has_orders ); ?>

2 Step: @hemant-ahir

Hey, yes i did this. I hope below code will help someone !

// Add New column inside order table
add_filter( 'woocommerce_account_orders_columns', 'ahir_add_account_orders_column', 10, 1 );
function ahir_add_account_orders_column( $columns ){
    $columns['custom-column'] = __( 'Order Link', 'woocommerce' );

    return $columns;
}

// Add click here button
add_action( 'woocommerce_my_account_my_orders_column_custom-column', 'ahir_add_account_orders_column_rows' );
function ahir_add_account_orders_column_rows( $order ) {
    // Example with a custom field
   $link_address =  $order->get_checkout_order_received_url();
    echo "<a class='woocommerce-button button view' href='$link_address'>Click here</a>";

}

1 Answer 1

3

To get the order received URL (with order ID and order Key), simply use the following method (from the WC_Order Object):

$order = wc_get_order( $order_id ); // If needed (get the WC_Order Object)

$order_received_url = $order->get_checkout_order_received_url();

Now to add a button with that order received Url in Admin Orders list, try:

// Adding a custom comumn
add_filter( 'manage_edit-shop_order_columns', 'add_thankyou_url_column' );
function add_thankyou_url_column($columns) {
    $columns['thankyou_url'] = __('Order link', 'woocommerce');
    return $columns;
}

// The column content by row
add_action( 'manage_shop_order_posts_custom_column' , 'add_thankyou_url_column_content', 10, 2 );
function add_thankyou_url_column_content( $column, $post_id ) {
    if ( 'thankyou_url' === $column ) {
        global $the_order;

        printf('<p><a class="button thankyou_url" href="%s" target="_blank">%s</a></p>', 
            $the_order->get_checkout_order_received_url(),
            __("Click here", "woocommerce")
        );
    }
}

Code goes in functions.php file of the child theme (or in a plugin). Tested and works.

You will get:

enter image description here

Related: Custom action button into a custom column on WooCommerce admin orders list

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.