使用 "woocommerce_thankyou" 挂钩时保存 post 元数据(SQL 查询的结果)
Save post meta data (result of a SQL query) when using the "woocommerce_thankyou" hook
我正在尝试查询我的数据库并将结果传递给 update_post_meta
函数。但是不确定我是否正在正确构建它或者我的 $order_id
用法是否存在问题?
我需要 post 元来更新当前登录用户和当前订单的查询结果,一旦下订单,所以认为 woocommerce_thankyou
挂钩是有意义的完成一个没有 post meta 的订单。
add_filter( 'woocommerce_thankyou', 'my_function', 10, 2);
function my_function( $result, $order_id ) {
// Load the global $post
global $woocommerce, $post;
// Get the post ID
$order_id = $post->ID;
// Then you can get the order object
$order = wc_get_order( $order_id );
$user_ID = get_current_user_id();
//SQL
global $wpdb;
return $wpdb->get_var("SELECT SUM(b03_woocommerce_order_itemmeta.meta_value)
FROM b03_woocommerce_order_itemmeta
JOIN b03_woocommerce_order_items ON b03_woocommerce_order_itemmeta.order_item_id = b03_woocommerce_order_items.order_item_id
JOIN b03_posts ON b03_woocommerce_order_items.order_id = b03_posts.ID
JOIN b03_postmeta ON b03_posts.ID = b03_postmeta.post_id
WHERE b03_posts.post_type = 'shop_order'
AND b03_woocommerce_order_itemmeta.meta_key = 'trees_planted'
AND b03_postmeta.meta_value = $user_ID
AND b03_postmeta.meta_key = '_customer_user'
AND b03_posts.ID = $order_id");
update_post_meta( $order_id, 'trees',$wpdb);
}
感谢任何有关如何最好地处理此问题的建议?
您的代码尝试包含多个错误:
woocommerce_thankyou
是动作挂钩,不是过滤挂钩
- 只有
$order_id
传递给回调函数,$result
不适用
- 使用
$wpdb->prefix
与 b03_
,这使它成为动态的
$wpdb
是一个对象
global $woocommerce, $post;
的使用是多余的
所以你得到:
function action_woocommerce_thankyou( $order_id ) {
// Get $order object
$order = wc_get_order( $order_id );
// Is a WC_Order
if ( is_a( $order, 'WC_Order' ) ) {
// Get user id
$user_id = $order->get_user_id();
// Not a guest
if ( $user_id > 0 ) {
//SQL
global $wpdb;
// The SQL query
$result = $wpdb->get_var( "
SELECT SUM( oim.meta_value )
FROM {$wpdb->prefix}woocommerce_order_itemmeta as oim
JOIN {$wpdb->prefix}woocommerce_order_items as oi ON oim.order_item_id = oi.order_item_id
JOIN {$wpdb->prefix}posts as p ON oi.order_id = p.ID
JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_order'
AND oim.meta_key = 'trees_planted'
AND pm.meta_value = '$user_id'
AND pm.meta_key = '_customer_user'
AND p.ID = '$order_id'
" );
// REMOVE THIS, only for testing purposes
$result = 10;
// Add the meta data
$order->update_meta_data( 'trees', $result );
$order->save();
}
}
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );
注意: 因为您使用的是自定义 SQL 查询,其中 data/result 在 WooCommerce 的 general/default 中不存在,但仅针对您,我已在我的答案中将其替换为固定值 10。根据需要进行调整!
我正在尝试查询我的数据库并将结果传递给 update_post_meta
函数。但是不确定我是否正在正确构建它或者我的 $order_id
用法是否存在问题?
我需要 post 元来更新当前登录用户和当前订单的查询结果,一旦下订单,所以认为 woocommerce_thankyou
挂钩是有意义的完成一个没有 post meta 的订单。
add_filter( 'woocommerce_thankyou', 'my_function', 10, 2);
function my_function( $result, $order_id ) {
// Load the global $post
global $woocommerce, $post;
// Get the post ID
$order_id = $post->ID;
// Then you can get the order object
$order = wc_get_order( $order_id );
$user_ID = get_current_user_id();
//SQL
global $wpdb;
return $wpdb->get_var("SELECT SUM(b03_woocommerce_order_itemmeta.meta_value)
FROM b03_woocommerce_order_itemmeta
JOIN b03_woocommerce_order_items ON b03_woocommerce_order_itemmeta.order_item_id = b03_woocommerce_order_items.order_item_id
JOIN b03_posts ON b03_woocommerce_order_items.order_id = b03_posts.ID
JOIN b03_postmeta ON b03_posts.ID = b03_postmeta.post_id
WHERE b03_posts.post_type = 'shop_order'
AND b03_woocommerce_order_itemmeta.meta_key = 'trees_planted'
AND b03_postmeta.meta_value = $user_ID
AND b03_postmeta.meta_key = '_customer_user'
AND b03_posts.ID = $order_id");
update_post_meta( $order_id, 'trees',$wpdb);
}
感谢任何有关如何最好地处理此问题的建议?
您的代码尝试包含多个错误:
woocommerce_thankyou
是动作挂钩,不是过滤挂钩- 只有
$order_id
传递给回调函数,$result
不适用 - 使用
$wpdb->prefix
与b03_
,这使它成为动态的 $wpdb
是一个对象global $woocommerce, $post;
的使用是多余的
所以你得到:
function action_woocommerce_thankyou( $order_id ) {
// Get $order object
$order = wc_get_order( $order_id );
// Is a WC_Order
if ( is_a( $order, 'WC_Order' ) ) {
// Get user id
$user_id = $order->get_user_id();
// Not a guest
if ( $user_id > 0 ) {
//SQL
global $wpdb;
// The SQL query
$result = $wpdb->get_var( "
SELECT SUM( oim.meta_value )
FROM {$wpdb->prefix}woocommerce_order_itemmeta as oim
JOIN {$wpdb->prefix}woocommerce_order_items as oi ON oim.order_item_id = oi.order_item_id
JOIN {$wpdb->prefix}posts as p ON oi.order_id = p.ID
JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_order'
AND oim.meta_key = 'trees_planted'
AND pm.meta_value = '$user_id'
AND pm.meta_key = '_customer_user'
AND p.ID = '$order_id'
" );
// REMOVE THIS, only for testing purposes
$result = 10;
// Add the meta data
$order->update_meta_data( 'trees', $result );
$order->save();
}
}
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );
注意: 因为您使用的是自定义 SQL 查询,其中 data/result 在 WooCommerce 的 general/default 中不存在,但仅针对您,我已在我的答案中将其替换为固定值 10。根据需要进行调整!