Formatowanie daty przy użyciu date_i18n dla wiadomości o dostawie WooCommerce

Aug 16 2020

Korzystając z WooCommerce, podłączyłem się do archiwum, strony produktu, koszyka i kasy za pomocą następujących haków:

  • woocommerce_before_single_product_summary
  • woocommerce_before_shop_loop
  • woocommerce_before_cart
  • woocommerce_before_checkout_form

Mam następnie używając ifargumentu po nim elseifi wreszcie else.

Te argumenty sterują wiadomością o dostarczeniu wyświetlaną klientowi / odwiedzającemu.

Moim głównym problemem jest formatowanie daty.

Wyjście prądowe:

Zamówienia złożone przed godziną 18:00 w poniedziałek zostaną dostarczone we wtorek, 18 sierpnia lub najpóźniej pojutrze.

Oczekiwany wynik:

Zamówienia złożone przed godziną 18:00 w poniedziałek zostaną dostarczone we wtorek, 18 sierpnia lub najpóźniej pojutrze.

Innymi słowy, chcę dodać „the” i „of” do tego zdania, aby było jaśniejsze i łatwiejsze do odczytania.

Dodatkowe „the” i „of” będą działać z dowolnym formatowaniem, takim jak 1, 2, 5 lub nawet 23 pod względem dni miesiąca.

Przeczytałem stronę „ Formatowanie daty i godziny ” WordPress Codex, ale nawet przy użyciu formatowania „\ t \ h \ e” i „\ o \ f” wyświetlana data jest nieprawidłowo sformatowana.

To jest mój kod do tej pory. Byłbym wdzięczny, gdyby ktoś mógł dla mnie sformatować datę lub wyjaśnić, jak zmienić ją na pożądany przeze mnie wynik.

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;
}

Odpowiedzi

LoicTheAztec Aug 16 2020 at 20:07

Używając l, \t\h\e jS \of F,ciągu formatującego, otrzymuję poprawne dane wyjściowe z Twoim kodem. Mam również pewne zmiany, jak otrzymuje "day after tomorrow"się "+2 days"i używanych sprintf()funkcji:

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>';
}

Kod trafia do pliku functions.php aktywnego motywu potomnego (lub aktywnego motywu). Przetestowane i działa.