programing

woocommerce 이메일 알림의 get_post_module

lastmemo 2023. 3. 27. 20:58
반응형

woocommerce 이메일 알림의 get_post_module

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

저는 당신의 정보를 바탕으로 몇 가지 테스트를 했고 당신의 문제를 재현하려고 했습니다.

먼저 주문 시 (주문 시) 포스트 메타(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 루프를 변경했습니다.이것은 완전히 옳지 않다고 생각했기 때문입니다(추가 포어치가 필요).물론 이것은 진짜 문제와 관련이 없다.

테스트 오더를 작성하면 이메일에 다음 데이터가 표시됩니다.

주문 데이터 확인 이메일

이 결과는 다음과 같은 것을 증명한다.get_post_meta(Wordpress 4.0.1과 WooCommerce 2.2.10을 사용)는, 상기의 코드에 근거해 E-템플릿으로 동작하고 있습니다.

위의 테스트도 정상적으로 동작하고 있는 경우는, 메일 송신 후에 값이 데이타베이스에 삽입된다고 생각합니다(올바르게 삽입되지만, 늦게 삽입됩니다).

확인 메일을 재발송신하는 것도 확인하실 수 있습니다.이 작업은 Wordpress 관리자에서 수행할 수 있습니다.주문을 편집하면 오른쪽에 '작업' 드롭다운이 표시됩니다.주문서 재발송신 메일'에서 '처리주문'을 선택하실 수 있습니다.그런 다음 드롭다운 옆에 있는 새로 고침 아이콘을 클릭하면 주문 확인 이메일을 다시 받게 됩니다.아래 스크린샷을 참조하십시오.

주문 확인 이메일 재발송

이번에는 전자 메일을 보내기 전에 값이 이미 데이터베이스에 있는지 확인합니다.

이 정보가 문제 해결에 도움이 되기를 바랍니다.

'attendee_data'는 직렬화된 개체이므로 함수 get_post_meta에 전달된 세 번째 인수는 false(또는 생략)로 설정해야 합니다.

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

언급URL : https://stackoverflow.com/questions/25635461/get-post-meta-in-woocommerce-email-notifications

반응형