WooCommerce Code Snippet

Προσθήκη προσαρμοσμένου dropdown κατάστασης παραγγελίας στο WooCommerce Admin

Μάθετε πώς να προσθέσετε ένα εσωτερικό custom order dropdown στις παραγγελίες WooCommerce, ώστε να αποθηκεύετε και να εμφανίζετε επιπλέον κατάσταση όπως Απεσταλμένη ή Μη απεσταλμένη.

WooCommerce Admin Orders PHP Snippet
Προσαρμοσμένο dropdown κατάστασης στο WooCommerce Admin

Τι κάνει αυτό το snippet

Από προεπιλογή, το WooCommerce διαθέτει βασικές καταστάσεις παραγγελίας όπως Pending, Processing, Completed και Cancelled. Σε πολλά καταστήματα όμως χρειάζεται μια επιπλέον, εσωτερική ένδειξη χωρίς να δημιουργηθεί πλήρως νέα WooCommerce order status.

Το snippet προσθέτει ένα προσαρμοσμένο dropdown μέσα στη σελίδα επεξεργασίας παραγγελίας, αποθηκεύει την επιλεγμένη τιμή ως order meta και την εμφανίζει στη λίστα παραγγελιών.

Εσωτερική κατάσταση Παρακολουθείτε ενδιάμεσα στάδια όπως αποστολή, συσκευασία ή αναμονή courier.
Καλύτερο admin workflow Η ομάδα βλέπει την πληροφορία απευθείας στη λίστα παραγγελιών.
Χωρίς αλλαγή βασικού status Δεν επηρεάζεται η κανονική ροή καταστάσεων του WooCommerce.

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.

woocommerce-custom-order-status-dropdown.php
/**
 * 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 '&mdash;';
        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>';
}
Το snippet χρησιμοποιεί WooCommerce CRUD methods για αποθήκευση order meta και περιλαμβάνει hooks για legacy orders list και HPOS orders list.

4) Πώς λειτουργεί

Προσθέτει επιλογές εσωτερικής κατάστασης Η συνάρτηση vgdev_internal_order_status_options() ορίζει τις διαθέσιμες επιλογές του dropdown.
Εμφανίζει dropdown στην παραγγελία Το hook woocommerce_admin_order_data_after_order_details προσθέτει το πεδίο στη σελίδα επεξεργασίας παραγγελίας.
Αποθηκεύει την τιμή ως order meta Η τιμή αποθηκεύεται στο meta key _vgdev_internal_order_status.
Προσθέτει νέα στήλη στις παραγγελίες Η στήλη εμφανίζει την επιλεγμένη εσωτερική κατάσταση στη λίστα παραγγελιών.
Υποστηρίζει legacy και HPOS λίστες Υπάρχουν hooks τόσο για shop_order όσο και για wc-orders.

5) Πώς να αλλάξετε τις επιλογές του dropdown

Οι διαθέσιμες επιλογές βρίσκονται στη συνάρτηση vgdev_internal_order_status_options(). Μπορείτε να προσθέσετε, να αφαιρέσετε ή να μετονομάσετε statuses ανάλογα με το workflow σας.

customize-options.php
function vgdev_internal_order_status_options() {
    return array(
        'not_dispatched'  => __( 'Μη απεσταλμένη', 'woocommerce' ),
        'dispatched'      => __( 'Απεσταλμένη', 'woocommerce' ),
        'packed'          => __( 'Συσκευασμένη', 'woocommerce' ),
        'awaiting_courier' => __( 'Αναμονή courier', 'woocommerce' ),
    );
}
Μη απεσταλμένη Απεσταλμένη Συσκευασμένη Αναμονή courier

6) Πού να προσθέσετε τον κώδικα

Υπάρχουν τρεις βασικές επιλογές για να προσθέσετε το snippet.

  • Child theme functions.php: γρήγορη λύση, αρκεί να χρησιμοποιείτε child theme.
  • Custom plugin: πιο καθαρή και ασφαλής λύση, γιατί δεν εξαρτάται από το theme.
  • Snippet plugin: πρακτικό αν ήδη διαχειρίζεστε snippets μέσα από το WordPress admin.
Μην το προσθέσετε στο parent theme, γιατί οι αλλαγές μπορεί να χαθούν μετά από update.

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().

Είναι συμβατό με HPOS;

Το snippet χρησιμοποιεί WooCommerce order meta methods και περιλαμβάνει hooks για τη νέα HPOS orders list. Παρ’ όλα αυτά, πρέπει πάντα να γίνεται δοκιμή στο δικό σας setup.

Πού αποθηκεύεται η τιμή;

Η τιμή αποθηκεύεται στο order meta key _vgdev_internal_order_status.

10) Υποστήριξη

Για οποιοδήποτε πρόβλημα ή απορία σχετικά με WooCommerce snippets, μπορείτε να επικοινωνήσετε με την τεχνική υποστήριξη.

info@vgdevsolutions.gr

Σχετικά άρθρα