Verhindern Sie den WooCommerce-Bestellstatus Wechsel von / zu bestimmten Status

Lesezeit: 3 Minuten

WooCommerce In den Warenkorb Validierung Hinzufugen zum Warenkorb verhindern
Eyal Avitan

Hallo, ich versuche, eine Funktion in den mu-Plugins zu erstellen, um bestimmte Benutzer daran zu hindern, den Bestellstatus von bestimmten Bestellstatus zu bestimmten Bestellstatus zu ändern.

Ich habe überall gesucht und viele verschiedene Möglichkeiten ausprobiert, aber nichts scheint zu funktionieren.

Eigentlich läuft die Funktion mit woocommerce_order_status_changed Aktionshaken. Die Sache ist, dass dieser Haken läuft, nachdem der Bestellstatus bereits geändert wurde, was eine Endlosschleife verursacht.

Der nützlichste Haken, den ich gefunden habe, scheint zu sein woocommerce_before_order_object_save.

ich fand „Fügen Sie ein zusätzliches Argument hinzu, um zu verhindern, dass ‚woocommerce_order_status_changed‘ aufgerufen wird.“ nützlicher verwandter Thread auf WooCommerce Github.
Ich habe versucht, mit @kloon Code-Snippet-Lösung:

add_filter( 'woocommerce_before_order_object_save', 'prevent_order_status_change', 10, 2 );
function prevent_order_status_change( $order, $data_store ) {
    $changes = $order->get_changes();
    if ( isset( $changes['status'] ) ) {
        $data = $order->get_data();
        $from_status = $data['status'];
        $to_status = $changes['status'];

        // Do your logic here and update statuses with CRUD eg $order->set_status( 'completed' );
                // Be sure to return the order object

    }
    return $order;
}

aber $changes Variable ist immer ein leeres Array.

Ich habe versucht zu verwenden wp_insert_post_data WordPress-Hookaber wenn ich setze:

$data['post_status'] = "some status";

es verhindert lediglich, dass das gesamte Update (die gesamten neuen Daten) gespeichert wird.

Dies ist der Code, den ich ausführen möchte, ist:

function($data){
   if($data['order_status'] == 'comlpeted' && $data['new_order_status'] == 'proccessing'){
      // prevent the order status from being changed
      $data['new_order_status'] = $data['order_status'];
   }

  few more if conditions... 

   return $data;
}

Jede Hilfe oder Beratung ist willkommen.

  • Frage wie “Bestimmte Benutzer können den Bestellstatus von bestimmten Bestellstatus zu bestimmten Bestellstatus ändern”? Warum “in den mu-Plugins” | (was bedeutet das)?

    – LoicTheAztec

    4. März 2021 um 10:27 Uhr

Verhindern Sie den WooCommerce Bestellstatus Wechsel von zu bestimmten Status
LoicTheAztec

Beyogen auf @kloon Codeschnipsel konnte ich den alten Bestellstatus und den neuen Bestellstatus abrufen. Dann kann ich jede Statusänderung deaktivieren von einem bestimmten definierten Auftragsstatus zu einem bestimmten definierten Auftragsstatus.

Mit dem folgenden Code, spezifisch definierte Benutzerrollen Bestellstatus kann nicht geändert werden von “wird bearbeitet” zu “auf-halten“:

add_filter( 'woocommerce_before_order_object_save', 'prevent_order_status_change', 10, 2 );
function prevent_order_status_change( $order, $data_store ) {
    // Below define the disallowed user roles
    $disallowed_user_roles = array( 'shop_manager');

    $changes = $order->get_changes();

    if( ! empty($changes) && isset($changes['status']) ) {
        $old_status    = str_replace( 'wc-', '', get_post_status($order->get_id()) );
        $new_status    = $changes['status'];
        $user          = wp_get_current_user();
        $matched_roles = array_intersect($user->roles, $disallowed_user_roles);

        // Avoid status change from "processing" to "on-hold"
        if ( 'processing' === $old_status && 'on-hold' === $new_status && ! empty($matched_roles) ) {
            throw new Exception( sprintf( __("You are not allowed to change order from %s to %s.", "woocommerce" ), $old_status, $new_status ) );
            return false;
        }
    }
    return $order;
}

Der Code wird in die Datei functions.php des aktiven untergeordneten Designs (oder aktiven Designs) eingefügt. Getestet und funktioniert.

  • Vielen Dank, funktioniert erstaunlich! war so lange an dem Ding

    – Eyal Avitan

    7. März 2021 um 7:45 Uhr


1004210cookie-checkVerhindern Sie den WooCommerce-Bestellstatus Wechsel von / zu bestimmten Status

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy