检测 WooCommerce“我的帐户”页面的仪表板

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

如何检测仪表板上是否使用了“myaccount/my-account.php”模板。

目前我使用:

<?php
    global $wp;
    if ( !isset($wp->query_vars['page']) ) {
?>
    <a href="/mein-konto/">Back to my Account</a>
<?php } ?>

<div class="myaccount_content">
    <?php
        do_action( 'woocommerce_account_content' );
    ?>
</div>

但这感觉有点老套。不是有类似

is_myaccount_dashboard()
的功能吗?

php wordpress woocommerce conditional-statements user-accounts
5个回答
24
投票

更新:专门检测我的帐户“仪表板”页面

<?php
    global $wp;
    
    // If NOT My account dashboard page
    if( ! ( basename($wp->request) === 'my-account' && is_account_page() ) ){ 
?>
    <a href="<?php echo get_permalink( get_option('woocommerce_myaccount_page_id')); ?>">Back to my Account Dashboard</a>
<?php 
    } 
?>

<div class="myaccount_content">
    <?php
        do_action( 'woocommerce_account_content' );
    ?>
</div>

已测试且有效。


原答案:

是的,当然有

is_account_page()
原生 WooCommerce 条件在客户的帐户页面上返回 true。

这是使用

is_account_page()
is_user_logged_in()
的示例。要获取我的帐户链接网址,您可以使用:
get_permalink( get_option('woocommerce_myaccount_page_id') )

if ( !is_account_page() ) { // User is NOT on my account pages

    if ( is_user_logged_in() ) { // Logged in user

    // Link to "My Account pages dashboard". 
?>  
    <a href="<?php echo get_permalink( get_option('woocommerce_myaccount_page_id') ); ?>" title="<?php _e('My Account', 'woocommerce'); ?>"><?php _e( 'My Account', 'woocommerce' ); ?></a>
<?php }
    else { // User is NOT logged in

    // Link to "Login / register page".
?>  
    <a href="<?php echo get_permalink( get_option('woocommerce_myaccount_page_id') ); ?>" title="<?php _e( 'Login / Register','woocommerce' ); ?>"><?php _e( 'Login / Register', 'woocommerce' ); ?></a>

<?php 
    } 
} 
?>

参考:


5
投票

要在“我的帐户”区域中检测您所在的确切页面(以便您确定正在使用哪个模板),我认为 Woocommerce 没有提供方法。

我认为您必须使用普通 PHP 获取当前 URL,并将其与设置为仪表板/我的帐户主页的页面 URL 进行比较。

例如

$current_url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

$dashboard_url = get_permalink( get_option('woocommerce_myaccount_page_id'));

if($dashboard_url == $current_url){
    // do your stuff here
}

Woocommerce 的

is_account_page()
条件函数将为所有“我的帐户”子页面返回 true,因此无法用于确定您是否专门位于仪表板页面。


3
投票

我也有同样的问题(几年后,哈哈)。对于查看答案并想知道为什么它没有帮助的人来说,woocommerce 中提供的端点检测功能可以完全满足您的需求。您可以在此处阅读可用功能列表。

这直接取自 woocommerce 文档。我只是复制它,以防将来链接损坏

is_account_page() => 在客户的帐户页面上返回 true。

is_wc_endpoint_url() => 查看任何 WooCommerce 端点时返回 true

is_wc_endpoint_url( '订单支付' ) => 当显示订单支付端点页面时。

is_wc_endpoint_url( '订单已收到' ) => 当显示收到订单的端点页面时。

is_wc_endpoint_url( '查看顺序' ) => 当显示查看订单的端点页面时。

is_wc_endpoint_url( '编辑帐户' ) => 当显示编辑账户的端点页面时。

is_wc_endpoint_url( '编辑地址' ) => 当显示编辑地址的端点页面时。

is_wc_endpoint_url( '丢失密码' ) => 当显示丢失密码的端点页面时。

is_wc_endpoint_url( '客户注销' ) => 当显示客户注销的端点页面时。

is_wc_endpoint_url( '添加付款方式' ) => 当显示添加支付方式的端点页面时。


3
投票

实际上,我发现这种情况似乎工作正常,以便仅使用本机 WC 代码检测 WC 仪表板页面:

    if (is_user_logged_in() && is_account_page() && !is_wc_endpoint_url()) {
      echo 'WC Dashboard';
    } else {
      echo 'no WC Dashboard';
    }

1
投票

我还需要专门识别仪表板并发现这个问题,但我不喜欢任何答案,并且 WooCommerce 仍然没有内置标签来执行此操作...

我对答案有两个问题,第一个是使用

is_wc_endpoint_url()
(并非绝对正确),第二个是比较网址(我猜是个人品味?)

  1. is_wc_endpoint_url()
    可以为端点返回 false 由主题或插件添加,因此您可能会得到漏报。有 一个过滤器,这样你就可以添加自己的过滤器,但你不能相信这个插件 会这样做。
  2. 比较 URL 对我来说感觉很麻烦。你或许可以得到 结果值得信赖,而且非常简单,所以不是 这必然是一个糟糕的方法。尽管我会放弃 URL 的硬编码部分或至少允许翻译。

现在,如果您想一想,WooCommerce 本身肯定知道何时加载仪表板.php,因此我只是采用该代码并重构它以简单地识别仪表板:

function is_dashboard(){
    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' ) ) {
                return false;
            }
        }
    }

    return true;
}

对我来说,这是最简单的方法,尽管如果做得正确,比较 URL 可能就足够了。对于这个问题,您不能相信

is_wc_endpoint_url()

希望这对仍在寻找

is_dashboard()
is_account_page('dashboard')

的人有所帮助
© www.soinside.com 2019 - 2024. All rights reserved.