Vâng trong chủ đề hôm nay mình sẽ chia sẽ các chúng ta thêm một new order status (ví dụ thêm một trạng thái cho đơn hàng là khi chủ vendor tiếp nhận đơn và xác nhận “Gọi là trạng thái đơn hàng đã được xác nhận” và đồng thời gửi email thông báo cho khách hàng là đơn hàng đã được vendor tiếp nhận)
1 2 3 4 5 6 7 8 9 10 11 |
add_action( 'init', array($this,'register_confirm_order_status') ); function register_confirm_order_status() { register_post_status( 'wc-confirmed', array( 'label' => 'Đã xác nhận', 'public' => true, 'show_in_admin_status_list' => true, 'show_in_admin_all_list' => true, 'exclude_from_search' => false, 'label_count' => _n_noop( 'Đã xác nhận đơn hàng <span class="count">(%s)</span>', 'Đã xác nhận đơn hàng <span class="count">(%s)</span>' ) ) ); } |
Trong code sau chúng ta sẽ đặt new order status dưới trạng thái là “Đang xử lý”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function add_confirm_order_to_order_statuses( $order_statuses ) { $new_order_statuses = array(); foreach ( $order_statuses as $key => $status ) { $new_order_statuses[ $key ] = $status; if ( 'wc-processing' === $key ) { $new_order_statuses['wc-confirmed'] = 'Đã xác nhận'; } } return $new_order_statuses; } add_filter( 'wc_order_statuses', array($this,'add_confirm_order_to_order_statuses') ); |
Rất tiếc là hook filter không hoạt động được nên chúng ta phải sửa thẳng trong code dokan lite
Bạn tìm function “dokan_get_order_status_class” trong file dokan-lite/includes/Order/functions.php
Sửa thành:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
function dokan_get_order_status_class( $status ) { switch ( $status ) { case 'completed': case 'wc-completed': return 'success'; break; case 'pending': case 'wc-pending': return 'danger'; break; case 'on-hold': case 'wc-on-hold': return 'warning'; break; case 'processing': case 'wc-processing': return 'info'; break; case 'refunded': case 'wc-refunded': return 'default'; break; case 'cancelled': case 'wc-cancelled': return 'default'; break; case 'failed': case 'wc-failed': return 'danger'; break; case 'confirmed': case 'wc-confirmed': return 'confirmed-order dokan-btn-success'; break; default: return apply_filters( 'dokan_get_order_status_class', '', $status ); break; } } |
và cũng trong file này tìm function “dokan_get_order_status_translated” sửa thành:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
function dokan_get_order_status_translated( $status ) { switch ( $status ) { case 'completed': case 'wc-completed': return __( 'Completed', 'dokan-lite' ); break; case 'pending': case 'wc-pending': return __( 'Pending Payment', 'dokan-lite' ); break; case 'on-hold': case 'wc-on-hold': return __( 'On-hold', 'dokan-lite' ); break; case 'processing': case 'wc-processing': return __( 'Processing', 'dokan-lite' ); break; case 'refunded': case 'wc-refunded': return __( 'Refunded', 'dokan-lite' ); break; case 'cancelled': case 'wc-cancelled': return __( 'Cancelled', 'dokan-lite' ); break; case 'failed': case 'wc-failed': return __( 'Failed', 'dokan-lite' ); break; case 'confirmed': case 'wc-confirmed': return __( 'Đã xác nhận' ); break; default: return apply_filters( 'dokan_get_order_status_translated', '', $status ); break; } } |
Hai chỗ cần thêm là như hình dưới: cái button xác nhận đơn hàng khi vendor click vào nó sẽ chuyển trạng thái đơn hàng sơn là “Đã xác nhận” và đồng thời trigger gửi email đến khách hàng
Copy file listing.php tại dokan-lite/templates/orders/listing.php về thư mục của theme: folder theme hiện tại/dokan/orders/listing.php
Tìm : “in_array( dokan_get_prop( $order, ‘status’ ), [ ‘pending’, ‘on-hold’ ]”
Rồi thêm phía trên “in_array( dokan_get_prop( $order, ‘status’ ), [ ‘pending’, ‘on-hold’ ]” code sau vào:
1 2 3 4 5 6 7 8 |
if ( in_array( dokan_get_prop( $order, 'status' ), [ 'pending', 'on-hold', 'processing' ] ) ) { $actions['confirmed'] = [ 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=copgap-mark-order-confirmed&order_id=' . dokan_get_prop( $order, 'id' ) ), 'dokan-mark-order-complete' ), 'name' => __( 'Xác nhận đơn hàng' ), 'action' => 'confirmed', 'icon' => '<i class="fas fa-check-circle-o"> </i>', ]; } |
Thì khi click nó đơn giản là set trạng thái đơn hàng về Đã xác nhận và gửi email sẽ được móc vào “do_action(“copgap_triger_send_email_confirmed_order”,$order_id);”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function copgap_mark_order_confirmed(){ if ( ! is_admin() ) { die(); } if ( ! current_user_can( 'dokandar' ) || 'on' !== dokan_get_option( 'order_status_change', 'dokan_selling', 'on' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'dokan-lite' ) ); } if ( ! check_admin_referer( 'dokan-mark-order-complete' ) ) { wp_die( esc_html__( 'You have taken too long. Please go back and retry.', 'dokan-lite' ) ); } $order_id = ! empty( $_GET['order_id'] ) ? intval( $_GET['order_id'] ) : 0; if ( ! $order_id ) { die(); } if ( ! dokan_is_seller_has_order( dokan_get_current_user_id(), $order_id ) ) { wp_die( esc_html__( 'You do not have permission to change this order', 'dokan-lite' ) ); } $order = dokan()->order->get( $order_id ); $order->update_status( 'confirmed' ); //kích hoạt gửi email tại chỗ này do_action("copgap_triger_send_email_confirmed_order",$order_id); wp_safe_redirect( wp_get_referer() ); die(); } add_action("wp_ajax_copgap-mark-order-confirmed",array($this,'copgap_mark_order_confirmed')); add_action("wp_ajax_nopriv_copgap-mark-order-confirmed",array($this,'copgap_mark_order_confirmed')); |
chính là class “Order_Confirmed_By_Vendor” và chúng ta sẽ viết class này trong file Abc_Email_Order_Confirmed.php
1 2 3 4 5 6 7 |
add_filter( 'woocommerce_email_classes', array( $this, 'load_abc_emails' ), 36 ); public function load_abc_emails( $wc_emails ) { include ABC_CLASSES_DIR ."Abc_Email_Order_Confirmed.php"; $wc_emails['Abc_Email_Order_Confirmed'] = new \Themes\Abc\Classes\Order_Confirmed_By_Vendor(); return $wc_emails; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
<?php namespace Themes\Abc\Classes; use WC_Email; class Order_Confirmed_By_Vendor extends WC_Email { public function __construct() { $this->id = 'abc_email_order_confirmed'; $this->title = __( 'Email gửi đến khách hàng khi nhà bán hàng xác nhận đơn hàng'); $this->description = __( 'Email gửi đến khách hàng khi nhà bán hàng xác nhận đơn hàng' ); $this->template_html = 'emails/customer-confirmed-order.php'; $this->template_plain = 'emails/plain/customer-confirmed-order.php'; $this->template_base = ABC_DIR . '/templates/'; // Triggers for this email add_action( 'copgap_triger_send_email_confirmed_order', array( $this, 'trigger' ) ); // Call parent constructor parent::__construct(); //$this->recipient = '[email protected]'; } /** * Get email subject. * @return string */ public function get_default_subject() { return __( '[{site_name}] {set_email_subject}', 'dokan' ); } /** * Get email heading. * @return string */ public function get_default_heading() { return __( '{set_email_subject}', 'dokan' ); } public function trigger( $order_id ) { if ( ! $this->is_enabled() ) { return; } if ( $order_id ) { $this->object = wc_get_order( $order_id ); $default_heading = __( 'Chủ shop đã tiếp nhận đơn hàng của bạn' ); if ( $this->object ) { $this->recipient = $this->object->get_billing_email(); $this->find['site_name'] = '{site_name}'; $this->find['set_email_subject'] = '{set_email_subject}'; $this->replace['site_name'] = $this->get_from_name(); $this->replace['set_email_subject'] = $default_heading; } } if ( $this->is_enabled() && $this->get_recipient() ) { $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); } $this->restore_locale(); } /** * Get content html. * * @access public * @return string */ public function get_content_html() { ob_start(); wc_get_template( $this->template_html, array( 'order' => $this->object, 'email_heading' => $this->get_heading(), 'sent_to_admin' => false, 'plain_text' => false, 'email' => $this, 'tracking_info' => $this->shipping_info, 'ship_info' => $this->ship_info, ), 'dokan/', $this->template_base ); return ob_get_clean(); } /** * Get content plain. * * @access public * @return string */ public function get_content_plain() { ob_start(); wc_get_template( $this->template_html, array( 'order' => $this->object, 'email_heading' => $this->get_heading(), 'sent_to_admin' => false, 'plain_text' => true, 'email' => $this, 'tracking_info' => $this->shipping_info, ), 'dokan/', $this->template_base ); return ob_get_clean(); } /** * Initialize settings form fields. */ public function init_form_fields() { $this->form_fields = array( 'enabled' => array( 'title' => __( 'Enable/Disable', 'dokan' ), 'type' => 'checkbox', 'label' => __( 'Enable this email notification', 'dokan' ), 'default' => 'yes', ), 'subject' => array( 'title' => __( 'Subject', 'dokan' ), 'type' => 'text', 'desc_tip' => true, /* translators: %s: list of placeholders */ 'description' => sprintf( __( 'Available placeholders: %s', 'dokan' ), '<code>{title}, {message}, {site_name}</code>' ), 'placeholder' => $this->get_default_subject(), 'default' => '', ), 'heading' => array( 'title' => __( 'Email heading', 'dokan' ), 'type' => 'text', 'desc_tip' => true, /* translators: %s: list of placeholders */ 'description' => sprintf( __( 'Available placeholders: %s', 'dokan' ), '<code>{title}, {message}, {site_name}</code>' ), 'placeholder' => $this->get_default_heading(), 'default' => '', ), 'email_type' => array( 'title' => __( 'Email type', 'dokan' ), 'type' => 'select', 'description' => __( 'Choose which format of email to send.', 'dokan' ), 'default' => 'html', 'class' => 'email_type wc-enhanced-select', 'options' => $this->get_email_type_options(), 'desc_tip' => true, ), ); } } |
customer-confirmed-order.php file này anh chị copy từ woocommerce/templates/emails sang và đổi tên lại như vậy và bạn có thể đặt ở đâu bạn muốn trong thư mục theme cua bạn làm sao đảm bảo đúng path
1 2 3 |
$this->template_html = 'emails/customer-confirmed-order.php'; $this->template_plain = 'emails/plain/customer-confirmed-order.php'; $this->template_base = ABC_DIR . '/templates/'; |
Mọi sự sao chép xin ghi rõ nguồn là fcwordpress.net
Chuyên trang về wordpress: hướng dẫn thiết kế theme, plugin, thủ thuật wordpress