phpwordpresswoocommercemetadataorders

Display specific WooCommerce order formatted metadata if it exists


I keep going round in circles with my code, can anyone point me in the right direction please?

I've created a custom field for the order details page so the site admin can add a note to be printed on packing slips.

I need the 'div class="delivery-date"' section at the end of the below code to only appear IF the gift_message field is populated.

At the moment, it just displays an empty section.

add_action( 'woocommerce_admin_order_data_after_order_details', 'misha_editable_order_meta_general' );

function misha_editable_order_meta_general( $order ){

    ?>
        <br class="clear" />
        <h3>Admin note <a href="#" class="edit_address">Edit</a></h3>
        <?php
            $is_gift = $order->get_meta( 'is_gift' );
            $gift_message = $order->get_meta( 'gift_message' );
        ?>
        <div class="address">
            <p><strong>Add admin note?</strong><?php echo $is_gift ? 'Yes' : 'No' ?></p>
            <?php
                // we show the rest fields in this column only if this order is marked as a gift
                if( $is_gift ) :
                ?>
                    <p><strong>Admin note:</strong> <?php echo wpautop( esc_html( $gift_message ) ) ?></p>
                <?php
                endif;
            ?>
        </div>
        <div class="edit_address">
            <?php

                woocommerce_wp_radio( array(
                    'id' => 'is_gift',
                    'label' => 'Add admin note?',
                    'value' => $is_gift,
                    'options' => array(
                        '' => 'No',
                        '1' => 'Yes'
                    ),
                    'style' => 'width:16px', // required for checkboxes and radio buttons
                    'wrapper_class' => 'form-field-wide' // always add this class
                ) );

                woocommerce_wp_textarea_input( array(
                    'id' => 'gift_message',
                    'label' => 'Admin note:',
                    'value' => $gift_message,
                    'wrapper_class' => 'form-field-wide'
                ) );

            ?>
        </div>
    <?php 
}

add_action( 'woocommerce_process_shop_order_meta', 'misha_save_general_details' );

function misha_save_general_details( $order_id ){
    
    $order = wc_get_order( $order_id );
    $order->update_meta_data( 'is_gift', wc_clean( $_POST[ 'is_gift' ] ) );
    $order->update_meta_data( 'gift_message', wc_sanitize_textarea( $_POST[ 'gift_message' ] ) );
    // wc_clean() and wc_sanitize_textarea() are WooCommerce sanitization functions
    $order->save();
    
}

add_action( 'wpo_wcpdf_after_customer_notes', 'wpo_wcpdf_delivery_date', 10, 2 );
function wpo_wcpdf_delivery_date ($template_type, $order) {
    if ($template_type == 'packing-slip') {
        ?>
        <div class="delivery-date" style="border: 1px dashed;padding: 8px 10px 10px 10px;margin-top: 5px;min-width: 200px;">
            <div><strong>Admin note</strong></div>
            <div><?php echo $order->get_meta('gift_message'); ?></div>
        </div>
        <?php
    }
}

Solution

  • You simply need to check in an if statement that the gift message exists (is not empty).

    Try the following revised code:

    add_action( 'wpo_wcpdf_after_customer_notes', 'wpo_wcpdf_delivery_date', 10, 2 );
    
    function wpo_wcpdf_delivery_date($document_type, $order) {
        if ( 'packing-slip' != $document_type ) return; // Target only Packing slip
        
        // Check that the gift message exists (is not empty)
        if ( $gift_message = $order->get_meta('gift_message') ) {
            printf('<div class="delivery-date" style="border:1px dashed;padding:8px 10px 10px 10px;margin-top:5px;min-width:200px;">
                <div><strong>%s</strong></div>
                <div>%s</div>
            </div>', esc_html__('Admin note'), $gift_message );
        }
    }
    

    it should work.