我用Java编写了一个程序,完全填写了Woocommerce的订单。完成订单后,程序通过sql将订单状态更改为已完成。问题是客户的订单完成电子邮件不会以这种方式发送。
如何使用php从我的数据库中列出的订单更改order_status
?
一旦order_status将通过php更改,我认为客户订单已完成电子邮件通知将被发送。
使用我的java程序,我可以写入/读取数据库并打开网站。
您的Java应用程序可以使用meta_key
(例如)具有任何值的'_need_status_update'
(例如'1'
)创建订单的自定义字段,而不是完成订单。
现在,下面的钩子函数将检查(每当有人浏览网站时)此特定自定义字段('meta_key' = '_need_status_update'
)。
如果找到自定义字段,它将:
钩住功能:
add_action( 'init', 'check_orders_update_status' );
function check_orders_update_status(){
global $wpdb;
$meta_key = '_need_status_update';
// SQL query Get orders Ids that have a meta key like '_need_status_update'
$orders_ids = $wpdb->get_col( "
SELECT pm.post_id
FROM {$wpdb->prefix}postmeta as pm
WHERE pm.meta_key LIKE '$meta_key'
" );
if( count($orders_ids) > 0 ){
foreach( $orders_ids as $order_id) {
// Get an instance of the WC_Order object
$order = wc_get_order($order_id);
// Delete the meta data '_need_status_update'
delete_post_meta( $order_id, $meta_key );
// Updating Order status (will send "Customer order completed" email notification
$order->update_status('completed');
}
}
}
此代码位于活动子主题(或活动主题)的function.php文件中。
代码经过测试和运行。
更改Java App中的需求: 您只需要更改应用的行为,即为wp_postmeta添加给定的现有订单ID,自定义字段如:
meta_key
和'_need_status_update'
一样(两边都可以在方便的时候重新命名)meta_value
和'1'
一样一旦完成,一切都将自动化。
最后,检查订单的函数中的SQL请求非常轻...
我们如何做到这一点是通过创建一个插件来取代原来的WooCommerce订单状态和电子邮件行为。
这是如何做:
wc_order_statuses
挂钩,并通过业务流程返回一系列有效订单状态,并在register_post_status()
挂钩中执行init
。woocommerce_email_classes
钩子来改变。以下是我们所做的一小部分:
/*
* @hook woocommerce_email_classes
* @param WC_Email[] $emails
* @return WC_Email[]
*/
public static function initCustomEmails($emails) {
// Replace all emails with our own
global $wp_filter;
unset($wp_filter['woocommerce_order_status_completed_notification']);
$emails = [
'WC_Email_Customer_New_Account' => include('emails/classes/WC_Email_Customer_New_Account.php'),
'WC_Email_Customer_Order_Verify' => include('emails/classes/WC_Email_Customer_Order_Verify.php'),
...
];
return $emails;
}
以下是引用的电子邮件类的片段:
if ( ! class_exists('WC_Email_Customer_Order_Verify') ) {
class WC_Email_Customer_Order_Verify extends WC_Email {
/**
* Constructor
*/
function __construct() {
// Triggers for this email
add_action( 'woocommerce_order_status_order-verify', array( $this, 'trigger' ) );
add_action( 'woocommerce_checkout_order_processed', array( $this, 'trigger' ) );
// Call parent constructor
parent::__construct();
}
/**
* Trigger.
* @param WC_Order|int $wcOrder
* @throws InvalidOrderException
*/
function trigger( $wcOrder ) {
if ( ! $this->is_enabled() || ! $this->get_recipient() ) {
return;
}
$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
}
/**
* get_content_html function.
*
* @access public
* @return string
*/
function get_content_html() {
ob_start();
wc_get_template( $this->template_html, array(
'order' => $this->object,
'orderDetails' => $this->orderDetails,
'sent_to_admin' => false,
'plain_text' => false
) );
return ob_get_clean();
}
/**
* get_content_plain function.
*
* @access public
* @return string
*/
function get_content_plain() {
ob_start();
wc_get_template( $this->template_plain, array(
'order' => $this->object,
'orderDetails' => $this->orderDetails,
'sent_to_admin' => false,
'plain_text' => true
) );
return ob_get_clean();
}
}
}
return new WC_Email_Customer_Order_Verify();
触发器以及触发时的操作定义如上。希望这可以帮助。