我正在尝试从woocommerce电子邮件模板中的订单中获取一些数据,但get_post_meta只返回false。此代码适用于thankyou页面。我花了太多时间在这上面。任何帮助,将不胜感激。谢谢!
global $post;
echo "test!!!<br />";
$x = get_post_meta( $order->id, 'attendee_data', true );
$y = get_post_meta( $order->id, 'attendee_test', true );
echo $order->id . '<br />';
echo $x;
echo $y;
我附上了sql的图片以及电子邮件。
SQL:http://i.stack.imgur.com/zUFBa.png
电子邮件:http://i.stack.imgur.com/Uqtih.png
整个电子邮件模板:
<?php do_action('woocommerce_email_header', $email_heading); ?>
<p><?php _e( "Your order has been received and is now being processed. Your order details are shown below for your reference:", 'woocommerce' ); ?></p>
<?php do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plain_text ); ?>
<h2><?php echo __( 'Order:', 'woocommerce' ) . ' ' . $order->get_order_number(); ?></h2>
<table cellspacing="0" cellpadding="6" style="width: 100%; border: 1px solid #eee;" border="1" bordercolor="#eee">
<thead>
<tr>
<th scope="col" style="text-align:left; border: 1px solid #eee;"><?php _e( 'Product', 'woocommerce' ); ?></th>
<th scope="col" style="text-align:left; border: 1px solid #eee;"><?php _e( 'Quantity', 'woocommerce' ); ?></th>
<th scope="col" style="text-align:left; border: 1px solid #eee;"><?php _e( 'Price', 'woocommerce' ); ?></th>
</tr>
</thead>
<tbody>
<?php echo $order->email_order_items_table( $order->is_download_permitted(), true, ( $order->status=='processing' ) ? true : false ); ?>
</tbody>
<tfoot>
<?php
if ( $totals = $order->get_order_item_totals() ) {
$i = 0;
foreach ( $totals as $total ) {
$i++;
?><tr>
<th scope="row" colspan="2" style="text-align:left; border: 1px solid #eee; <?php if ( $i == 1 ) echo 'border-top-width: 4px;'; ?>"><?php echo $total['label']; ?></th>
<td style="text-align:left; border: 1px solid #eee; <?php if ( $i == 1 ) echo 'border-top-width: 4px;'; ?>"><?php echo $total['value']; ?></td>
</tr><?php
}
}
?>
</tfoot>
</table>
<?php
global $post;
echo "test!!!<br />";
$x = get_post_meta( $order->id, 'attendee_data', true );
$y = get_post_meta( $order->id, 'attendee_test', true );
echo $order->id . '<br />';
echo $x;
echo $y;
foreach ( $x as $k => $p ) {
echo $k ." ... ". $p;
} ?>
<?php // attendee_order_details($order->get_order_number()) ?>
<?php do_action( 'woocommerce_email_after_order_table', $order, $sent_to_admin, $plain_text ); ?>
<?php do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text ); ?>
<h2><?php _e( 'Customer details', 'woocommerce' ); ?></h2>
<?php if ($order->billing_email) : ?>
<p><strong><?php _e( 'Email:', 'woocommerce' ); ?></strong> <?php echo $order->billing_email; ?></p>
<?php endif; ?>
<?php if ($order->billing_phone) : ?>
<p><strong><?php _e( 'Tel:', 'woocommerce' ); ?></strong> <?php echo $order->billing_phone; ?></p>
<?php endif; ?>
<?php wc_get_template( 'emails/email-addresses.php', array( 'order' => $order ) ); ?>
<?php do_action( 'woocommerce_email_footer' ); ?>
答案 0 :(得分:1)
我根据您的信息进行了一些测试,并尝试重现您的问题。
首先,我创建了一个函数,在下订单时插入post meta(attendee_test和attendee_data)(像你一样使用woocommerce_checkout_update_order_meta
钩子)。
我在我的主题functions.php
中添加了这个(请注意,值是基于您的输入(来自db的图像)并且不是动态的,仅用于测试):
add_action('woocommerce_checkout_update_order_meta', 'add_meta_values', 2);
function add_meta_values($order_id){
// array with attendee data
$attendee_data = array(
array(
'edit' => 'false',
'company' => 'get',
)
);
add_post_meta( $order_id, 'attendee_data', $attendee_data );
add_post_meta( $order_id, 'attendee_test', 'test' );
}
然后我将以下代码添加到模板customer-processing-order.php
:
<?php
$attendee_data = get_post_meta( $order->id, 'attendee_data', true );
$attendee_test = get_post_meta( $order->id, 'attendee_test', true );
echo 'Order ID: ' . $order->id . '<br />';
echo 'Attendee Test: ' . $attendee_test . '<br />';
echo 'Attendee Data:<br />';
foreach ( $attendee_data as $k => $data ) {
foreach ($data as $key => $value){
echo $key . ' .. ' . $value . '<br />';
}
} ?>
正如您所看到的,我对其进行了一些修改以使其更加清晰。还改变了$ attendee_data循环,因为我认为这不是完全正确的(需要一个额外的foreach)。当然这与真正的问题没有关系。
制作测试者将在电子邮件中显示以下数据:
此结果表明get_post_meta
正在基于上述代码在电子邮件模板中工作。 (我使用的是Wordpress 4.0.1和WooCommerce 2.2.10)。
如果上述测试在您的情况下工作正常,那么我认为这些值会在>> 电子邮件发送后插入您的数据库中(它们是正确插入的,但是要迟到)。
您可能想要检查的另一件事是重新发送确认电子邮件。您可以从Wordpress管理员执行此操作。当您编辑订单时,您会有一个下拉菜单&#39;操作&#39;在右侧。您可以选择“处理订单”&#39;在&#39;重新发送订单电子邮件&#39;。然后单击下拉列表旁边的刷新图标,您将再次收到订单确认电子邮件。见下面的截图:
这次您确定在发送电子邮件之前,这些值已经存在于数据库中。
希望这些信息可以帮助您解决问题。
答案 1 :(得分:-1)
嗯,'attendee_data'是一个序列化对象,因此传递给函数get_post_meta的第三个参数必须设置为false(或省略)。
$x = get_post_meta( $order->id, 'attendee_data', false );