在woocommerce电子邮件通知中get_post_meta

时间:2014-09-03 02:47:55

标签: wordpress woocommerce

我正在尝试从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' ); ?>

2 个答案:

答案 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)。当然这与真正的问题没有关系。

制作测试者将在电子邮件中显示以下数据:

Data in order confirmation email

此结果表明get_post_meta正在基于上述代码在电子邮件模板中工作。 (我使用的是Wordpress 4.0.1和WooCommerce 2.2.10)。

如果上述测试在您的情况下工作正常,那么我认为这些值会在> 电子邮件发送后插入您的数据库中(它们是正确插入的,但是要迟到)。

您可能想要检查的另一件事是重新发送确认电子邮件。您可以从Wordpress管理员执行此操作。当您编辑订单时,您会有一个下拉菜单&#39;操作&#39;在右侧。您可以选择“处理订单”&#39;在&#39;重新发送订单电子邮件&#39;。然后单击下拉列表旁边的刷新图标,您将再次收到订单确认电子邮件。见下面的截图:

Resend order confirmation email

这次您确定在发送电子邮件之前,这些值已经存在于数据库中。

希望这些信息可以帮助您解决问题。

答案 1 :(得分:-1)

嗯,'attendee_data'是一个序列化对象,因此传递给函数get_post_meta的第三个参数必须设置为false(或省略)。

$x = get_post_meta( $order->id, 'attendee_data', false );