• Resolved rdmit

    (@rdmit)


    Hi there, I have used this snippet (https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/displaying-a-custom-field/) to implement an additional field to our checkout process. The custom field value its not displayed on the PDF.

    What’s missing? This is the snippet:

    // Display the custom field inside the PDF Invoice and Packing slips
    
    add_action( 'wpo_wcpdf_after_order_data', 'rdm_po_number', 10, 2 );
    function rdm_po_number ($template_type, $order) {
        if ($template_type == 'packing-slip' || $template_type == 'invoice') {
            $document = wcpdf_get_document( $template_type, $order );
            ?>
            <tr style="padding:0.5rem; background: #D46A6A; border: 1px solid #670d0d "  class="po-number">
                <th>Your Purchase order no.:</th>
                <td class="text-black"><?php $document->custom_field('rdm_po_number_field'); ?></td>
            </tr>
            <?php
        }
    }
Viewing 3 replies - 1 through 3 (of 3 total)
  • Plugin Contributor Ewout

    (@pomegranate)

    Hi! The snippet you link to is our own documentation, it sounds like you wanted to link to the snippet you used to add the checkout field instead. Could you post the snippet you have used for the checkout field?

    You may also want to check our guide to Finding WooCommerce Custom Fields, this may help to double check that the value is actually stored in the order and that you are using the correct meta key for the custom field.

    Thread Starter rdmit

    (@rdmit)

    Hi Ewout, yes you are right. I have actually figured out what to do and this snippet worked in my case.

    // Display the custom field inside the PDF Invoice and Packing slips

    add_filter( 'wpo_wcpdf_after_order_data', 'rdm_po_number', 10, 2 );
    function rdm_po_number( $template_type, $order ) {
    	if ( $template_type == 'invoice' || $template_type == 'packing-slip' ) {
    		$rdm_po_number= $order->get_meta('Purchase Order Number');
    		echo "<tr style='padding:0.5rem; background: #ededed;'><td>Your PO no.:</td><td>{$rdm_po_number}</td></tr>";
    	}
    }

    That was the final part of the snippet, the full one is as follow and works fine for me:

    
    / 1 Let’s add a new field to checkout, after the order notes, by hooking into the following:
    
    /**
     * Add the field to the checkout
     */
    add_action( 'woocommerce_after_order_notes', 'rdm_custom_checkout_field' );
    
    function rdm_custom_checkout_field( $checkout ) {
    
        echo '<div id="rdm_custom_checkout_field"><h2>' . __('Your Purchase Order no.') . '</h2>';
    
        woocommerce_form_field( 'rdm_po_number_field', array(
            'type'          => 'text',
            'class'         => array('rdm-field-class form-row-wide'),
            'label'         => __('Add your internal purchase order number'),
            'placeholder'   => __('XX-123354'),
            ), $checkout->get_value( 'rdm_po_number_field' ));
    
        echo '</div>';
    
    }
    
    // 2 Next we need to validate the field when the checkout form is posted. For this example the field is required and not optional:
    
    /**
     * Process the checkout
     */
    add_action('woocommerce_checkout_process', 'rdm_custom_checkout_field_process');
    
    function rdm_custom_checkout_field_process() {
        // Check if set, if its not set add an error.
        if ( ! $_POST['rdm_po_number_field'] )
            wc_add_notice( __( 'Please add your internal purchase order number.' ), 'error' );
    }
    
    //3 Finally, let’s save the new field to order custom fields using the following code:
    
    /**
     * Update the order meta with field value
     */
    add_action( 'woocommerce_checkout_update_order_meta', 'rdm_custom_checkout_field_update_order_meta' );
    
    function rdm_custom_checkout_field_update_order_meta( $order_id ) {
        if ( ! empty( $_POST['rdm_po_number_field'] ) ) {
            update_post_meta( $order_id, 'Purchase Order Number', sanitize_text_field( $_POST['rdm_po_number_field'] ) );
        }
    }
    
    // 4 If you wish to display the custom field value on the admin order edition page, you can add this code:
    
    /**
     * Display field value on the order edit page
     */
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'rdm_custom_checkout_field_display_admin_order_meta', 10, 1 );
    
    function rdm_custom_checkout_field_display_admin_order_meta($order){
        echo '<div style="padding:0.5rem; background: #D46A6A; border: 1px solid #670d0d " role="alert"><strong>'.__('Purchase Order Number').':</strong> ' . get_post_meta( $order->get_id(), 'Purchase Order Number', true ) . '</div>';
    }
    
    // Addd custom fields to the email 
    /* To use: 
    1. Add this snippet to your theme's functions.php file
    2. Change the meta key names in the snippet
    3. Create a custom field in the order post - e.g. key = "Tracking Code" value = abcdefg
    4. When next updating the status, or during any other event which emails the user, they will see this field in their email
    */
    add_filter('woocommerce_email_order_meta_keys', 'rdm_custom_order_meta_keys');
    
    function rdm_custom_order_meta_keys( $keys ) {
         $keys[] = 'Purchase Order Number'; // This will look for a custom field called 'Tracking Code' and add it to emails
         return $keys;
    }
    // Display the custom field inside the PDF Invoice and Packing slips
    
    add_filter( 'wpo_wcpdf_after_order_data', 'rdm_po_number', 10, 2 );
    function rdm_po_number( $template_type, $order ) {
    	if ( $template_type == 'invoice' || $template_type == 'packing-slip' ) {
    		$rdm_po_number= $order->get_meta('Purchase Order Number');
    		echo "<tr style='padding:0.5rem; background: #ededed;'><td>Your PO no.:</td><td>{$rdm_po_number}</td></tr>";
    	}
    }
    
    Plugin Contributor Ewout

    (@pomegranate)

    Very glad to hear that ??

    Have a fantastic day!

Viewing 3 replies - 1 through 3 (of 3 total)
  • The topic ‘Custom Field value not outputted inside the PDF’s templates’ is closed to new replies.