我正在尝试使 url.com/my-account 或短代码[woocommerce_my_account]显示订单,而不是显示"您好用户(不是用户(?"的仪表板。
我唯一拥有的是登录后重定向到订单而不是仪表板,但我随后转到/my-account 仍然显示我不想要的仪表板。
我发现最接近的可以做我想要的代码是......
function woocommerce_orders() {
$user_id = get_current_user_id();
if ($user_id == 0) {
return do_shortcode('[woocommerce_my_account]');
}else{
ob_start();
wc_get_template( 'myaccount/my-orders.php', array(
'current_user' => get_user_by( 'id', $user_id),
'order_count' => $order_count
) );
return ob_get_clean();
}
}
add_shortcode('woocommerce_orders', 'woocommerce_orders');
但是,如果没有下订单,那么它会显示为空白(不显示带有商店按钮的"尚未下订单"(,并且我的帐户导航侧边栏不会显示。我是否必须为此制作一个自定义页面模板才能添加到 wooCommerce 帐户导航侧边栏中?
编辑:如果我使用订单.php而不是我的订单.php那么我能够得到"尚未下订单"。但仍然没有侧边栏导航
您可以尝试以下代码(这并不完美,因为它会删除对仪表板的访问权限(:
add_action( 'woocommerce_account_content', 'remove_dashboard_account_default', 5 );
function remove_dashboard_account_default() {
remove_action( 'woocommerce_account_content', 'woocommerce_account_content', 10 );
add_action( 'woocommerce_account_content', 'custom_account_orders', 10 );
}
function custom_account_orders( $current_page ) {
global $wp;
if ( ! empty( $wp->query_vars ) ) {
foreach ( $wp->query_vars as $key => $value ) {
// Ignore pagename param.
if ( 'pagename' === $key ) {
continue;
}
if ( has_action( 'woocommerce_account_' . $key . '_endpoint' ) ) {
do_action( 'woocommerce_account_' . $key . '_endpoint', $value );
return;
}
}
}
$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,
)
);
}
代码进入函数.php活动子主题(或活动主题(的文件。经过测试并工作。
有一个更简单的方法:只需捕获WordPress的parse_request
,检查request
是否适用于my-account
(或任何您的帐户页面slug(并执行重定向:
function vnm_wc_redirect_account_dashboard( $wp ) {
if ( !is_admin() ) {
// Uncomment the following line if you want to see what the current request is
//die( $wp->request );
// The following will only match if it's the root Account page; all other endpoints will be left alone
if ( $wp->request === 'my-account' ) {
wp_redirect( site_url( '/my-account/orders/' ) );
exit;
}
}
}
add_action( 'parse_request', 'vnm_wc_redirect_account_dashboard', 10, 1 );
我使用了LoicTheAztec的代码和另一个补充片段,它删除了仪表板选项卡:
// Remove or rename my account page navigation links (removes downloads and dashboard).
add_filter ( 'woocommerce_account_menu_items', 'my_account_menu_order' );
function my_account_menu_order() {
$menuOrder = array(
'orders' => __( 'Orders', 'woocommerce' ),
// 'downloads' => __( 'Download', 'woocommerce' ),
'edit-address' => __( 'Addresses', 'woocommerce' ),
'edit-account' => __( 'Account details', 'woocommerce' ),
'customer-logout' => __( 'Logout', 'woocommerce' ),
// 'dashboard' => __( 'Dashboard', 'woocommerce' )
);
return $menuOrder;
}
我还创建了一个代码片段,默认情况下会突出显示订单选项卡。它是通过添加活动类然后 CSS 不透明度来完成的:1 突出显示它。脚本将仅在帐户部分显示,以避免在不需要的地方膨胀:
// Make orders link highlighted by default in my account section.
add_action('wp_footer', 'taisho_dashboard_orders_highlight');
function taisho_dashboard_orders_highlight() {
if (!is_account_page()) return; // Account section only
global $wp;
$acc_url = get_permalink( get_option( 'woocommerce_myaccount_page_id' ));
$my_acc = rtrim( $acc_url , '/' );
$my_acc = explode( '/', $my_acc );
?>
<script type="text/javascript">
var dashboard_active = <?php echo $wp->request === end($my_acc) ?>;
jQuery(document).ready(function($) {
$('.woocommerce-MyAccount-navigation-link--orders').toggleClass('is-active', dashboard_active);
});
</script>
<?php
}
使用parse_request
操作:
add_action( 'parse_request', function ( $wp ) {
// Prevent the redirection, in the case,
// the user is not logged in (no login, no orders)
if (!is_user_logged_in()) return false;
if ( $wp->request === 'my-account' ) {
wp_redirect( home_url( '/my-account/orders/' ) );
exit;
}
}, 10, 1 );
截至今天,只有一种解决方法可以将另一个"我的帐户"选项卡设置为默认值,并保留"仪表板"选项卡。
假设我们要默认为"下载"选项卡。我们需要:
将"仪表板"选项卡内容- 替换为"下载"选项卡内容
- 将"仪表板"选项卡重命名为"下载">
- 隐藏原始的"下载"选项卡,因为我们现在已经有了它
- 重新添加"仪表板"选项卡
粘贴在这里有点复杂,所以我只介绍最困难的第 1 点。其余的可以在StackOverflow或此Business Bloomer教程上轻松找到,因为它是基本的重命名/删除/添加"我的帐户"选项卡。
根据第 1 点,我们需要覆盖 woocommerce_account_content(( 函数,该函数负责默认显示"仪表板"内容,以防我们在"我的帐户"上并且没有查询变量或存在一个名为"pagename"的非空查询变量。
因此,我将删除WooCommerce功能,并添加我的版本:
add_action( 'woocommerce_account_content', 'bbloomer_myaccount_replace_dashboard_content', 1 );
function bbloomer_myaccount_replace_dashboard_content() {
remove_action( 'woocommerce_account_content', 'woocommerce_account_content', 10 );
add_action( 'woocommerce_account_content', 'bbloomer_account_content' );
}
现在我去定义我的自定义 bbloomer_account_content(( 函数,我基本上告诉系统:
如果没有查询 var- 或者有,并且名为"pagename"的查询 var 不为空,我会回显我的自定义内容(在我的情况下是"下载"选项卡内容">
- 否则,这意味着我在端点 URL 上,因此我复制 woocommerce_account_content(( 中的任何内容以返回选项卡内容
法典:
function bbloomer_account_content() {
global $wp;
if ( empty( $query_vars = $wp->query_vars ) || ( ! empty( $query_vars ) && ! empty( $query_vars['pagename'] ) ) ) {
woocommerce_account_downloads();
} else {
foreach ( $wp->query_vars as $key => $value ) {
if ( 'pagename' === $key ) {
continue;
}
if ( has_action( 'woocommerce_account_' . $key . '_endpoint' ) ) {
do_action( 'woocommerce_account_' . $key . '_endpoint', $value );
return;
}
}
}
}
这样,如果我转到"example.com/my-account",我将看到"下载"选项卡内容;如果我切换选项卡并转到"仪表板"或"订单",我将看到它们的原始内容。
请记住,这只是第 1 部分,因此需要对第 2、3 和 4 部分进行其他解决方法才能真正使其正常工作。