如何检测仪表板上是否使用了“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
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
}
}
?>
参考:
要在“我的帐户”区域中检测您所在的确切页面(以便您确定正在使用哪个模板),我认为 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( '订单支付' ) => 当显示订单支付端点页面时。
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 仪表板页面:
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()
(并非绝对正确),第二个是比较网址(我猜是个人品味?)
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')
的人有所帮助