Search code examples
phpwordpresswoocommercehook-woocommerceorders

Add a button linked to the order received Url in WooCommerce Admin Orders list


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>";

}


Solution

  • 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