Προσθήκη προσαρμοσμένου dropdown κατάστασης παραγγελίας στο WooCommerce Admin
Μάθετε πώς να προσθέσετε ένα εσωτερικό custom order dropdown
στις παραγγελίες WooCommerce, ώστε να αποθηκεύετε και να εμφανίζετε επιπλέον
κατάσταση όπως Απεσταλμένη ή Μη απεσταλμένη.
Τι κάνει αυτό το snippet
Από προεπιλογή, το WooCommerce διαθέτει βασικές καταστάσεις παραγγελίας όπως Pending, Processing, Completed και Cancelled. Σε πολλά καταστήματα όμως χρειάζεται μια επιπλέον, εσωτερική ένδειξη χωρίς να δημιουργηθεί πλήρως νέα WooCommerce order status.
Το snippet προσθέτει ένα προσαρμοσμένο dropdown μέσα στη σελίδα επεξεργασίας παραγγελίας, αποθηκεύει την επιλεγμένη τιμή ως order meta και την εμφανίζει στη λίστα παραγγελιών.
1) Γιατί να προσθέσετε custom order dropdown;
Ένα εσωτερικό dropdown κατάστασης είναι χρήσιμο όταν θέλετε να κρατάτε επιπλέον πληροφορία για κάθε παραγγελία, χωρίς να μπερδεύετε τις βασικές καταστάσεις του WooCommerce.
- Παρακολούθηση εσωτερικών καταστάσεων όπως “Dispatched”, “Packed” ή “Awaiting Courier”.
- Βελτιωμένη διαχείριση παραγγελιών στο WooCommerce Admin.
- Πιο ξεκάθαρη ενημέρωση προσωπικού χωρίς αλλαγή της βασικής order status ροής.
- Γρήγορη οπτική ένδειξη μέσα από τη λίστα παραγγελιών.
2) Πριν προσθέσετε τον κώδικα
Πριν χρησιμοποιήσετε οποιοδήποτε snippet που επηρεάζει το WooCommerce admin, κάντε πρώτα έναν βασικό έλεγχο.
- Πάρτε backup των αρχείων και της βάσης δεδομένων.
- Δοκιμάστε πρώτα σε staging περιβάλλον.
- Χρησιμοποιήστε child theme ή custom plugin, όχι απευθείας parent theme.
- Ελέγξτε ότι ο χρήστης admin μπορεί να αποθηκεύσει σωστά την παραγγελία.
- Αν χρησιμοποιείτε HPOS, δοκιμάστε τη λίστα παραγγελιών μετά την προσθήκη.
3) Code Snippet
Προσθέστε τον παρακάτω κώδικα στο functions.php του child theme σας
ή, ιδανικά, μέσα σε ένα μικρό custom plugin.
/**
* Add a custom internal order status dropdown in WooCommerce admin.
* Stores the value as order meta and displays it in the orders list.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Available internal status options.
*/
function vgdev_internal_order_status_options() {
return array(
'not_dispatched' => __( 'Μη απεσταλμένη', 'woocommerce' ),
'dispatched' => __( 'Απεσταλμένη', 'woocommerce' ),
'packed' => __( 'Συσκευασμένη', 'woocommerce' ),
'awaiting_courier' => __( 'Αναμονή courier', 'woocommerce' ),
);
}
/**
* Get saved internal status for an order.
*/
function vgdev_get_internal_order_status( $order ) {
if ( ! $order instanceof WC_Order ) {
return 'not_dispatched';
}
$status = $order->get_meta( '_vgdev_internal_order_status', true );
$options = vgdev_internal_order_status_options();
return array_key_exists( $status, $options ) ? $status : 'not_dispatched';
}
/**
* Add dropdown inside the order edit screen.
*/
add_action( 'woocommerce_admin_order_data_after_order_details', 'vgdev_add_internal_order_status_dropdown' );
function vgdev_add_internal_order_status_dropdown( $order ) {
if ( ! $order instanceof WC_Order ) {
return;
}
$saved_status = vgdev_get_internal_order_status( $order );
$options = vgdev_internal_order_status_options();
wp_nonce_field( 'vgdev_save_internal_order_status', 'vgdev_internal_order_status_nonce' );
?>
<p class="form-field form-field-wide">
<label for="vgdev_internal_order_status">
<?php esc_html_e( 'Εσωτερική κατάσταση παραγγελίας', 'woocommerce' ); ?>
</label>
<select id="vgdev_internal_order_status" name="vgdev_internal_order_status">
<?php foreach ( $options as $value => $label ) : ?>
<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $saved_status, $value ); ?>>
<?php echo esc_html( $label ); ?>
</option>
<?php endforeach; ?>
</select>
<span class="description">
<?php esc_html_e( 'Χρησιμοποιείται μόνο εσωτερικά στο WooCommerce admin.', 'woocommerce' ); ?>
</span>
</p>
<?php
}
/**
* Save dropdown value when the order is saved.
*/
add_action( 'woocommerce_process_shop_order_meta', 'vgdev_save_internal_order_status_dropdown', 20, 1 );
function vgdev_save_internal_order_status_dropdown( $order_id ) {
if (
! isset( $_POST['vgdev_internal_order_status_nonce'] ) ||
! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['vgdev_internal_order_status_nonce'] ) ), 'vgdev_save_internal_order_status' )
) {
return;
}
if ( ! current_user_can( 'edit_shop_order', $order_id ) ) {
return;
}
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
$options = vgdev_internal_order_status_options();
$status = isset( $_POST['vgdev_internal_order_status'] )
? sanitize_key( wp_unslash( $_POST['vgdev_internal_order_status'] ) )
: 'not_dispatched';
if ( ! array_key_exists( $status, $options ) ) {
$status = 'not_dispatched';
}
$order->update_meta_data( '_vgdev_internal_order_status', $status );
$order->save();
}
/**
* Add column to legacy WooCommerce orders list.
*/
add_filter( 'manage_edit-shop_order_columns', 'vgdev_add_internal_order_status_column', 20 );
/**
* Add column to HPOS WooCommerce orders list.
*/
add_filter( 'manage_woocommerce_page_wc-orders_columns', 'vgdev_add_internal_order_status_column', 20 );
function vgdev_add_internal_order_status_column( $columns ) {
$new_columns = array();
foreach ( $columns as $key => $column ) {
$new_columns[ $key ] = $column;
if ( 'order_status' === $key ) {
$new_columns['vgdev_internal_order_status'] = __( 'Εσωτερική κατάσταση', 'woocommerce' );
}
}
return $new_columns;
}
/**
* Render column for legacy orders list.
*/
add_action( 'manage_shop_order_posts_custom_column', 'vgdev_render_internal_order_status_column_legacy', 20, 2 );
function vgdev_render_internal_order_status_column_legacy( $column, $post_id ) {
if ( 'vgdev_internal_order_status' !== $column ) {
return;
}
$order = wc_get_order( $post_id );
vgdev_render_internal_order_status_badge( $order );
}
/**
* Render column for HPOS orders list.
*/
add_action( 'manage_woocommerce_page_wc-orders_custom_column', 'vgdev_render_internal_order_status_column_hpos', 20, 2 );
function vgdev_render_internal_order_status_column_hpos( $column, $order ) {
if ( 'vgdev_internal_order_status' !== $column ) {
return;
}
vgdev_render_internal_order_status_badge( $order );
}
/**
* Output admin badge.
*/
function vgdev_render_internal_order_status_badge( $order ) {
if ( ! $order instanceof WC_Order ) {
echo '—';
return;
}
$status = vgdev_get_internal_order_status( $order );
$options = vgdev_internal_order_status_options();
$label = isset( $options[ $status ] ) ? $options[ $status ] : $options['not_dispatched'];
echo '<mark class="order-status status-' . esc_attr( $status ) . '"><span>' . esc_html( $label ) . '</span></mark>';
}
4) Πώς λειτουργεί
vgdev_internal_order_status_options() ορίζει τις διαθέσιμες επιλογές του dropdown.
woocommerce_admin_order_data_after_order_details προσθέτει το πεδίο στη σελίδα επεξεργασίας παραγγελίας.
_vgdev_internal_order_status.
shop_order όσο και για wc-orders.
5) Πώς να αλλάξετε τις επιλογές του dropdown
Οι διαθέσιμες επιλογές βρίσκονται στη συνάρτηση vgdev_internal_order_status_options().
Μπορείτε να προσθέσετε, να αφαιρέσετε ή να μετονομάσετε statuses ανάλογα με το workflow σας.
function vgdev_internal_order_status_options() {
return array(
'not_dispatched' => __( 'Μη απεσταλμένη', 'woocommerce' ),
'dispatched' => __( 'Απεσταλμένη', 'woocommerce' ),
'packed' => __( 'Συσκευασμένη', 'woocommerce' ),
'awaiting_courier' => __( 'Αναμονή courier', 'woocommerce' ),
);
}
6) Πού να προσθέσετε τον κώδικα
Υπάρχουν τρεις βασικές επιλογές για να προσθέσετε το snippet.
- Child theme functions.php: γρήγορη λύση, αρκεί να χρησιμοποιείτε child theme.
- Custom plugin: πιο καθαρή και ασφαλής λύση, γιατί δεν εξαρτάται από το theme.
- Snippet plugin: πρακτικό αν ήδη διαχειρίζεστε snippets μέσα από το WordPress admin.
7) Έλεγχος μετά την προσθήκη
Μετά την εγκατάσταση του snippet, κάντε έναν γρήγορο έλεγχο για να επιβεβαιώσετε ότι όλα λειτουργούν σωστά.
- Ανοίξτε μια υπάρχουσα παραγγελία WooCommerce.
- Εντοπίστε το πεδίο Εσωτερική κατάσταση παραγγελίας.
- Επιλέξτε μια τιμή, για παράδειγμα Απεσταλμένη.
- Αποθηκεύστε ή ενημερώστε την παραγγελία.
- Επιστρέψτε στη λίστα παραγγελιών.
- Ελέγξτε ότι εμφανίζεται η νέα στήλη με τη σωστή τιμή.
8) Βέλτιστες πρακτικές
- Χρησιμοποιήστε απλές ετικέτες που καταλαβαίνει εύκολα η ομάδα σας.
- Μην δημιουργείτε υπερβολικά πολλές επιλογές στο dropdown.
- Κρατήστε το πεδίο για εσωτερική διαχείριση και όχι για ενημέρωση πελάτη.
- Δοκιμάστε σε staging πριν το περάσετε στο live site.
- Σε πολυγλωσσικά sites, μεταφράστε τις ετικέτες ανά γλώσσα.
- Αν χρησιμοποιείτε HPOS, ελέγξτε τη στήλη στη νέα WooCommerce orders list.
9) Συχνές ερωτήσεις
Όχι. Το snippet αποθηκεύει ξεχωριστό order meta και δεν αλλάζει το βασικό WooCommerce order status.
Όχι από προεπιλογή. Η πληροφορία εμφανίζεται μόνο στο WooCommerce admin.
Ναι. Αλλάζετε τις επιλογές μέσα στη συνάρτηση vgdev_internal_order_status_options().
Το snippet χρησιμοποιεί WooCommerce order meta methods και περιλαμβάνει hooks για τη νέα HPOS orders list. Παρ’ όλα αυτά, πρέπει πάντα να γίνεται δοκιμή στο δικό σας setup.
Η τιμή αποθηκεύεται στο order meta key _vgdev_internal_order_status.
10) Υποστήριξη
Για οποιοδήποτε πρόβλημα ή απορία σχετικά με WooCommerce snippets, μπορείτε να επικοινωνήσετε με την τεχνική υποστήριξη.