Java Woocommerce通过php设置订单状态并触发电子邮件
我用Java编写了一个程序,它可以满足来自Woocommerce的订单。完成订单填写后,程序通过sql将订单状态更改为“已完成”。问题是,客户的订单完成电子邮件将不会以这种方式发送 如何使用php更改数据库中列出的订单的Java Woocommerce通过php设置订单状态并触发电子邮件,java,php,sql,wordpress,woocommerce,Java,Php,Sql,Wordpress,Woocommerce,我用Java编写了一个程序,它可以满足来自Woocommerce的订单。完成订单填写后,程序通过sql将订单状态更改为“已完成”。问题是,客户的订单完成电子邮件将不会以这种方式发送 如何使用php更改数据库中列出的订单的order\u状态 我认为一旦订单状态通过php更改,将发送客户订单完成电子邮件通知 通过我的java程序,我可以写/读我的数据库和打开网站。我们如何做到这一点,是通过创建一个插件来取代原来的WooCommerce订单状态和电子邮件行为 以下是方法: 如果需要添加/删除默认订单状
order\u状态
我认为一旦订单状态通过php更改,将发送客户订单完成电子邮件通知
通过我的java程序,我可以写/读我的数据库和打开网站。我们如何做到这一点,是通过创建一个插件来取代原来的WooCommerce订单状态和电子邮件行为 以下是方法:
wc\u order\u status
hook来执行,并通过业务流程返回有效订单状态数组,然后在init
hook中执行register\u post\u status()
woocommerce\u email\u类
hook来更改。下面是我们所做工作的一个片段:
/*
* @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();
上面定义了触发器以及触发时要执行的操作。
希望这能有所帮助。您的Java应用程序不必完成订单,而是可以使用
meta\u键为订单创建一个自定义字段,如(例如)带有任何值的“\u need\u status\u update”
(例如'1'
)
现在,下面的钩子函数将检查(每次有人浏览网站时)此特定自定义字段('meta\u key'='\u need\u status\u 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应用程序中的需求:
您只需更改应用程序的行为,这将为给定的现有订单ID在wp_Posteta中添加一个自定义字段,如:
meta\u键
类似于“您需要状态更新”
(可以在您方便的时候在两侧重命名)
meta\u值
Like'1'
一旦完成,一切都将自动化
最后,检查订单的函数中的SQL请求非常轻…您好,谢谢您的回答!我曾经这样尝试过,但是当我打开我的页面时,我收到了以下错误:致命错误:未捕获错误:调用boolean上的成员函数update_status()。你知道错误是什么吗?@Philippriter我已经测试了在现有订单中添加自定义字段(在数据库表wp_Posteta中手动)之前的代码。然后,当我浏览任何页面时,自定义元数据被删除,订单状态变为已完成并触发电子邮件,没有任何错误。订单必须是真正的WC_订单…如果不是,方法更新_状态将失败并引发类似错误。@PhilippRitter我刚刚重新测试了我的代码,它可以正常工作…因此订单本身肯定有问题…如果您是从应用程序生成的,则缺少一些内容。我在上一个WooCommerce版本和上一个Wordpress版本下进行测试。我在java程序中犯了一个错误。我把订单id放在meta\u值中,而不是post\u id中-对不起!现在我再次测试了代码,它工作得非常好!非常感谢您的回答!菲利普