Formatieren des Datums mit date_i18n für die WooCommerce-Liefernachricht

Aug 16 2020

Mit WooCommerce habe ich mich mit den folgenden Hooks in das Archiv, die Produktseite, den Warenkorb und die Kasse eingehängt:

  • woocommerce_before_single_product_summary
  • woocommerce_before_shop_loop
  • woocommerce_before_cart
  • woocommerce_before_checkout_form

Ich verwende dann ein ifArgument, gefolgt von einem elseifund zuletzt, else.

Diese Argumente steuern die Liefernachricht, die dem Kunden/Besucher angezeigt wird.

Mein Hauptproblem ist die Formatierung des Datums.

Aktueller Output:

Bestellungen, die vor 18:00 Uhr am Montag eingehen, werden am Dienstag, den 18. August oder spätestens am Tag danach geliefert.

Erwartete Ausgabe:

Bestellungen, die vor 18:00 Uhr am Montag eingehen, werden am Dienstag, den 18. August oder spätestens am Tag danach geliefert.

Mit anderen Worten, ich möchte diesem Satz „the“ und „of“ hinzufügen, um ihn klarer und leichter lesbar zu machen.

Die zusätzlichen „the“ und „of“ funktionieren mit jeder Formatierung wie 1., 2., 5. oder sogar 23. in Bezug auf die Tage des Monats.

Ich habe die WordPress-Codex-Seite „ Formatierung von Datum und Uhrzeit “ gelesen, aber selbst bei Verwendung der Formatierung „\t\h\e“ und „\o\f“ ist die Datumsanzeige falsch formatiert.

Das ist bisher mein Code. Wenn jemand das Datum für mich formatieren oder erklären kann, wie ich es in meine gewünschte Ausgabe ändern kann, wäre ich dankbar.

add_action( 'woocommerce_before_single_product_summary', 'product_delivery_message' );
add_action( 'woocommerce_before_shop_loop', 'product_delivery_message' );
add_action( 'woocommerce_before_cart', 'product_delivery_message' );
add_action( 'woocommerce_before_checkout_form', 'product_delivery_message' );

function product_delivery_message() {

date_default_timezone_set( 'Europe/Paris' );

    // delivery cut-off for friday and weekend

    if ( date_i18n( 'N' ) >= 5 ) {

        $delivery_day = date_i18n( "l, F jS, ", strtotime( "next wednesday" ));

        $order_before = "Monday";
    }

    // on monday to thursday before XX (currently set to 18 = 6PM), delivery will be on next week tuesday

    elseif ( date_i18n( 'H' ) >= 18 ) {

        $delivery_day = date_i18n( "l, F jS, ", strtotime( "day after tomorrow" ));

        $order_before = "tomorrow";
    }

    // monday to thursday within the cut-off time, delivery will be next day (tomorrow)

    else {

        $delivery_day = date_i18n( "l, F jS, ", strtotime( "tomorrow" ));

        $order_before = "today";
    }

    $delivery_message = "<div class='product-delivery-message' style='clear:both'>Orders made before 6PM {$order_before} will be delivered on {$delivery_day} or the day after at the latest.</div>";
    
    echo $delivery_message;
}

Antworten

LoicTheAztec Aug 16 2020 at 20:07

Mit l, \t\h\e jS \of F,der Formatierungszeichenfolge erhalte ich die richtige Ausgabe mit Ihrem Code. Ich habe auch einige Änderungen vorgenommen, z. B. ersetzt "day after tomorrow"durch "+2 days"und verwendete sprintf()Funktion:

add_action( 'woocommerce_before_single_product_summary', 'product_delivery_message' );
add_action( 'woocommerce_before_shop_loop', 'product_delivery_message' );
add_action( 'woocommerce_before_cart', 'product_delivery_message' );
add_action( 'woocommerce_before_checkout_form', 'product_delivery_message' );

function product_delivery_message() {
    date_default_timezone_set( 'Europe/Paris' );

    $date_format = __('l, \t\h\e jS \of F,', 'woocommerce');

    // 1. Delivery cut-off for friday and weekend
    if ( date_i18n('N') >= 5 ) {
        $delivery_day = date_i18n( $date_format, strtotime( "next wednesday" ) );
        $order_before = __('Monday', 'woocommerce');
    }
    // 2. From monday to thursday before XX (currently set to 18 = 6PM), delivery will be on next week tuesday
    elseif ( date_i18n('H') >= 18 ) {
        $delivery_day = date_i18n( $date_format, strtotime( "+2 days" ) );
        $order_before = __('tomorrow', 'woocommerce');
    }
    // 3. From monday to thursday within the cut-off time, delivery will be next day (tomorrow)
    else {
        $delivery_day = date_i18n( $date_format, strtotime( "+1 day" ) );
        $order_before = __('today', 'woocommerce');
    }

    $message = sprintf( 
        __("Orders made before 6PM %s will be delivered on %s or the day after at the latest.", "woocommerce"),
        $order_before, $delivery_day 
    );

    echo '<div class="product-delivery-message" style="clear:both">' . $message . '</div>';
}

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