检测 WooCommerce“我的帐户”页面的仪表板
Posted
技术标签:
【中文标题】检测 WooCommerce“我的帐户”页面的仪表板【英文标题】:Detect dashboard of WooCommerce "my account" pages 【发布时间】:2016-11-21 12:34:09 【问题描述】:如何检测仪表盘上是否使用了“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()
的函数吗?
【问题讨论】:
【参考方案1】:更新:专门检测我的帐户“仪表板”页面
<?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
?>
参考:
Official WooCommerce Conditional Tags Display My Account link in a template file之后,您可以Override WooCommerce Templates via a Theme 使用我的帐户模板来微调更多 WooCommerce 行为……
【讨论】:
is_account_page()
不能用于检测“我的帐户”页面的“仪表板” - 此函数对所有“我的帐户”页面返回 true。
@丹。是的,我知道... “我如何检测“myaccount/my-account.php”是否“”
您的原始答案没有解决问题(既不是问题标题中的问题,也不是问题中的问题)。您现在刚刚发布了一些确实解决了他的问题的内容,但这显然不会使我之前的评论和投票无效。谁对我的回答投了反对票(不是指手画脚)显然只是有骨头要挑。我的解决方案绝对解决了这个问题哈哈
@丹。你真的很聪明、聪明、成熟。恭喜!
我知道我是。我认为我的论点结构很好。我非常有信心我在前面的评论中所说的一切都是有效的。你为什么不向我解释为什么你的原始答案解决了这些问题,也许我可以被说服我错了/得到了错误的观点。关于否决票 - 我很确定没有回答问题的答案是否决票的基础。最重要的是,我对自己感到失望,因为我允许这占用我的时间,而我不会从中受益。我想我只是人类。【参考方案2】:
我也有同样的问题(多年后,哈哈)。对于那些查看答案并想知道为什么它没有帮助的人来说,woocommerce 中提供了端点检测功能,可以完全满足您的需求。您可以阅读here 的可用功能列表。
这是直接取自 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('编辑地址') => 显示编辑地址的端点页面时。
is_wc_endpoint_url('密码丢失') => 显示丢失密码的端点页面时。
is_wc_endpoint_url('客户注销') => 显示客户注销的端点页面时。
is_wc_endpoint_url('add-payment-method') => 显示添加支付方式的端点页面时。
【讨论】:
【参考方案3】:实际上,我发现这种情况似乎可以正常工作,以便仅使用本机 WC 代码检测 WC Dashboard 页面:
if (is_user_logged_in() && is_account_page() && !is_wc_endpoint_url())
echo 'WC Dashboard';
else
echo 'no WC Dashboard';
【讨论】:
这个对我来说很完美。我不喜欢尝试检查页面的实际 URL 的想法,因为这可能会改变。此解决方案以一种有意义的方式使用条件函数。我在body_class
过滤器中使用它来添加一类 woocommerce-account-dashboard 用于样式设置。【参考方案4】:
要在“我的帐户”区域中检测您所在的确切页面(以便您确定正在使用哪个模板),我认为 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,因此不能用于确定您是否专门在仪表板页面上。
【讨论】:
这很好用。不知道为什么这不是答案。【参考方案5】:<?php if(is_page("account") && !is_wc_endpoint_url()) ?>
假设您的帐户页面位于 /account/,这将检测您的仪表板。
如果您只执行is_page("account")
,条件将触发所有帐户页面。但是,由于仪表板不像“view-order”或“last-password”那样被视为 WC 端点,所以这个简单的检查就可以完成这项工作。
【讨论】:
以上是关于检测 WooCommerce“我的帐户”页面的仪表板的主要内容,如果未能解决你的问题,请参考以下文章
Woocommerce 我的帐户页面为新客户运行了一个额外的循环
WooCommerce 不会将密码发送给在“我的帐户”页面上注册的客户