Ich habe verstanden, dass ein Kunde bei einer Bestellung auswählen können soll, dass er die Tickets per Post bekommt. Dafür muss er zahlen.
Den Punkt hat Azrael teileweise umgesetzt, in dem er eine Checkbox eingebaut hat und die Gebühr im Checkout korrekt in das Bestellobjekt übergibt. Der Checkboxstatus selbst ist aber noch nicht als Order Meta gespeichert. Das muss noch passieren.
add_action( 'woocommerce_checkout_update_order_meta', 'mmx_update_order_meta' );
function mmx_update_order_meta( $order_id ) {
if ( isset( $_POST['checkbox_name'] ) ) {
update_post_meta( $order_id, 'ticketversand', 1 );
}
}
Jetzt kommt der Teil mit dem Ticketversand. Solange der Kunde im Checkout die Option für den Versand nicht auswählt, ändert sich nichts.
Man muss sich also "nur" auf den Fall konzentrieren, wenn die Checkbox ausgewählt ist.
Wenn das der Fall, ist soll die FooEvents Funktion für die PDF Erstellung ausgelöst werden, unabhängig vom Status der Bestellung. Gleichzeitig soll aber verhindert werden, dass FooEvents die Funktion ebenfalls ausführt wenn der Status 'completed' ist. An dieser Stelle müssen wir zwei Dinge beachten:
1. Die Statusänderung geschieht an mehreren Stellen, wie z.B. bei der Rückmeldung von Zahlungsgateways und im Backend bei einer manuelle Änderung.
2. Mehrere Statusänderungen können hintereinander passieren (on-hold, processing, completed oder on-hold, completed)
Beide Punkte müssen Berücksichtigung finden. Die Statusänderung wird in der Methode status_transition() in der Klasse WC_Order statt. FooEvents hooked bereits zum frühest möglichen Zeitpunkt in dieser Methode ein: add_action('woocommerce_order_status_completed', array(&$this, 'process_order_tickets'), 10, 1);
Zum Glück verwendet FooEvents die Priorität 10. Das ist zwar früher als der Standard 20, aber wir haben noch genug 'Luft' um vorher einzuhooken. Also hängen wir eine eigene Funktion ein, welche die FooEvents Funktion deaktiviert falls die Tickets versendet werden sollen:
add_action('woocommerce_order_status_completed', 'mmx_maybe_remove_process_order_tickets', 5, 2);
function mmx_maybe_remove_process_order_tickets( $order_id, $status_transition ){
$order = wc_get_order( $order_id );
$ship_tickets = $order->get_meta('ticketversand');
if( $ship_tickets ){
// remove_action( 'woocommerce_order_status_completed', array( FooEventClass::instance(), 'process_order_tickets' ), 10 );
// remove_action( 'woocommerce_order_status_completed', array( FooEventClass->init(), 'process_order_tickets' ), 10 );
// remove_action( 'woocommerce_order_status_completed', array( 'FooEventClass', 'process_order_tickets' ), 10 );
// ...
}
}
Alles anzeigen
Wie die remove_action Syntax lauten muss, hängt davon ab wie die Klasse von FooEvents heißt und wie sie instanziiert wird. Da ich den Quellcode nicht kenne habe ich einfach mal 3 Beispiele aufgeführt. Die Methode muss natürlich nur einmal entfernt werden (nicht 3x)
Jetzt fehlt noch die Funktion zum Ausführen der Methode beim Status processing falls die Tickets versendet werden sollen. Dazu machen wir nicht anderes als die Originalfunktion von FooEvents an anderer Stelle einzuhooken:
add_action('woocommerce_order_status_processing', 'mmx_maybe_process_order_tickets', 5, 2);
function mmx_maybe_process_order_tickets( $order_id, $status_transition ){
$order = wc_get_order( $order_id );
$ship_tickets = $order->get_meta('ticketversand');
if( $ship_tickets ){
// add_action( 'woocommerce_order_status_processing', array( FooEventClass::instance(), 'process_order_tickets' ), 10, 1 );
// add_action( 'woocommerce_order_status_processing', array( 'FooEventClass', 'process_order_tickets' ), 10, 1 );
}
}
Wie die add_action Syntax lauten muss, hängt davon ab wie die Klasse von FooEvents heißt und wie sie instanziiert wird. Da ich den Quellcode nicht kenne habe ich einfach mal 2 Beispiele aufgeführt. Die Methode muss natürlich nur einmal eingehängt werden (nicht 2x)
Wenn das Plugin sauber geschrieben ist haben wir jetzt die Funktion erfolgreich umgehängt, falls der Ticketversand gewünscht wird.
Der Quellcode ist nicht geprüft und dient nur der Veranschaulichung der Logik.