So erstellen Sie einen benutzerdefinierten Bestellstatus im Woocommerce!

7

Ich habe den folgenden Code versucht, um einen benutzerdefinierten Status zu erstellen.

add_action( 'init', function() {
    $term = get_term_by( 'name', 'shipped', 'shop_order_status' );
    if ( ! $term ) {
        wp_insert_term( 'shipped', 'shop_order_status' );
    }
} );

Aber es funktioniert nicht. Ich habe auch einige andere Methoden ausprobiert. Kann mir bitte jemand dabei helfen ..

Aparna Mathew
quelle

Antworten:

10

Dies ist, was ich verwendet habe, um einen benutzerdefinierten Bestellstatus mit dem Namen "In Rechnung gestellt" zu erstellen. Fügen Sie dies der Datei functions.php Ihres Themas hinzu

// New order status AFTER woo 2.2
add_action( 'init', 'register_my_new_order_statuses' );

function register_my_new_order_statuses() {
    register_post_status( 'wc-invoiced', array(
        'label'                     => _x( 'Invoiced', 'Order status', 'woocommerce' ),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Invoiced <span class="count">(%s)</span>', 'Invoiced<span class="count">(%s)</span>', 'woocommerce' )
    ) );
}

add_filter( 'wc_order_statuses', 'my_new_wc_order_statuses' );

// Register in wc_order_statuses.
function my_new_wc_order_statuses( $order_statuses ) {
    $order_statuses['wc-invoiced'] = _x( 'Invoiced', 'Order status', 'woocommerce' );

    return $order_statuses;
}

Um Ihren neuen Status zum Dropdown-Menü "Massenbearbeitung" des Administrators hinzuzufügen, müssen Sie Javascript verwenden. Fügen Sie der admin_footerAktion Ihre Funktion hinzu . Meine Funktion sieht dann ungefähr so ​​aus:

function custom_bulk_admin_footer() {
            global $post_type;

            if ( $post_type == 'shop_order' ) {
                ?>
                    <script type="text/javascript">
                        jQuery(document).ready(function() {
                            jQuery('<option>').val('mark_invoiced').text('<?php _e( 'Mark invoiced', 'textdomain' ); ?>').appendTo("select[name='action']");
                            jQuery('<option>').val('mark_invoiced').text('<?php _e( 'Mark invoiced', 'textdomain' ); ?>').appendTo("select[name='action2']");   
                        });
                    </script>
                <?php
            }
        }

Die Aktion wird zweimal hinzugefügt, da sich oben und unten in der Bestellliste eine Massenaktion befindet.

Magnetisieren
quelle
@AparnaMathew froh, dass es funktioniert. :)
Magnetisieren Sie den
1
@ Nathan Hallo zusammen! Das tue ich eigentlich, aber Sie müssen die Massenaktionen über js hinzufügen. Ich habe meine Antwort bearbeitet, da sie für einen Kommentar zu lang ist.
Magnetisieren Sie den
1
Gilt dies immer noch für WooCommerce 3.x?
Amjad
1
@ Amjad in der Tat, ich benutze es, während wir sprechen. :)
Magnetisieren Sie den
1
In der Tat funktioniert es auch auf 3.x. Danke @Magnetize!
Amjad
2

Als Abschluss für oben und um JavaScript nicht zum Hinzufügen der Aktionen in der Liste der Massenaktionen zu verwenden, können Sie den Hook verwenden, um Massenaktionen hinzuzufügen / neu anzuordnen bulk_actions-edit-shop_order. Zum Beispiel:

function rename_or_reorder_bulk_actions( $actions ) {
    $actions = array(
        // this is the order in which the actions are displayed; you can switch them
        'mark_processing'      => __( 'Mark placed', 'textdomain' ), // rewrite an existing status
        'mark_invoiced'        => __( 'Mark invoiced', 'textdomain' ), // adding a new one
        'mark_completed'       => $actions['mark_completed'],
        'remove_personal_data' => $actions['remove_personal_data'],
        'trash'                => $actions['trash'],
    );
    return $actions;
}
add_filter( 'bulk_actions-edit-shop_order', 'rename_or_reorder_bulk_actions', 20 );

Prost!

Vlăduț Ilie
quelle