[英]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(我猜是個人品味?)
is_wc_endpoint_url()
可以為主題或插件添加的端點返回 false,因此您可以獲得假陰性。 有一個過濾器,因此您可以添加自己的過濾器,但您不能相信插件會這樣做。現在,如果您考慮一下,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.