Skip to content
Advertisement

Call to a member function get_items() on boolean in WooCommerce thankyou

I am trying to get order details to display a summary on my thank you page. The issue I am having is that this code snippet I have is breaking my wordpress. I have the stacktrace but I am unsure on how to fix it. The code to me looks correct so ensure why it’s not working. Does anybody have any idea what is the meaning of this stacktrace and how I can fix it?

   An error of type E_ERROR was caused in line 7 of the file /home4/xxx/public_html/staging/4326/wp-content/plugins/code-snippets/php/snippet-ops.php(446) : eval()'d code. Error message: Uncaught Error: Call to a member function get_items() on boolean in /home4/xxx/public_html/staging/4326/wp-content/plugins/code-snippets/php/snippet-ops.php(446) : eval()'d code:7
    Stack trace:
    #0 /home4/xxx/public_html/staging/4326/wp-includes/shortcodes.php(343): order_table_summary('', '', 'order_table_sum...')
    #1 [internal function]: do_shortcode_tag(Array)
    #2 /home4/xxx/public_html/staging/4326/wp-includes/shortcodes.php(218): preg_replace_callback('/\[(\[?)(order_...', 'do_shortcode_ta...', 'n

My code:

function order_table_summary(){
    
    $order = wc_get_order($order_id);
    
    // Get and Loop Over Order Items
    foreach ( $order->get_items() as $item_id => $item ) {

        echo $item->get_name() . $item->get_quantity. $item->get_total();
    }
}
add_shortcode('order_table_summary', 'order_table_summary');

UPDATE Adding the shortcode

enter image description here

Advertisement

Answer

The variable $order_id is not defined, $item->get_quantity need to be $item->get_quantity() and the output should never be echoed with a shortcode, always returned.

This shortcode is to be used on Order received page

add_shortcode('order_table_summary', 'display_order_table_summary_thankyou');

function display_order_table_summary_thankyou(){
    global $wp;

    // If order_id is defined on Order reveived / thankyou page
    if ( is_wc_endpoint_url('order-received')
    && isset($wp->query_vars['order-received'])
    && absint($wp->query_vars['order-received']) > 0 ) {

        // Get the WC_Order Object
        $order = wc_get_order( absint($wp->query_vars['order-received']) );

        ob_start(); // Start buffering

        echo '<table><tr>
            <th>' . __("Product name", "woocommerce") . '</th>
            <th>' . __("Quantity", "woocommerce") . '</th>
            <th>' . __("Line total", "woocommerce") . '</th>
        </tr>';

        // Loop Over Order Items
        foreach ( $order->get_items() as $item ) {
            echo '<tr>
            <td>' . $item->get_name() . '</td>
            <td>' . $item->get_quantity() . '</td>
            <td>' . $item->get_total() . '</td>
            </tr>';
        }

        echo '</table>';

        return ob_get_clean(); // Return the buffered content
    }
}

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

USAGE:

  • [order_table_summary]
  • or also inside PHP code: echo do_shortcode('[order_table_summary]');

Just for testing:

add_action( 'woocommerce_thankyou', 'testing_shorcode' );
function testing_shorcode() {
    echo do_shortcode('[order_table_summary]');
}

Related:

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement