问题
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
回答1:
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:
- Get the Order ID in Woocommerce order received page as shortcode
- Get Order items and WC_Order_Item_Product in WooCommerce 3
来源:https://stackoverflow.com/questions/64423037/call-to-a-member-function-get-items-on-boolean-in-woocommerce-thankyou