woocommerce 电子邮件通知中的 get_post_meta

Posted

技术标签:

【中文标题】woocommerce 电子邮件通知中的 get_post_meta【英文标题】:get_post_meta in woocommerce email notifications 【发布时间】:2014-09-03 02:47:55 【问题描述】:

我正在尝试从 woocommerce 电子邮件模板中的订单中获取一些数据,但 get_post_meta 只返回 false。此代码适用于感谢页面。我在这方面花了太多时间。任何帮助,将不胜感激。谢谢!

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' ); ?>

【问题讨论】:

customer-processing-order.php 的第 56 行是什么? 挂钩到woocommerce_email_after_order_table 操作可能比修改模板更好。 您可以尝试删除global $post,因为您使用的是$order... True 不会返回数组。 True 只会将单个结果作为字符串返回。 我正在存储一个数组,而不是尝试使用相同的键和 ID 获取所有元数据。检查sql图片。 【参考方案1】:

我根据您的信息做了一些测试,并试图重现您的问题。

首先我创建了一个函数,它在下订单时插入帖子元(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 管理员处执行此操作。当您编辑订单时,右侧有一个下拉菜单“操作”。您可以在“重新发送订单电子邮件”下选择“处理订单”。然后单击下拉菜单旁边的刷新图标,您将再次收到订单确认电子邮件。请看下面的截图:

这一次,您在发送电子邮件之前就可以确定这些值已经在数据库中了。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这是错误的。如前所述in the docs:The third argument, if set to true, will return a single result, as a string. If false, or not set, then the function returns an array of the custom fields. This may not be intuitive in the context of serialized arrays. If you fetch a serialized array with this method you want $single to be true to actually get an unserialized array back. If you pass in false, or leave it out, you will have an array of one, and the value at index 0 will be the serialized string. 确实,通过这种方法,他将在索引为 0 的其他数组中获得一个数组。但这有点奇怪,因为参加者测试正在工作,但参加者数据不工作。 attendee_test 也不起作用。电子邮件中显示的唯一内容来自 echo "test!!!&lt;br /&gt;";echo $order-&gt;id . '&lt;br /&gt;';...除非我遗漏了什么。 不,是我错过了一些东西......我认为“测试”是参加者测试的回声(值是“测试”)。在这种情况下,我认为我们可以尝试使用 get_post_custom 或尝试访问自定义字段,例如:$order->attendee_data 或简单地转储 $order 并查看对象是否存在。

以上是关于woocommerce 电子邮件通知中的 get_post_meta的主要内容,如果未能解决你的问题,请参考以下文章

从 WooCommerce 中的电子邮件通知中删除 BACS 指令

在Woocommerce电子邮件通知中显示自定义订单状态的付款链接

通过 WooCommerce 管理员电子邮件通知中的“woocommerce_email_order_meta”挂钩显示产品自定义字段

即使在WooCommerce中购物车为空,也可以通过URL中的GET方法申请优惠券折扣

删除某些 WooCommerce 电子邮件通知中的产品购买说明

向管理员发送电子邮件通知,了解 WooCommerce 中的待处理订单状态