Jak zrobić własny status zamówienia w Woocommerce

Chociaż WooCommerce zawiera kilka różnych stanów zamówień, mogą one nie pasować do przepływu informacji w Twoim sklepie. Dzięki wbudowanym funkcjom WooCommerce możesz oznaczać zamówienia jednym z następujących statusów:

  • Zakończony
  • Przetwarzanie
  • Oczekuje na płatność
  • W oczekiwaniu
  • Zwrócono środki
  • Anulowany
  • Nie powiodło się

Jednak niektóre sklepy potrzebują więcej stanów zamówień, takich jak „Oczekiwanie na dostawę”, „Faktura do pobrania” lub inne, aby spełnić ich wymagania dotyczące zakończenia sprzedaży. Możesz łatwo dodać je samemu z niewielką ilością niestandardowego kodu.

Zobaczmy, jak dodać status zamówienia niestandardowego WooCommerce i usunąć status zamówienia.

Dodawanie statusu zamówienia niestandardowego WooCommerce

// Dodawanie nowego statutu zamówienia
function add_custom_order_status($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-custom-status'] = 'Nowy statut';
 }
 }
 return $new_order_statuses;
}
add_filter('wc_order_statuses', 'add_custom_order_status');

// Rejestracja nowego statutu zamówienia w systemie
function register_custom_order_status() {
 register_post_status('wc-custom-status', array(
 'label' => 'Nowy statut',
 'public' => true,
 'exclude_from_search' => false,
 'show_in_admin_all_list' => true,
 'show_in_admin_status_list' => true,
 'label_count' => _n_noop('Nowy statut <span class="count">(%s)</span>', 'Nowy statut <span class="count">(%s)</span>')
 ));
}
add_action('init', 'register_custom_order_status');

Pamiętajmy, że należy zastąpić 'wc-custom-status’ oraz 'Nowy statut’ odpowiednimi wartościami dla Twojego nowego statutu zamówienia.

Nowy status zamówienia w masowej edycji

Oto kod jaki należy wstawić w functions.php:

// Dodanie nowego statutu zamówienia do masowej edycji
function add_custom_order_status_to_bulk_edit($bulk_actions) {

// zamiast wc- stosujemy mark_
 $bulk_actions['mark_custom-status'] = 'Zmień status na Nowy statut';
 return $bulk_actions;
}
add_filter('bulk_actions-edit-shop_order', 'add_custom_order_status_to_bulk_edit');

// Obsługa masowej edycji dla nowego statutu zamówienia
function handle_bulk_order_status_change($redirect_to, $action, $post_ids) {

// zamiast wc- stosujemy mark_
 if ('mark_custom-status' !== $action) {
 return $redirect_to;
 }

 $changed_orders = 0;
 foreach ($post_ids as $post_id) {
 $order = wc_get_order($post_id);

 // tutaj tylko custom-status bez wc-
 if ($order && $order->get_status() !== 'custom-status') {
 $order->update_status('custom-status');
 $changed_orders++;
 }
 }

 $redirect_to = add_query_arg(array(
 'post_type' => 'shop_order',
 'changed' => $changed_orders,
 'ids' => join(',', $post_ids),
 'post_status' => 'all'
 ), $redirect_to);

 return $redirect_to;
}
add_filter('handle_bulk_actions-edit-shop_order', 'handle_bulk_order_status_change', 10, 3);

Zastąp 'custom-status’ oraz 'Nowy statut’ odpowiednimi wartościami dla Twojego nowego statutu zamówienia. Po dodaniu tego kodu, nowy statut zamówienia powinien być dostępny w menu masowej edycji w panelu administracyjnym WooCommerce.

Własna ikona przy statusie zamówienia

Na koniec mały dodatek dla estetów, którzy chcieliby do nowego statusu zamówienia dołączyć własną ikonkę. Aby dodać ikonę do własnego statusu zamówienia w WooCommerce, możesz skorzystać z kodu CSS w połączeniu z kodem PHP, który już dodałeś wcześniej. Oto jak to zrobić:

function add_custom_order_status_icon_css() {
 ?>
 <style>
 /* Zastąp "custom-status" odpowiednim identyfikatorem dla Twojego nowego statutu zamówienia */
 .column-order_status mark.wc-custom-status::after {
 content: '\e00d'; /* Kod ikony z Dashicons lub innego zestawu ikon */
 font-family: 'WooCommerce'; /* Czcionka użyta do ikon WooCommerce */
 color: #0c942b; /* Kolor ikony - zmień na odpowiedni dla Twojego statutu */
 }
 </style>
 <?php
}
add_action('admin_head', 'add_custom_order_status_icon_css');

Zastąp wartości „custom-status”, „content” oraz „color” odpowiednimi wartościami dla Twojego nowego statutu zamówienia:

  • W miejsce „custom-status” wprowadź identyfikator swojego nowego statutu.
  • W miejsce „content” wprowadź kod ikony z zestawu ikon, np. Dashicons (https://developer.wordpress.org/resource/dashicons/), używając formatu „\e00d”. Jeśli chcesz użyć innego zestawu ikon, zmień wartość „font-family” na odpowiednią czcionkę zawierającą ikony.
  • W miejsce „color” wprowadź kod koloru, którym chcesz wyświetlić ikonę.

Zmiana kolejności statusów nad listą zamówień w panelu administracyjnym

Aby zmienić kolejność statusów zamówień w menu nad listą zamówień w panelu administracyjnym WooCommerce, możesz użyć filtra views_edit-shop_order. Oto jak to zrobić:

function custom_order_status_order($views) {
 // Tworzenie nowej tablicy, w której będziemy przechowywać posortowane widoki
 $new_views = array();

 // Dodawanie widoków do tablicy w żądanej kolejności
 // Wartości kluczy tablicy muszą odpowiadać istniejącym kluczom tablicy $views
 // Dostosuj poniższą listę, aby uzyskać żądaną kolejność statusów zamówień
 $status_order = array(
 'all', // Wszystkie
 'wc-pending', // Oczekujące
 'wc-processing',// W trakcie realizacji
 'wc-on-hold', // Wstrzymane
 'wc-completed', // Zakończone
 'wc-cancelled', // Anulowane
 'wc-refunded', // Zwrócone
 'wc-failed', // Nieudane
 'wc-custom-status' // Twój własny statut zamówienia
 );

 // Przenoszenie widoków do nowej tablicy zgodnie z żądaną kolejnością
 foreach ($status_order as $status) {
 if (isset($views[$status])) {
 $new_views[$status] = $views[$status];
 }
 }

 // Zwracanie nowej tablicy widoków
 return $new_views;
}
add_filter('views_edit-shop_order', 'custom_order_status_order', 10, 1);

Zastąp wartości w tablicy $status_order odpowiednimi identyfikatorami statusów zamówień, aby uzyskać żądaną kolejność. Wartości kluczy tablicy muszą odpowiadać istniejącym kluczom tablicy $views.

Jeśli dodałeś własny status zamówienia, upewnij się, że dodałeś jego identyfikator do tablicy $status_order.

E-mail do klienta po zmianie wc-custom-status

Aby wysłać e-mail do klienta po zmianie statusu zamówienia na niestandardowy status (wc-custom-status), wykonaj poniższe kroki:

  1. Dodaj nowy szablon e-mail w motywie-dziecka (zalecane) lub głównym motywie. W katalogu motywu utwórz nowy katalog o nazwie woocommerce (jeśli jeszcze nie istnieje), a następnie w katalogu woocommerce utwórz katalog emails. W katalogu emails utwórz nowy plik o nazwie customer-custom-status-order.php.
  2. Otwórz plik customer-custom-status-order.php i dodaj następujący kod:
<?php
/**
 * Customer custom status order email
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/emails/customer-custom-status-order.php.
 */

if (!defined('ABSPATH')) {
 exit; // Exit if accessed directly
}

do_action('woocommerce_email_header', $email_heading, $email); ?><p><?php _e("Witaj, informujemy, że Twoje zamówienie zmieniło status na Nowy statut. Poniżej znajdziesz szczegóły zamówienia:", "woocommerce"); ?></p><?php
do_action('woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email);

do_action('woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email);

do_action('woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email);

do_action('woocommerce_email_footer', $email);
  1. Dostosuj treść e-maila według własnych potrzeb, pamiętając o zmianie „Nowy statut” na odpowiednią nazwę niestandardowego statusu zamówienia.
  2. W pliku functions.php swojego motywu (lub motywu-dziecka) dodaj poniższy kod, który zdefiniuje klasę e-mail oraz zainicjuje wysyłanie wiadomości e-mail:
// Definiowanie klasy e-mail dla wc-custom-status
class WC_Email_Customer_Custom_Status_Order extends WC_Email {
 public function __construct() {
 $this->id = 'customer_custom_status_order';
 $this->title = __('Nowy statut', 'woocommerce');
 $this->description = __('E-maile z powiadomieniem o nowym statusie zamówienia są wysyłane do klientów, gdy ich zamówienia zmieniają status na Nowy statut.', 'woocommerce');
 $this->template_html = 'emails/customer-custom-status-order.php';
 $this->template_plain = 'emails/plain/customer-custom-status-order.php';
 $this->placeholders = array(
 '{order_date}' => '',
 '{order_number}' => '',
 );

 // Triggers for this email
 add_action('woocommerce_order_status_wc-custom-status_notification', array($this, 'trigger'), 10, 2);

 // Call parent constructor
 parent::__construct();
 $this->recipient = $this->get_option('recipient', get_option('admin_email'));
 }

 public function trigger($order_id, $order = false) {
 $this->setup_locale();

 if ($order_id && !is_a($order, 'WC_Order'))
 {
 $order = wc_get_order($order_id);
 }

 if (is_a($order, 'WC_Order')) {
 $this->object = $order;
 $this->placeholders['{order_date}'] = wc_format_datetime($this->object->get_date_created());
 $this->placeholders['{order_number}'] = $this->object->get_order_number();

 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());
 }

 $this->restore_locale();
 }

 public function get_content_html() {
 return wc_get_template_html(
 $this->template_html,
 array(
 'order' => $this->object,
 'email_heading' => $this->get_heading(),
 'sent_to_admin' => false,
 'plain_text' => false,
 'email' => $this,
 )
 );
 }

 public function get_content_plain() {
 return wc_get_template_html(
 $this->template_plain,
 array(
 'order' => $this->object,
 'email_heading' => $this->get_heading(),
 'sent_to_admin' => false,
 'plain_text' => true,
 'email' => $this,
 )
 );
 }
}

// Dodanie klasy e-mail do WooCommerce
function add_custom_status_email($email_classes) {
 $email_classes['WC_Email_Customer_Custom_Status_Order'] = new WC_Email_Customer_Custom_Status_Order();
 return $email_classes;
}
add_filter('woocommerce_email_classes', 'add_custom_status_email');

W kodzie powyżej, zastąp „Nowy statut” oraz „wc-custom-status” odpowiednimi wartościami dla Twojego niestandardowego statusu zamówienia.