我在之前的问题之后还有一个问题:添加不存在的订单元数据以扩展 WooCommerce 管理订单搜索
我有两个问题:
第一:如果我希望只有当客户购买了id为120和260的两个产品时才保存这个md5值,该怎么办? (即当支付成功并完成购买时,如果ID为120和260的这两种产品之一或两种产品都在客户(成功)的订单中,则应存储此md5值)
第二: 订购两个特定产品(例如 ID 120 和 260)后,如何执行以下代码或执行一段 php 代码?
$pro_message = 'Hi dear'
echo $pro_message. 'custom php code';
为了使 “仅当特定产品在购物车(或订单商品)中时才保存此 md5 值,我们需要一个可重用的条件函数来检查商品:
// Conditional function: Check if specific products are in cart or order items
function has_items_for_email_md5( $object_items ) {
$found_120 = $found_260 = false; // Initializing
foreach ( $object_items as $item ) {
$product_id = isset($item['product_id']) ? $item['product_id'] : $item->get_product_id();
$variation_id = isset($item['variation_id']) ? $item['variation_id'] : $item->get_variation_id();
if ( in_array('120', [$product_id , $variation_id]) ) $found_120 = true;
if ( in_array('260', [$product_id , $variation_id]) ) $found_260 = true;
}
return ( $found_120 && $found_260 );
}
现在我们可以对之前的代码进行一些小的更改,这将使用这个条件函数:
// When order is created after checkout
add_action( 'woocommerce_checkout_create_order', 'save_billing_email_md5', 20, 2 );
function save_billing_email_md5( $order, $data ) {
if ( ! has_items_for_email_md5( WC()->cart->get_cart() ) ) return;
if( $billing_email = $order->get_billing_email() ) {
$order->add_meta_data('_billing_email_md5', md5($billing_email));
}
}
// When an order is manually created/updated in admin
add_action( 'woocommerce_process_shop_order_meta', 'admin_save_billing_email_md5' );
function admin_save_billing_email_md5( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! has_items_for_email_md5( $order->get_items() ) ) return;
if( $billing_email = $order->get_billing_email() ) {
update_post_meta($order_id, '_billing_email_md5', md5($billing_email));
}
}
最后一个功能保持不变:
add_filter( 'woocommerce_shop_order_search_fields', 'extending_admin_orders_search_field', 10, 1 );
function extending_admin_orders_search_field( $meta_keys ){
$meta_keys[] = '_billing_email';
$meta_keys[] = '_billing_phone';
$meta_keys[] = '_payment_method_title';
$meta_keys[] = '_billing_email_md5'; // <=== HERE
return $meta_keys;
}
应该可以。
$order = wc_get_order( $order_id ); // Get WC_Order object (if needed)
if ( has_items_for_email_md5( $order->get_items() ) ) {
$pro_message = __('Hi dear');
echo $pro_message . __('custom php code');
}