Hallo liebe Forumsgemeinde,
ich habe mir ein Script geschrieben, welches täglich als Cronjob funktioniert. Das gut ist, es funktioniert auf dem ersten Blick, aber leider berechnet es die Anzahl der Tage, mit der Zeit, nicht korrekt. Des Weiteren könnte ich mir vorstellen, dass der Code vereinfacht werden könnte.
Könnte mir bitte jemand sagen warum die Differenz falsch berechnet wird? Und gibt es Vereinfachungen für meinen Code, eventuell sogar Wordpress spezifisch?
Das Script soll folgendes machen: In dem Projekt wird etwas in ein Lager eingelagert. Alle zwei Monate soll eine E-Mail verschickt werden, dass die Sachen noch eingelagert sind. Wenn die Sachen ausgelagert werden, dann soll eine E-Mail verschickt werden mit der exakten Anzahl der eingelagerten Tage bzw. Wochen.
<?php
// Cronjob um eingelagertes Inventar zu prüfne und alle zwei monate eine Erinnerungs-E-Mail schreiben, sowie eine Schluss-E-Mail.
if ( ! wp_next_scheduled( 'cronjob_lager_hausrat_hook' ) ) {
wp_schedule_event( time(), 'daily', 'cronjob_lager_hausrat_hook' );
}
add_action( 'cronjob_lager_hausrat_hook', 'cronjob_lager_hausrat_function' );
function cronjob_lager_hausrat_function() {
// E-Mail schicken wenn Cronjob ausgeführt wurde
$to = 'xxx';
$subject = 'Cronjob - Hausrat';
$body = 'Cronjob ausgeführt';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );
// Datnebank öffnen und Lopp erstellen
$lagerung = $wpdb->get_results('SELECT * FROM '.$wpdb->prefix.'hausrat');
foreach ($lagerung as $lagerung_zeilen ) {
$lagerung_id = $lagerung_zeilen->ID; // ID des Tabelleninhaltes
$lagerung_status = $lagerung_zeilen->Status; // Status des Projektes
$lagerung_name = $lagerung_zeilen->Name; // Name des Projektes
$lagerung_adresse = $lagerung_zeilen->Adresse; // Adresse des Projektes
$lagerung_corletten = $lagerung_zeilen->Corletten; // Corlettenzahl des Projektes
$lagerung_bemerkungen = $lagerung_zeilen->Bemerkungen; // Bemerkungen des Projektes
$aktuelle_zeit = new DateTime(''); // Aktuelle Uhrzeit
$aktuelle_zeit_format = $aktuelle_zeit->format('d.m.Y');
$eingelagert = new DateTime($lagerung_zeilen->Einlagerung);
$eingelagert_format = $eingelagert->format('d.m.Y');
$eingelagert_frist = $eingelagert;
$eingelagert_frist->modify('+2 months');
$eingelagert_frist_format = $eingelagert_frist->format('d.m.Y');
$interval = new DateTime($lagerung_zeilen->Interval);
$interval->modify('+2 months');
$interval_format = $interval->format('d.m.Y');
if (!empty($lagerung_zeilen->Ausgelagert)):
$ausgelagert = new DateTime($lagerung_zeilen->Ausgelagert);
$ausgelagert_format = $ausgelagert->format('d.m.Y');
endif;
switch($lagerung_status)
{
case (20):
// Projekt ist abgeschlossen. Keine weiteren Aktionen!
break;
case (10):
// Projektstatus auf 20 setzen wenn E-Mail abgeschickt
// Lagerungsdauer berechnen
$interval = $eingelagert->diff($ausgelagert);
$lagerung_einlagerungsdauer_tage = $interval->format('%a');
$lagerung_einlagerungsdauer_wochen = ($interval->format('%a'))/7;
$lagerung_einlagerungsdauer = ceil($lagerung_einlagerungsdauer_wochen) . ' Woche(n) - ' . $lagerung_einlagerungsdauer_tage . ' Tage';
// E-Mails als Abschlussbericht verschicken
$absendermail = 'xxx';
$empfaenger = $lagerung_zeilen->Bearbeiter;
$absendername = get_field('e-mail-absender-name', 'option');
$betreff = 'Lagerung (Inventar) beendet: ' . $lagerung_name . ', ' . $lagerung_adresse . '';
$text = 'xxx';
mail($empfaenger, $betreff, $text, "From: $absendername <$absendermail>");
// Wenn Ausgabedatum vorhanden dann Status auf 10 setzen
$wpdb->update( $wpdb->prefix.'hausrat',
array( 'Status' => 20 ),
array( 'ID' => $lagerung_id ),
array( '%s' ),
array( '%d' )
);
break;
default:
// Prüfen ob Ausgabedatum vorhanden
if (empty($lagerung_zeilen->Ausgelagert) == NULL)
{
// Lagerdauer berechnen wenn keine Ausgabedatum vorhanden
$interval = $eingelagert->diff($aktuelle_zeit);
// Wenn Ausgabedatum vorhanden dann Status auf 10 setzen
$wpdb->update( $wpdb->prefix.'hausrat',
array( 'Status' => 10 ),
array( 'ID' => $lagerung_id ),
array( '%s' ),
array( '%d' )
);
}
else
{
// Lagerdauer berechen, wenn Ausgabedatum vorhanden
$interval = $eingelagert->diff($ausgelagert);
};
// Lagerungsdauer berechnen
$lagerung_einlagerungsdauer_tage = $interval->format('%a');
$lagerung_einlagerungsdauer_wochen = ($interval->format('%a'))/7;
$lagerung_einlagerungsdauer = ceil($lagerung_einlagerungsdauer_wochen) . ' Woche(n) - ' . $lagerung_einlagerungsdauer_tage . ' Tage';
// Lager dauer in die Datenbank schreiben
$wpdb->update( $wpdb->prefix.'hausrat',
array( 'Lagerung' => $lagerung_einlagerungsdauer ),
array( 'ID' => $lagerung_id ),
array( '%s' ),
array( '%d' )
);
// Prüfe ob das Inverval-Feld bereits ausgefüllt wurde
if (empty($lagerung_zeilen->Interval) == NULL)
{
// Interval ist bereits gefüllt?
// Intervalfeld prüfen ob die Frist von 2 Monaten vorbei ist
if ($aktuelle_zeit >= $interval)
{
// Zwei Monate sind rum (Interval)
$wpdb->update( $wpdb->prefix.'hausrat',
array( 'Interval' => $aktuelle_zeit->format('Y-m-d') ),
array( 'ID' => $lagerung_id ),
array( '%s' ),
array( '%d' )
);
// Email verschicken
$absendermail = 'xxx';
$empfaenger = $lagerung_zeilen->Bearbeiter;
$absendername = 'xxx';
$betreff = 'Erinnerung an Einlagerung (Inventar) : ' . $lagerung_name . ', ' . $lagerung_adresse . '';
$text = 'xxx';
mail($empfaenger, $betreff, $text, "From: $absendername <$absendermail>");
}
else
{
// Keine Aktion erforderlich
};
}
else
{
// Invertal ist noch leer
// Prüfen ob die Frist von 2 Monaten vorbei ist
if ($aktuelle_zeit >= $eingelagert_frist)
{
// Zwei Monate sind rum
$wpdb->update( $wpdb->prefix.'hausrat',
array( 'Interval' => $aktuelle_zeit->format('Y-m-d') ),
array( 'ID' => $lagerung_id ),
array( '%s' ),
array( '%d' )
);
// E-Mail als Zwischenstandsbericht verschicken
$absendermail = 'xxx';
$empfaenger = $lagerung_zeilen->Bearbeiter;
$absendername = 'xxx';
$betreff = 'Erinnerung an Einlagerung (Inventar) : ' . $lagerung_name . ', ' . $lagerung_adresse . '';
$text = 'xxx';
mail($empfaenger, $betreff, $text, "From: $absendername <$absendermail>");
}
else
{
// Keine Aktion erforderlich
};
};
break;
}
}
}
?>
Alles anzeigen
Vielen Dank im Voraus für die Antworten und einen schönen Ostermontag wünsche ich
Ehstside