Mein Fehler - bitte ändere das add_gift_box wieder zurück in "woocommerce_hardcopy". Ich schaue morgen noch mal, evtl müssen wir erst die terms abfragen.
WooCommerce Online Ticketsystem läuft... Optionaler Hardticket Versand integrieren?
-
-
- Gerade eben
- Anzeige
Hallo!
Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.
- ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
- ✔️ Deutsche Server & DSGVO-konform
- ✔️ Persönlicher Support (kein 0815-Ticket-System)
-
PHP
Alles anzeigen<?php /* Plugin Name: Hardcopy Ticket */ add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' ); function add_box_option_to_checkout( $checkout ) { foreach( WC()->cart->get_cart() as $cart_item_key => $values ) { $cart_product = $values['data']; $cart_ids[] = $cart_product->id; } foreach( $cart_ids as $id ) { $products_categories = get_the_terms( $id, 'product_cat' ); // Loop through each product category and add it to our $cart_categories array foreach ( $products_categories as $products_category ) { $cart_categories[] = $products_category->slug; } } if (in_array("events", $cart_categories)) { // HIER SLUG DER KATEGORIE EINGEBEN echo '<div id="message_fields">'; woocommerce_form_field( 'hardcopy', array( 'type' => 'checkbox', 'class' => array('hardcopy form-row-wide'), 'label' => __('Hardcopy-Ticket: 3.90 EUR'), 'placeholder' => __(''), ), $checkout->get_value( 'hardcopy' )); echo '</div>'; } } add_action( 'wp_footer', 'woocommerce_hardcopy' ); function woocommerce_hardcopy() { if (is_checkout()) { ?> <script type="text/javascript"> jQuery( document ).ready(function( $ ) { $('#hardcopy').click(function(){ jQuery('body').trigger('update_checkout'); }); }); </script> <?php } } add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' ); function woo_add_cart_fee( $cart ){ if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) { return; } if ( isset( $_POST['post_data'] ) ) { parse_str( $_POST['post_data'], $post_data ); } else { $post_data = $_POST; } if (isset($post_data['hardcopy'])) { $extracost = 3.9; //PREIS WC()->cart->add_fee( 'Hardcopy-Ticket:', $extracost ); } } ?>Bei mir funktioniert das lokal so. Die Checkbox wird nur noch angezeigt, wenn Produkt aus Kat "events" im Warenkorb.
-
Hi Azrael,
PERFEKT - vielen Dank! Das hätte ich wohl nicht alleine gebacken bekommen.
Ich hatte den Fehler gemacht die Produktkategorie wie im Namen einzutragen. Da muss aber der Slug rein - also kleingeschrieben. Das ist soweit alles bestens...
Nun mach ich mich an die Sache mit dem Status bei den Bestellungen... Mir war nun nicht ganz klar wo ich deinen Code zum "Fee" abfragen soll...
Code[COLOR=#0000BB][FONT=monospace]$noticketsend[/FONT][/COLOR][COLOR=#007700][FONT=monospace]=[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]""[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$the_order [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]wc_get_order[/FONT][/COLOR][COLOR=#007700][FONT=monospace]( [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$order_id [/FONT][/COLOR][COLOR=#007700][FONT=monospace]); foreach( [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$the_order[/FONT][/COLOR][COLOR=#007700][FONT=monospace]->[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]get_items[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]'fee'[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) as [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$item_id [/FONT][/COLOR][COLOR=#007700][FONT=monospace]=> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$item_fee [/FONT][/COLOR][COLOR=#007700][FONT=monospace]){ [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$fee_name [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$item_fee[/FONT][/COLOR][COLOR=#007700][FONT=monospace]->[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]get_name[/FONT][/COLOR][COLOR=#007700][FONT=monospace](); if ([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$fee_name[/FONT][/COLOR][COLOR=#007700][FONT=monospace]==[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Hardcopy-Ticket:"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) { [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$noticketsend[/FONT][/COLOR][COLOR=#007700][FONT=monospace]=[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"YES"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]; } [/FONT][/COLOR]Das mit der if-Anweisung zum Update vom Status kann ich ja sehr einfach in den Code der php einbinden...
Code
Alles anzeigen/** * bezahlte Bestellungen automatisch abschliessen */ add_action( 'woocommerce_thankyou', 'auto_complete_paid_order', 10, 1 ); function auto_complete_paid_order( $order_id ) { if ( ! $order_id ) { return; } global $woocommerce; $order = new WC_Order( $order_id ); // kein Status Update fuer folgende Zahlungsarten if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) { return; } // "completed" fuer alle anderen Zahlungsarten else { if(empty($noticketsend)) { $order->update_status( 'completed' ); } } }Schönen Sonntag wünsche ich!
-
Aber so wird das nicht klappen :-) $noticketsend wird immer leer sein, denn Du hast nix, um das zu füllen.
-
Plugin, welches die Order auf Completed setzt, wenn kein Hardcopy-Ticket.
PHP
Alles anzeigen<?php /* Plugin Name: Update Status, if not Hardcopy-Ticket */ /** * bezahlte Bestellungen automatisch abschliessen */ add_action( 'woocommerce_thankyou', 'auto_complete_paid_order', 10, 1 ); function auto_complete_paid_order( $order_id ) { if ( ! $order_id ) { return; } global $woocommerce; $order = new WC_Order( $order_id ); // kein Status Update fuer folgende Zahlungsarten if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) { return; } // "completed" fuer alle anderen Zahlungsarten else { //DMS $noticketsend=""; $the_order = wc_get_order( $order_id ); foreach( $the_order->get_items('fee') as $item_id => $item_fee ){ $fee_name = $item_fee->get_name(); if ($fee_name=="Hardcopy-Ticket:") { $noticketsend="YES"; } } //DMS //DMS if (empty($noticketsend)) { //DMS $order->update_status( 'completed' ); //DMS } //DMS } //DMS } ?> -
Hi,
wir sind schon nahe dran... Das Plugin unterbindet aber wie es aussieht nicht nur die automatische Email Zustellung des Tickets sonder auch generell die Erstellung jener als PDF...
Das ist dann wohl noch ein Zwischenschritt der nach "Update Status" stattfindet... Ich gehe ja einmal davon aus, das jene PDF Tickets durch den Konverter gehen und dann ab per Email raus. (Wenn Online)...
Hum
GLG
-
Ich weiß nicht, wie das Plugin das macht, evtl. ist update_status eine Funktion, die PDFs erstellt und dann versendet. Ich schau mir die morgen mal an und gucke, ob ich nur die EMail unterbunden kriege.
-
Hi,
ohne das "noticketsent" waren wir ja schon nahe dran. Da hatte es das PDF-Ticket erstellt, in den Uploads Ordner gespeichert und die Bestellung auf "In Bearbeitung" gesetzt. Bei Bestätigung wurde es dann doch noch geschickt... Also ich denke das der Schritt mit dem senden nach Aktivierung auf "complete" beginnt. Das PDF wird schon vorher produziert, weswegen mir nicht einleuchtet warum dem nun nicht so ist.
Das probiere ich nochmal aus.
GLG
-
P.S: Das ist der Converter.. https://github.com/dompdf/dompdf
-
Probiere mal das:
PHP
Alles anzeigen//DMS if (!empty($noticketsend)) { //DMS $order->update_status( 'processing' ); //DMS } else { $order->update_status( 'completed' );} //DMS } //DMSAlso wenn Hardcopy-Ticket, setzt er die Order auf processing und sonst auf completed. Das ist eine Woocommerce - Funktion, dürfte also nix mit den PDFs zu tun haben.
-
Hi
das ändert überhaupt nichts... Ich versuch gerade den Status wiederherzustellen als das PDF generiert wurde und auf "Processing" gestellt wurde... Nur um das einzugrenzen.
GLG
-
Nimm alles zwischen //DMS und //DMS raus, dann dürfte das der alte Stand sein. Welches File ist das von Fooevents?
-
Habe den Fehler glaube ich gefunden. Fooevents hat da einen Hook drin, der nur bei Completed anspringt.
PHPadd_action('woocommerce_order_status_completed', array(&$this, 'process_order_tickets'), 10, 1);Wenn Status=Completed, process_order_tickets.
Wenn also Status nicht Completed, werden die PDFs wohl nicht erstellt.
-
Probier mal das Plugin.
Das müsste die Tickets erstellen, auch wenn kein Completed.
[COLOR=#000000] [COLOR=#0000BB]<?php
[/COLOR][COLOR=#FF8000]/*
Plugin Name: Update Status, if not Hardcopy-Ticket*/
/** * bezahlte Bestellungen automatisch abschliessen
*/
[/COLOR][COLOR=#0000BB]add_action[/COLOR][COLOR=#007700]( [/COLOR][COLOR=#DD0000]'woocommerce_thankyou'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]'auto_complete_paid_order'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]10[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1 [/COLOR][COLOR=#007700]);
function [/COLOR][COLOR=#0000BB]auto_complete_paid_order[/COLOR][COLOR=#007700]( [/COLOR][COLOR=#0000BB]$order_id [/COLOR][COLOR=#007700]) {
if ( ! [/COLOR][COLOR=#0000BB]$order_id [/COLOR][COLOR=#007700]) {
return;
}
global [/COLOR][COLOR=#0000BB]$woocommerce[/COLOR][COLOR=#007700];
[/COLOR][COLOR=#0000BB]$order [/COLOR][COLOR=#007700]= new [/COLOR][COLOR=#0000BB]WC_Order[/COLOR][COLOR=#007700]( [/COLOR][COLOR=#0000BB]$order_id [/COLOR][COLOR=#007700]);
[/COLOR][COLOR=#FF8000]// kein Status Update fuer folgende Zahlungsarten
[/COLOR][COLOR=#007700]if ( ( [/COLOR][COLOR=#0000BB]get_post_meta[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]$order[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]id[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]'_payment_method'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]true[/COLOR][COLOR=#007700]) == [/COLOR][COLOR=#DD0000]'bacs' [/COLOR][COLOR=#007700]) || ( [/COLOR][COLOR=#0000BB]get_post_meta[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]$order[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]id[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]'_payment_method'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]true[/COLOR][COLOR=#007700]) == [/COLOR][COLOR=#DD0000]'cod' [/COLOR][COLOR=#007700]) || ( [/COLOR][COLOR=#0000BB]get_post_meta[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]$order[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]id[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]'_payment_method'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]true[/COLOR][COLOR=#007700]) == [/COLOR][COLOR=#DD0000]'cheque' [/COLOR][COLOR=#007700]) ) {
return;
}
[/COLOR][COLOR=#FF8000]// "completed" fuer alle anderen Zahlungsarten
[/COLOR][COLOR=#007700]else {
[/COLOR][COLOR=#FF8000]//DMS
[/COLOR][COLOR=#0000BB]$noticketsend[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#DD0000]""[/COLOR][COLOR=#007700];
[/COLOR][COLOR=#0000BB]$the_order [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]wc_get_order[/COLOR][COLOR=#007700]( [/COLOR][COLOR=#0000BB]$order_id [/COLOR][COLOR=#007700]);
foreach( [/COLOR][COLOR=#0000BB]$the_order[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get_items[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'fee'[/COLOR][COLOR=#007700]) as [/COLOR][COLOR=#0000BB]$item_id [/COLOR][COLOR=#007700]=> [/COLOR][COLOR=#0000BB]$item_fee [/COLOR][COLOR=#007700]){
[/COLOR][COLOR=#0000BB]$fee_name [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$item_fee[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get_name[/COLOR][COLOR=#007700]();
if ([/COLOR][COLOR=#0000BB]$fee_name[/COLOR][COLOR=#007700]==[/COLOR][COLOR=#DD0000]"Hardcopy-Ticket:"[/COLOR][COLOR=#007700]) {
[/COLOR][COLOR=#0000BB]$noticketsend[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#DD0000]"YES"[/COLOR][COLOR=#007700];
}
}
[/COLOR][COLOR=#FF8000]//DMS
//DMS
[/COLOR][COLOR=#007700]if (empty([/COLOR][COLOR=#0000BB]$noticketsend[/COLOR][COLOR=#007700])) {
[/COLOR][COLOR=#FF8000]//DMS
[/COLOR][COLOR=#0000BB]$order[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]update_status[/COLOR][COLOR=#007700]( [/COLOR][COLOR=#DD0000]'completed' [/COLOR][COLOR=#007700]);
[/COLOR][COLOR=#FF8000]//DMS
[/COLOR][COLOR=#007700]} else {
process_order_tickets($order_id);
}
[/COLOR][COLOR=#FF8000]//DMS
[/COLOR][COLOR=#007700]}
[/COLOR][COLOR=#FF8000]//DMS
[/COLOR][COLOR=#007700]}[/COLOR][COLOR=#0000BB]?>[/COLOR] [/COLOR]
-
Hi,
ja dann müsste man doch eigentlich nur das completed in processing ändern - oder?
Kann aber auch nicht sein, da ich nach Bestätigung der Bestellung ja auch kein Ticket als PDF im Uploads Ordner finde... ?!Hum
Es sind zwei Plugins. FooEvents und FooEventsPDFTicket
-
Hi,
also ich glaube das mit dem generierten Tickets hatte ich falsch gesehen. Ich hab nun die Codes auf zwei Plugins verteilt (Hardticket Checkbox) + (Status IF Hardticket Processing) und dann alle schon generierten PDF's gelöscht. Immo - wurde nichts erstellt, obwohl der Kunde die Email mit Fertiggestellt bekommt. Dann ist die Lösung mit dem "noticketsend" derzeit schon die stimmigste.
Damit könnte ich schon arbeiten - das einzige was dann passiert ist, dass die Namen der Kunden nicht auf den Tickets sind. Wenn ich Tickets für die Vorverkaufsstellen erstelle oder eben (wenn es sich nicht lösen lässt) für die paar Kunden die das Hardticket wollen, so log ich mich über einen Account z.B. hardticket@XXX.ein. Gebe für Namen "Lichtspiele" "Hardticket" ein -> bestelle jene mit einem 100% Discount -> Drucke aus -> verschicke...
FooEvents bietet zwar auch eine Möglichkeit Tickets zu erstellen - das funktioniert aber nur bei Online Tickets und generiert auch keine PDF's. Ich glaub ohnehin das mit dem PDF haben die da noch nicht ganz durchdacht. Genial wäre es natürlich könnte ich aus dem System heraus die "Offline Hardtickets" erstellen. Ich geh halt den Umweg mit dem hardicket@XXX.de Account und dem Discount... Funktioniert ja eigentlich blendend.
Und daraus folgt... Die Tickets werden wie du schon geschrieben hast im "completed" Status erstellt...
LG
-
Ja, dann müssen wir die Funktion halt auch aufrufen, wenn der Status nicht Completed ist.
-
Hier schon mal die Funktion für die Single Tickets... aus der PDF-Tickets PHP...
Muss man nur noch finden wo das ausgelöst wird..In der FooEvents.php find ich da leider nix... ;-(
Code
Alles anzeigenpublic function generate_ticket($tickets, $eventPluginURL, $eventPluginPath) { /*error_reporting(E_ALL); ini_set('display_errors', 1);*/ $ticket_output = ''; $fileName = ''; $x = 1; $numTickets = count($tickets); foreach($tickets as $ticket) { $ticket_output .= $this->PDFHelper->parse_ticket_template($ticket, 'pdf-ticket-template-single.php', $eventPluginURL, $eventPluginPath); if($x < $numTickets) { $ticket_output .= '<div style="page-break-before: always;"></div>'; } if($x == 1) { $fileName .= $ticket['barcodeFileName']; } if($x == $numTickets) { $fileName .= '-'.$ticket['barcodeFileName']; } $x++; } $dompdf = new Dompdf(); $dompdf->loadHtml($ticket_output); $dompdf->set_option('enable_remote', TRUE); $dompdf->setPaper('A4'); $dompdf->render(); $output = $dompdf->output(); $path = $this->Config->pdfTicketPath.''.$fileName.'.pdf'; file_put_contents($path, $output); return $path; exit(); } -
Ich versuche morgen einfach mal, ob das Aufrufen der Funktion auch durch einfachen Aufruf aus dem Plugin geschehen kann. Teste Du mal bitte, ob die PDFs generiert werden, wenn kein Hardcopy-Ticket gewollt, Checkbox also ungecheckt bleibt.
-
Hi,
das hab ich schon durchgespielt. Dann wird das Ticket ohne Probleme generiert und parallel auf dem Server abgespeichert. Ich denke die Funktion wird kurz vor dem Email Versand irgendwie mit aufgerufen und hat weniger mit dem Produkt Status zu tun. Da wir den Versand ja unterbinden wenn "Hardticket Checkbox" aktiv.
Insgesamt kommen immer 4 Email an bei Online Ticket. Am Ende kommt in einer separaten Email die Online-pdf Tickets und eine "Bestellung Fertiggestellt"... In dem Schritt muss das wohl irgendwie laufen...
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!