if, endif, else 在 wordpress 简码中如何工作
How to work if, endif, else in wordpress shortcode
我正在尝试让一些 php 代码在短代码中工作。
这是我在 woocommerce 中所做的 dashboard.php。此代码显示客户最后一次下订单的数据,一切正常。如您所见,它包含 if、endif 和 else。
<?php
// For logged in users only
if ( is_user_logged_in() ) :
// Get the current WC_Customer instance Object
$customer = new WC_Customer( get_current_user_id() );
// Get the last WC_Order Object instance from current customer
$last_order = $customer->get_last_order();
?>
<?php if( is_a($last_order, 'WC_Order') ) : ?>
<?php foreach ( $last_order->get_items() as $item ) : ?>
<div class="last_order_items"><?php echo $item->get_name(); ?></div>
<div class="last_order_items"><?php echo $item->get_total(); ?>€</div>
<div class="order_number">#<?php echo $last_order->get_order_number(); ?> </div>
<div class="order_number">Data acquisto <?php echo $last_order->get_date_created()->date('d/m/Y - H:i'); ?> </div>
<div class="order_number">Stato dell'ordine <?php echo esc_html( wc_get_order_status_name( $last_order->get_status() ) ); ?>
<?php endforeach; ?>
<?php else : ?>
<div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info">
<a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>"><?php esc_html_e( 'Browse products', 'woocommerce' ); ?></a>
<?php esc_html_e( 'No order has been made yet.', 'woocommerce' ); ?>
</div>
<?php endif; ?>
<?php endif; ?>
这是我在 functions.php 文件中所做的。简码工作正常,但如果用户未登录或未下订单,则会发生错误。在 dashboard.php 文件中不存在错误,因为 if (is_user_logged_in ())
部分存在,而 else
部分在用户未下任何订单时显示消息。
//// LAST ORDER ON DASHBOARD WOOCOMMERCE SHORTCODE ////
add_shortcode( 'short_test' , 'test' );
function test(){
$customer = new WC_Customer( get_current_user_id() );
$last_order = $customer->get_last_order();
return $last_order->get_order_number();
}
如何在此短代码中实现 if、endif 和 else?我希望能够只向登录用户显示数据,对于那些没有下任何订单的用户,我想显示一条消息,就像我在 dashboard.php 文件中所做的那样。我尝试了多种方法但不能。我想使用短代码,因为它对我来说更方便,而且我更喜欢保持 woocommerce 模板“干净”并将所有内容直接写入 functions.php 文件
抱歉,我是一个粉丝,对这个问题了解不多。
这是相同简码的两个版本[short-test]
- 其中一个允许您将一些 HTML 写入字符串,这可能会变得混乱,尤其是当您需要向其中添加客户数据时。
- 两个将允许您在主题的子目录中创建一个 .php 文件,并将该模板作为文本拉到 return。
functions.php
add_shortcode('short-test', 'test');
function test()
{
if (get_current_user_id() == 0) {
// User isn't logged in, don't output anything.
return '';
}
// Customer order count
$order_count = wc_get_customer_order_count(get_current_user_id());
if ($order_count == 0) {
return '<p>This is where you would put your HTML</p>';
}
}
add_shortcode('short-test', function () {
if (!get_current_user_id()) {
// User isn't logged in, don't output anything.
return '';
}
// Customer order count
$order_count = wc_get_customer_order_count(get_current_user_id());
if ($order_count == 0) {
// Customer has no orders, pull our template from /templates/customer-has-no-orders.php
ob_start();
include __DIR__ . '/templates/customer-has-no-orders.php';
return ob_get_clean();
}
return '';
});
templates/customer-has-no-orders.php
<p>You can write whatever you want here, in HMTL/PHP/JS</p>
用法:
- 在 .php 模板文件中:
<?= do_shortcode('[short-test]'); ?>
- 在 post 编辑中:
[short-test]
如果您只写了少量文本并且不打算将客户数据添加到文本中,例如他们的名字,那么请使用第一个选项并删除第二个选项。我已将第二个设为匿名回调,因此如果您复制粘贴两者都不会中断。
Output buffering documentation ob_start()
我找到了解决方案,这是我所做的:
<?php
add_shortcode( 'short_test' , 'test' );
function test() {
// Get the WC_Customer instance Object for the current user
$customer = new WC_Customer( get_current_user_id() );
// Get the last WC_Order Object instance from current customer
$last_order = $customer->get_last_order();
// Then I added the if condition. If this is the last order, then it shows the data from it
if ( is_a( $last_order, 'WC_Order' ) ) {
return $last_order->get_order_number(); // Change get_order_number to another parameter if you want to show different information
}
// With else show the warning message if the user has not placed any order
else {
?><div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info">
<a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>"><?php esc_html_e( 'Browse products', 'woocommerce' ); ?></a>
<?php esc_html_e( 'No order has been made yet.', 'woocommerce' ); ?>
</div><?php
}
}
我在下面留下一些信息,供遇到同样问题的人使用。
如果您想更改要显示的信息类型,只需将get_order_number();
更改为您想要的参数即可。示例如下:$last_order = $customer->get_formatted_order_total();
将显示订单总数而不是订单号。在这里您可以找到所有 woocommerce 参数的列表 https://www.businessbloomer.com/woocommerce-easily-get-order-info-total-items-etc-from-order-object/
如果要添加items等不同的参数,那么就得在if里面引入foreach,如下。
// Get and Loop Over Order Items
if ( is_a( $last_order, 'WC_Order' ) ) {
foreach ( $last_order->get_items() as $item ) {
return $last_order = $item->get_product_id();
}
}
- 如果您想在同一个短代码中显示更多信息,请按如下方式编辑 if 部分。请记住,只有 $ 项目进入 foreach。如果你不需要$item参数你也可以删除foreach。
if ( is_a( $last_order, 'WC_Order' ) ) {
?><div class="last_order" style="display:block">Order Number <?php echo $last_order->get_order_number();
?><div class="last_order">Order Total <?php echo $last_order->get_formatted_order_total();
?><div class="last_order">Order Status <?php echo $last_order->get_status();
foreach ( $last_order->get_items() as $item ) {
?><div class="last_order">Product ID <?php echo $last_order = $item->get_product_id();
}
}
使用@Josh Bonnick 的解决方案进行编辑
在使用各种方法“玩”了一下以获得错误消息而不是破坏布局之后,我还尝试了@Josh Bonnick 的解决方案,我在以下动作中实施了该解决方案。 (我使用了代码的第一部分而不是需要模板的第二部分)。
<?php
add_shortcode( 'short_test' , 'test' );
function test() {
// Get the WC_Customer instance Object for the current user
$customer = new WC_Customer( get_current_user_id() );
// Get the last WC_Order Object instance from current customer
$last_order = $customer->get_last_order();
// Then I added the if condition. If this is the last order, then it shows the data from it
if ( is_a( $last_order, 'WC_Order' ) ) {
return $last_order->get_order_number(); // Change get_order_number to another parameter if you want to show different information
}
// Josh Bonnick recommended piece of code
$order_count = wc_get_customer_order_count(get_current_user_id());
if ($order_count == 0) {
return '<p>This is where you would put your HTML</p>';
}
我找到了使下载按钮正常工作的解决方案,但如果用户没有下载可用,这会破坏布局。
<?php
add_shortcode( 'order_download' , 'last_order_info_08' );
function last_order_info_08(){
$customer = new WC_Customer( get_current_user_id() );
$last_order = $customer->get_last_order();
if ( is_a( $last_order, 'WC_Order' ) ) {
$downloads = $last_order->get_downloadable_items();
if ($downloads){
wc_get_template(
'button-downloads.php',
array(
'downloads' => $downloads,
'show_title' => true,
));
}
} else {
?><div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info">
<a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>"><?php esc_html_e( 'Browse products', 'woocommerce' ); ?></a>
<?php esc_html_e( 'No order has been made yet.', 'woocommerce' ); ?>
</div><?php
}
}
我正在尝试让一些 php 代码在短代码中工作。
这是我在 woocommerce 中所做的 dashboard.php。此代码显示客户最后一次下订单的数据,一切正常。如您所见,它包含 if、endif 和 else。
<?php
// For logged in users only
if ( is_user_logged_in() ) :
// Get the current WC_Customer instance Object
$customer = new WC_Customer( get_current_user_id() );
// Get the last WC_Order Object instance from current customer
$last_order = $customer->get_last_order();
?>
<?php if( is_a($last_order, 'WC_Order') ) : ?>
<?php foreach ( $last_order->get_items() as $item ) : ?>
<div class="last_order_items"><?php echo $item->get_name(); ?></div>
<div class="last_order_items"><?php echo $item->get_total(); ?>€</div>
<div class="order_number">#<?php echo $last_order->get_order_number(); ?> </div>
<div class="order_number">Data acquisto <?php echo $last_order->get_date_created()->date('d/m/Y - H:i'); ?> </div>
<div class="order_number">Stato dell'ordine <?php echo esc_html( wc_get_order_status_name( $last_order->get_status() ) ); ?>
<?php endforeach; ?>
<?php else : ?>
<div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info">
<a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>"><?php esc_html_e( 'Browse products', 'woocommerce' ); ?></a>
<?php esc_html_e( 'No order has been made yet.', 'woocommerce' ); ?>
</div>
<?php endif; ?>
<?php endif; ?>
这是我在 functions.php 文件中所做的。简码工作正常,但如果用户未登录或未下订单,则会发生错误。在 dashboard.php 文件中不存在错误,因为 if (is_user_logged_in ())
部分存在,而 else
部分在用户未下任何订单时显示消息。
//// LAST ORDER ON DASHBOARD WOOCOMMERCE SHORTCODE ////
add_shortcode( 'short_test' , 'test' );
function test(){
$customer = new WC_Customer( get_current_user_id() );
$last_order = $customer->get_last_order();
return $last_order->get_order_number();
}
如何在此短代码中实现 if、endif 和 else?我希望能够只向登录用户显示数据,对于那些没有下任何订单的用户,我想显示一条消息,就像我在 dashboard.php 文件中所做的那样。我尝试了多种方法但不能。我想使用短代码,因为它对我来说更方便,而且我更喜欢保持 woocommerce 模板“干净”并将所有内容直接写入 functions.php 文件
抱歉,我是一个粉丝,对这个问题了解不多。
这是相同简码的两个版本[short-test]
- 其中一个允许您将一些 HTML 写入字符串,这可能会变得混乱,尤其是当您需要向其中添加客户数据时。
- 两个将允许您在主题的子目录中创建一个 .php 文件,并将该模板作为文本拉到 return。
functions.php
add_shortcode('short-test', 'test');
function test()
{
if (get_current_user_id() == 0) {
// User isn't logged in, don't output anything.
return '';
}
// Customer order count
$order_count = wc_get_customer_order_count(get_current_user_id());
if ($order_count == 0) {
return '<p>This is where you would put your HTML</p>';
}
}
add_shortcode('short-test', function () {
if (!get_current_user_id()) {
// User isn't logged in, don't output anything.
return '';
}
// Customer order count
$order_count = wc_get_customer_order_count(get_current_user_id());
if ($order_count == 0) {
// Customer has no orders, pull our template from /templates/customer-has-no-orders.php
ob_start();
include __DIR__ . '/templates/customer-has-no-orders.php';
return ob_get_clean();
}
return '';
});
templates/customer-has-no-orders.php
<p>You can write whatever you want here, in HMTL/PHP/JS</p>
用法:
- 在 .php 模板文件中:
<?= do_shortcode('[short-test]'); ?>
- 在 post 编辑中:
[short-test]
如果您只写了少量文本并且不打算将客户数据添加到文本中,例如他们的名字,那么请使用第一个选项并删除第二个选项。我已将第二个设为匿名回调,因此如果您复制粘贴两者都不会中断。
Output buffering documentation ob_start()
我找到了解决方案,这是我所做的:
<?php
add_shortcode( 'short_test' , 'test' );
function test() {
// Get the WC_Customer instance Object for the current user
$customer = new WC_Customer( get_current_user_id() );
// Get the last WC_Order Object instance from current customer
$last_order = $customer->get_last_order();
// Then I added the if condition. If this is the last order, then it shows the data from it
if ( is_a( $last_order, 'WC_Order' ) ) {
return $last_order->get_order_number(); // Change get_order_number to another parameter if you want to show different information
}
// With else show the warning message if the user has not placed any order
else {
?><div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info">
<a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>"><?php esc_html_e( 'Browse products', 'woocommerce' ); ?></a>
<?php esc_html_e( 'No order has been made yet.', 'woocommerce' ); ?>
</div><?php
}
}
我在下面留下一些信息,供遇到同样问题的人使用。
如果您想更改要显示的信息类型,只需将
get_order_number();
更改为您想要的参数即可。示例如下:$last_order = $customer->get_formatted_order_total();
将显示订单总数而不是订单号。在这里您可以找到所有 woocommerce 参数的列表 https://www.businessbloomer.com/woocommerce-easily-get-order-info-total-items-etc-from-order-object/如果要添加items等不同的参数,那么就得在if里面引入foreach,如下。
// Get and Loop Over Order Items
if ( is_a( $last_order, 'WC_Order' ) ) {
foreach ( $last_order->get_items() as $item ) {
return $last_order = $item->get_product_id();
}
}
- 如果您想在同一个短代码中显示更多信息,请按如下方式编辑 if 部分。请记住,只有 $ 项目进入 foreach。如果你不需要$item参数你也可以删除foreach。
if ( is_a( $last_order, 'WC_Order' ) ) {
?><div class="last_order" style="display:block">Order Number <?php echo $last_order->get_order_number();
?><div class="last_order">Order Total <?php echo $last_order->get_formatted_order_total();
?><div class="last_order">Order Status <?php echo $last_order->get_status();
foreach ( $last_order->get_items() as $item ) {
?><div class="last_order">Product ID <?php echo $last_order = $item->get_product_id();
}
}
使用@Josh Bonnick 的解决方案进行编辑 在使用各种方法“玩”了一下以获得错误消息而不是破坏布局之后,我还尝试了@Josh Bonnick 的解决方案,我在以下动作中实施了该解决方案。 (我使用了代码的第一部分而不是需要模板的第二部分)。
<?php
add_shortcode( 'short_test' , 'test' );
function test() {
// Get the WC_Customer instance Object for the current user
$customer = new WC_Customer( get_current_user_id() );
// Get the last WC_Order Object instance from current customer
$last_order = $customer->get_last_order();
// Then I added the if condition. If this is the last order, then it shows the data from it
if ( is_a( $last_order, 'WC_Order' ) ) {
return $last_order->get_order_number(); // Change get_order_number to another parameter if you want to show different information
}
// Josh Bonnick recommended piece of code
$order_count = wc_get_customer_order_count(get_current_user_id());
if ($order_count == 0) {
return '<p>This is where you would put your HTML</p>';
}
我找到了使下载按钮正常工作的解决方案,但如果用户没有下载可用,这会破坏布局。
<?php
add_shortcode( 'order_download' , 'last_order_info_08' );
function last_order_info_08(){
$customer = new WC_Customer( get_current_user_id() );
$last_order = $customer->get_last_order();
if ( is_a( $last_order, 'WC_Order' ) ) {
$downloads = $last_order->get_downloadable_items();
if ($downloads){
wc_get_template(
'button-downloads.php',
array(
'downloads' => $downloads,
'show_title' => true,
));
}
} else {
?><div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info">
<a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>"><?php esc_html_e( 'Browse products', 'woocommerce' ); ?></a>
<?php esc_html_e( 'No order has been made yet.', 'woocommerce' ); ?>
</div><?php
}
}