如何检测仪表板上是否使用了"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()
函数的东西吗?
更新:特别检测我的帐户"Dashboard"页面
<?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模板,以微调更多WooCommCommerce行为…
要在"我的帐户"区域检测您所在的确切页面(以便您确定正在使用哪个模板),我认为Wooccommerce没有提供方法。
我认为您必须使用普通PHP获取当前URL,并将其与设置为Dashboard/My Account主页的页面的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
}
Wooccommerce的is_account_page()
条件函数将为所有"我的账户"子页面返回true,因此不能用于确定您是否专门在Dashboard页面上。
我也有同样的问题(多年后,哈哈)。对于那些正在寻找答案并想知道为什么它没有帮助的人来说,wooccommerce中有一些端点检测功能,它们正是你想要的。您可以在此处阅读可用功能列表。
这是直接从wooccommerce文档中获取的。我只是复制它,以防将来链接断开
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("添加付款方式")=>当显示添加付款方式的端点页面时。
事实上,我发现这个条件似乎可以很好地工作,以便检测到只有本地WC代码的WC Dashboard页面:
if (is_user_logged_in() && is_account_page() && !is_wc_endpoint_url()) {
echo 'WC Dashboard';
} else {
echo 'no WC Dashboard';
}
我还需要具体识别仪表板,并找到了这个问题,但我不喜欢任何答案,WooCommerce仍然没有内置标签来完成这项工作。。。
我的答案有两个问题,第一个是使用is_wc_endpoint_url()
(不是绝对正确的),第二个是比较URL(我想是个人品味?)
- 对于以下端点,
is_wc_endpoint_url()
可能返回false由主题或插件添加,这样你就可以得到假阴性。有一个过滤器,这样你就可以添加自己的,但你不能相信一个插件会这么做的 - 比较URL对我来说很难。你可能会值得信赖的结果,而且它非常简单,所以它不是这肯定是一种糟糕的方法。尽管我会放弃对URL的硬编码部分,或者至少允许翻译
现在,如果你仔细想想,WooCommerce本身就知道什么时候加载dashboard.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')
的人
<?php if(is_page("account") && !is_wc_endpoint_url()) { ?>
假设您的帐户页面位于/account/,这将检测到您的仪表板。
如果只执行is_page("account")
,则条件将触发所有帐户页面。然而,由于仪表板不像"查看顺序"或"最后密码"那样被视为WC端点,因此这种简单的检查就可以完成任务。