簡體   English   中英

檢測 WooCommerce“我的帳戶”頁面的儀表板

[英]Detect dashboard of WooCommerce "my account" pages

如何檢測儀表板上是否使用了“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() function 的東西嗎?

更新:專門檢測我的帳戶“儀表板”頁面

<?php
    global $wp;
    $request = explode( '/', $wp->request );

    // If NOT in My account dashboard page
    if( ! ( end($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()的示例。 要獲取我的帳戶鏈接 url,您可以使用: 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 
    } 
} 
?>

參考:


之后,您可以使用我的帳戶模板通過主題覆蓋 WooCommerce 模板,以微調更多 WooCommerce 行為......

實際上,我發現這種情況似乎可以正常工作,以便僅使用本機 WC 代碼檢測 WC Dashboard 頁面:

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

要在“我的帳戶”區域內檢測您所在的確切頁面(以允許您確定正在使用哪個模板),我認為 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,因此不能用於確定您是否專門在儀表板頁面上。

我有同樣的問題(多年后,哈哈)。 對於那些查看答案並想知道為什么它沒有幫助的人來說,woocommerce 中提供了端點檢測功能,可以完全滿足您的需求。 您可以在此處閱讀可用功能列表。

這是直接取自 woocommerce 文檔。 我只是復制它,以防將來鏈接損壞

is_account_page() => 在客戶的帳戶頁面上返回 true。

is_wc_endpoint_url() => 查看任何 WooCommerce 端點時返回 true

is_wc_endpoint_url( 'order-pay' ) => 當顯示訂單支付的端點頁面時。

is_wc_endpoint_url( 'order-received' ) => 當顯示已接收訂單的端點頁面時。

is_wc_endpoint_url( 'view-order' ) => 顯示視圖順序的端點頁面時。

is_wc_endpoint_url( 'edit-account' ) => 當顯示編輯帳戶的端點頁面時。

is_wc_endpoint_url( 'edit-address' ) => 當顯示編輯地址的端點頁面時。

is_wc_endpoint_url( 'lost-password' ) => 當顯示丟失密碼的端點頁面時。

is_wc_endpoint_url( 'customer-logout' ) => 當顯示客戶注銷的端點頁面時。

is_wc_endpoint_url( 'add-payment-method' ) => 當顯示添加支付方式的端點頁面時。

<?php if(is_page("account") && !is_wc_endpoint_url()) { ?>

假設您的帳戶頁面位於 /account/,這將檢測您的儀表板。

如果您只執行is_page("account") ,則條件將針對所有帳戶頁面觸發。 但是,由於儀表板不像“view-order”或“last-password”那樣被視為 WC 端點,因此這個簡單的檢查將完成這項工作。

我還需要專門識別儀表板並找到了這個問題,但我不喜歡任何答案,WooCommerce 仍然沒有內置標簽來執行此操作...

我的答案有 2 個問題,第一個是使用is_wc_endpoint_url() (並非萬無一失),第二個是比較 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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM