在 WooCommerce 我的帐户 - 订单中将 "view-order/order-id" url/endpoint 更改为 "orders/order-id"
Change "view-order/order-id" url/endpoint in WooCommerce My account - orders to "orders/order-id"
当前 URL,在 WooCommerce 'My orders' 选项卡下,当您查看订单详细信息时的按钮等于 /my-account/view-order/ORDER-ID/
我想将此 url 更改为 /my-account/orders/ORDER-ID/ - 所以:
当前url:/my-account/view-order/ORDER-ID/
新 url: /my-account/orders/ORDER-ID/
因此,通过 WooCommerce 设置,我将 view-order 端点更改为 orders
有效,详细查看订单的按钮url已有效更改,只有我在订单详细信息页面上收到以下消息
'No order has been made yet'.
我相信通过下面的代码,可以在/plugins/woocommerce/includes/class-wc-order.php中找到|第 1675 行
/**
* Generates a URL to view an order from the my account page.
*
* @return string
*/
public function get_view_order_url() {
return apply_filters( 'woocommerce_get_view_order_url', wc_get_endpoint_url( 'view-order', $this->get_id(), wc_get_page_permalink( 'myaccount' ) ), $this );
}
我可以实现我的目标,但我可以使用一些建议。谁能指导一下?
将/my-account/view-order/ORDER-ID/url更改为/my-account/orders/ORDER-ID/可以通过应用几个步骤来完成。
步骤 1) 更改视图顺序端点
可以在页面设置部分的 WooCommerce > 设置 > 高级中自定义每个端点的 URL
或者 你使用 woocommerce_get_endpoint_url
过滤器钩子代替
function filter_woocommerce_get_endpoint_url( $url, $endpoint, $value, $permalink ) {
// Specific endpoint
if ( $endpoint === 'view-order' ) {
// New URL
$url = $permalink . 'orders/' . $value;
}
return $url;
}
add_filter( 'woocommerce_get_endpoint_url', 'filter_woocommerce_get_endpoint_url', 10, 4 );
虽然现在更改了端点,但您在查看新的 url 时会看到以下消息:
'No order has been made yet'.
这是因为加载了/myaccount/orders.php模板文件,而这应该是/myaccount/view-order .php模板
步骤 2) 提供加载正确的模板文件,这对于 /my-account/orders/ 和 /my-account/orders/ORDER-ID/ url.
因此我们需要覆盖现有的woocommerce_account_orders()
函数,可以在/includes/wc-template-functions.php文件中找到。这样我们的自定义函数就执行了
function woocommerce_account_orders( $current_page ) {
global $wp;
// For view-order template file
if ( isset( $wp->query_vars['orders'] ) && is_numeric( $wp->query_vars['orders'] ) ) {
$order_id = $wp->query_vars['orders'];
$order = wc_get_order( $order_id );
if ( ! $order || ! current_user_can( 'view_order', $order_id ) ) {
echo '<div class="woocommerce-error">' . esc_html__( 'Invalid order.', 'woocommerce' ) . ' <a href="' . esc_url( wc_get_page_permalink( 'myaccount' ) ) . '" class="wc-forward">' . esc_html__( 'My account', 'woocommerce' ) . '</a></div>';
return;
}
// Backwards compatibility.
$status = new stdClass();
$status->name = wc_get_order_status_name( $order->get_status() );
wc_get_template(
'myaccount/view-order.php',
array(
'status' => $status, // @deprecated 2.2.
'order' => $order,
'order_id' => $order->get_id(),
)
);
} else {
$current_page = empty( $current_page ) ? 1 : absint( $current_page );
$customer_orders = wc_get_orders(
apply_filters(
'woocommerce_my_account_my_orders_query',
array(
'customer' => get_current_user_id(),
'page' => $current_page,
'paginate' => true,
)
)
);
wc_get_template(
'myaccount/orders.php',
array(
'current_page' => absint( $current_page ),
'customer_orders' => $customer_orders,
'has_orders' => 0 < $customer_orders->total,
)
);
}
}
重要提示:不是打算通过更改核心文件来更改此功能!!你可以简单地将它添加到functions.php,这是因为这个函数被if ( ! function_exists( 'woocommerce_account_orders' ) ) {
嵌入了
步骤 3) 这一步是可选的。这确保 /my-account/view-order/ORDER-ID/ url(现在是旧的 url)不再可达
function action_woocommerce_account_view_order_endpoint() {
remove_action( 'woocommerce_account_view-order_endpoint', 'woocommerce_account_view_order' );
}
add_action( 'woocommerce_account_view-order_endpoint', 'action_woocommerce_account_view_order_endpoint', 1 );
第 1、2 和 3 步的代码 进入活动子主题(或活动主题)的 functions.php 文件).
相关:
当前 URL,在 WooCommerce 'My orders' 选项卡下,当您查看订单详细信息时的按钮等于 /my-account/view-order/ORDER-ID/
我想将此 url 更改为 /my-account/orders/ORDER-ID/ - 所以:
当前url:/my-account/view-order/ORDER-ID/
新 url: /my-account/orders/ORDER-ID/
因此,通过 WooCommerce 设置,我将 view-order 端点更改为 orders
有效,详细查看订单的按钮url已有效更改,只有我在订单详细信息页面上收到以下消息
'No order has been made yet'.
我相信通过下面的代码,可以在/plugins/woocommerce/includes/class-wc-order.php中找到|第 1675 行
/**
* Generates a URL to view an order from the my account page.
*
* @return string
*/
public function get_view_order_url() {
return apply_filters( 'woocommerce_get_view_order_url', wc_get_endpoint_url( 'view-order', $this->get_id(), wc_get_page_permalink( 'myaccount' ) ), $this );
}
我可以实现我的目标,但我可以使用一些建议。谁能指导一下?
将/my-account/view-order/ORDER-ID/url更改为/my-account/orders/ORDER-ID/可以通过应用几个步骤来完成。
步骤 1) 更改视图顺序端点
可以在页面设置部分的 WooCommerce > 设置 > 高级中自定义每个端点的 URL
或者 你使用 woocommerce_get_endpoint_url
过滤器钩子代替
function filter_woocommerce_get_endpoint_url( $url, $endpoint, $value, $permalink ) {
// Specific endpoint
if ( $endpoint === 'view-order' ) {
// New URL
$url = $permalink . 'orders/' . $value;
}
return $url;
}
add_filter( 'woocommerce_get_endpoint_url', 'filter_woocommerce_get_endpoint_url', 10, 4 );
虽然现在更改了端点,但您在查看新的 url 时会看到以下消息:
'No order has been made yet'.
这是因为加载了/myaccount/orders.php模板文件,而这应该是/myaccount/view-order .php模板
步骤 2) 提供加载正确的模板文件,这对于 /my-account/orders/ 和 /my-account/orders/ORDER-ID/ url.
因此我们需要覆盖现有的woocommerce_account_orders()
函数,可以在/includes/wc-template-functions.php文件中找到。这样我们的自定义函数就执行了
function woocommerce_account_orders( $current_page ) {
global $wp;
// For view-order template file
if ( isset( $wp->query_vars['orders'] ) && is_numeric( $wp->query_vars['orders'] ) ) {
$order_id = $wp->query_vars['orders'];
$order = wc_get_order( $order_id );
if ( ! $order || ! current_user_can( 'view_order', $order_id ) ) {
echo '<div class="woocommerce-error">' . esc_html__( 'Invalid order.', 'woocommerce' ) . ' <a href="' . esc_url( wc_get_page_permalink( 'myaccount' ) ) . '" class="wc-forward">' . esc_html__( 'My account', 'woocommerce' ) . '</a></div>';
return;
}
// Backwards compatibility.
$status = new stdClass();
$status->name = wc_get_order_status_name( $order->get_status() );
wc_get_template(
'myaccount/view-order.php',
array(
'status' => $status, // @deprecated 2.2.
'order' => $order,
'order_id' => $order->get_id(),
)
);
} else {
$current_page = empty( $current_page ) ? 1 : absint( $current_page );
$customer_orders = wc_get_orders(
apply_filters(
'woocommerce_my_account_my_orders_query',
array(
'customer' => get_current_user_id(),
'page' => $current_page,
'paginate' => true,
)
)
);
wc_get_template(
'myaccount/orders.php',
array(
'current_page' => absint( $current_page ),
'customer_orders' => $customer_orders,
'has_orders' => 0 < $customer_orders->total,
)
);
}
}
重要提示:不是打算通过更改核心文件来更改此功能!!你可以简单地将它添加到functions.php,这是因为这个函数被if ( ! function_exists( 'woocommerce_account_orders' ) ) {
步骤 3) 这一步是可选的。这确保 /my-account/view-order/ORDER-ID/ url(现在是旧的 url)不再可达
function action_woocommerce_account_view_order_endpoint() {
remove_action( 'woocommerce_account_view-order_endpoint', 'woocommerce_account_view_order' );
}
add_action( 'woocommerce_account_view-order_endpoint', 'action_woocommerce_account_view_order_endpoint', 1 );
第 1、2 和 3 步的代码 进入活动子主题(或活动主题)的 functions.php 文件).
相关: