添加链接到 WooCommerce 管理订单列表中收到的订单 URL 的按钮

问题描述 投票:0回答:1

我正在尝试将收到的订单 URL 保存在管理区域“订单详细信息页面”中。

根据2年零7个月前发布的这篇文章,它应该可以工作,但我遵循了问题中描述的所有两个简单步骤,并且它没有在“订单详细信息页面”上显示任何带有已收到订单的URL的链接”或在“订单列表”上。

如何获取每个订单的已接收订单 URL 以及密钥

我不知道与 woocommerce 版本是否存在一些不兼容。不知道环境变量是否有变化。

任何人都可以指出我错在哪里吗?

提前谢谢你!

复制文章中描述的内容:.

第一步:@rur165

我们可以使用wc_get_endpoint_url函数来获取订单接收页面URL

要在我的帐户页面上的订单列表下显示此内容,您必须编辑模板 -

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

在此模板中,第 1 行之后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>';

这是整个页面:

<?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 步:@hemant-ahir

嘿,是的,我做到了。我希望下面的代码可以帮助别人!

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

}

php wordpress woocommerce hook-woocommerce orders
1个回答
0
投票

要获取订单接收 URL(带有订单 ID 和订单密钥),只需使用以下方法(来自 WC_Order 对象):

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

$order_received_url = $order->get_checkout_order_received_url();

现在要在管理订单列表中添加一个带有该订单接收网址的按钮,请尝试:

/ 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")
        );
    }
}

代码位于子主题的functions.php文件中(或插件中)。已测试并有效。

您将得到:

相关:自定义操作按钮进入 WooCommerce 管理订单列表上的自定义列

© www.soinside.com 2019 - 2024. All rights reserved.