Formatage de la date à l'aide de date_i18n pour le message de livraison WooCommerce

Aug 16 2020

En utilisant WooCommerce, je me suis connecté aux archives, à la page produit, au panier et à la caisse en utilisant les crochets suivants :

  • woocommerce_before_single_product_summary
  • woocommerce_before_shop_loop
  • woocommerce_before_cart
  • woocommerce_before_checkout_form

J'utilise alors un ifargument suivi d'un elseifet enfin, else.

Ces arguments contrôlent le message de livraison affiché au client/visiteur.

Mon principal problème est le formatage de la date.

Sortie courant :

Les commandes passées avant le lundi 18h seront livrées le mardi 18 août ou le surlendemain au plus tard.

Production attendue:

Les commandes passées avant le lundi 18h seront livrées le mardi 18 août ou le surlendemain au plus tard.

En d'autres termes, je veux ajouter "le" et "de" à cette phrase, ce qui la rend plus claire et plus facile à lire.

Les "le" et "de" supplémentaires fonctionneront avec n'importe quel formatage tel que 1er, 2e, 5e ou même 23e en termes de jours du mois.

J'ai lu la page du Codex WordPress " Formater la date et l'heure ", mais même en utilisant le formatage "\t\h\e" et "\o\f", l'affichage de la date est mal formaté.

Ceci est mon code jusqu'à présent. Si quelqu'un peut formater la date pour moi ou expliquer comment la changer dans la sortie souhaitée, je lui en serais reconnaissant.

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

Réponses

LoicTheAztec Aug 16 2020 at 20:07

En utilisant l, \t\h\e jS \of F,la chaîne de formatage, j'obtiens la sortie correcte avec votre code. J'ai également apporté quelques modifications telles que la fonction remplacée "day after tomorrow"par "+2 days"et utiliséesprintf() :

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

Le code va dans le fichier functions.php de votre thème enfant actif (ou thème actif). Testé et fonctionne.