ACF est un super plugin permettant (entre autres) de rajouter des champs à vos contenus dans WordPress. Il existe différents types de champs : textes, images, relations, etc et l’un des types de champ est un champ date.
Les dates sont stockées dans la base de données dans un certain format, et lorsqu’on souhaite réafficher cette date en front sur le site, on peut changer le format d’affichage pour passer par exemple de « 01/01/2023 » à « 1 Janvier 23 »
Php fournit plusieurs fonctions permettant de changer le type de formatage
En appelant dans un champ Elementor une valeur Date ACF, on ne peut pas choisir son formatage
Mais que peut on faire pour pouvoir formater cette valeur ? Hé bien il existe une solution, mais qui implique de passer par la création de shortcode.
En résumé, nous allons définir un nouveau shortcode prenant comme attribut le nom du champ ACF, et le formatage souhaité. Voici ce à quoi va ressembler notre shortcode au final :
[acf_date field='date_debut' date_format='MMM']
Ce shortcode prend 2 paramètres :
- acf_date field est l’identifiant du champ date ACF, dans mon cas « date_debut »
- date_format correspond au formatage souhaité de la date, dans mon cas « MMM » ramène le mois dans sa version courte, par ex : « juil. »
voici la liste des paramètres utilisables pour formater votre date (source : https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax)
Symbol | Meaning | Pattern | Example Output |
---|---|---|---|
G | era designator |
G , GG , or GGG GGGG GGGGG
| AD Anno Domini A |
y | year |
yy y or yyyy
| 96 1996 |
Y | year of “Week of Year” | Y | 1997 |
u | extended year | u | 4601 |
U | cyclic year name, as in Chinese lunar calendar | U | 甲子 |
r | related Gregorian year | r | 1996 |
Q | quarter |
Q QQ QQQ QQQQ QQQQQ
| 2 02 Q2 2nd quarter 2 |
q | stand-alone quarter |
q qq qqq qqqq qqqqq
| 2 02 Q2 2nd quarter 2 |
M | month in year |
M MM MMM MMMM MMMMM
| 9 09 Sep September S |
L | stand-alone month in year |
L LL LLL LLLL LLLLL
| 9 09 Sep September S |
w | week of year |
w ww
| 27 27 |
W | week of month | W | 2 |
d | day in month |
d dd
| 2 02 |
D | day of year | D | 189 |
F | day of week in month | F | 2 (2nd Wed in July) |
g | modified julian day | g | 2451334 |
E | day of week |
E, EE , or EEE EEEE EEEEE EEEEEE
| Tue Tuesday T Tu |
e | local day of week example: if Monday is 1st day, Tuesday is 2nd ) |
e or ee eee eeee eeeee eeeeee
| 2 Tue Tuesday T Tu |
c | stand-alone local day of week |
c or cc ccc cccc ccccc cccccc
| 2 Tue Tuesday T Tu |
a | AM or PM |
a , aa , or aaa aaaa aaaaa
| PM [abbrev] PM [wide] p |
b | am, pm, noon, midnight |
b , bb , or bbb bbbb bbbbb
| mid. midnight md |
B | flexible day periods |
B , BB , or BBB BBBB BBBBB
| at night [abbrev] at night [wide] at night [narrow] |
h | hour in am/pm (1~12) |
h hh
| 7 07 |
H | hour in day (0~23) |
H HH
| 0 00 |
k | hour in day (1~24) |
k kk
| 24 24 |
K | hour in am/pm (0~11) |
K KK
| 0 00 |
m | minute in hour |
m mm
| 4 04 |
s | second in minute |
s ss
| 5 05 |
S | fractional second – truncates (like other time fields) to the count of letters when formatting. Appends zeros if more than 3 letters specified. Truncates at three significant digits when parsing. |
S SS SSS SSSS
| 2 23 235 2350 |
A | milliseconds in day | A | 61201235 |
z | Time Zone: specific non-location |
z , zz , or zzz zzzz
| PDT Pacific Daylight Time |
Z | Time Zone: ISO8601 basic hms? / RFC 822 Time Zone: long localized GMT (=OOOO) TIme Zone: ISO8601 extended hms? (=XXXXX) |
Z , ZZ , or ZZZ ZZZZ ZZZZZ
| -0800 GMT-08:00 -08:00, -07:52:58, Z |
O | Time Zone: short localized GMT Time Zone: long localized GMT (=ZZZZ) |
O OOOO
| GMT-8 GMT-08:00 |
v | Time Zone: generic non-location (falls back first to VVVV) |
v vvvv
| PT Pacific Time or Los Angeles Time |
V | Time Zone: short time zone ID Time Zone: long time zone ID Time Zone: time zone exemplar city Time Zone: generic location (falls back to OOOO) |
V VV VVV VVVV
| uslax America/Los_Angeles Los Angeles Los Angeles Time |
X | Time Zone: ISO8601 basic hm?, with Z for 0 Time Zone: ISO8601 basic hm, with Z Time Zone: ISO8601 extended hm, with Z Time Zone: ISO8601 basic hms?, with Z Time Zone: ISO8601 extended hms?, with Z |
X XX XXX XXXX XXXXX
| -08, +0530, Z -0800, Z -08:00, Z -0800, -075258, Z -08:00, -07:52:58, Z |
x | Time Zone: ISO8601 basic hm?, without Z for 0 Time Zone: ISO8601 basic hm, without Z Time Zone: ISO8601 extended hm, without Z Time Zone: ISO8601 basic hms?, without Z Time Zone: ISO8601 extended hms?, without Z |
x xx xxx xxxx xxxxx
| -08, +0530 -0800 -08:00 -0800, -075258 -08:00, -07:52:58 |
' | escape for text | ' | (nothing) |
' ' | two single quotes produce one | ' ' | ’ |
Voici le code PHP permettant de faire fonctionner ce shortcode,
// On définit la fonction utilisée par le shortcode
function acf_date_shortcode( $atts ) {
// extract attributs
extract( shortcode_atts( array(
'field' => '',
'post_id' => false,
'format_value' => true,
'date_format' => ''
), $atts ) );
// On récupère le champ acf
$acf_date = get_field( $field, $post_id, $format_value );
// On en crée une date ç partir de la date récupérée d'ACF
$date = DateTime::createFromFormat('d/m/Y', $acf_date);
// On initialise la manière dont on va formater la date, remarquez bien le fr_FR pour bien l'avoir en français
$formatter = new IntlDateFormatter('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::NONE);
// On utilise pour formater la chaine de formatage qu'on passe en paramètre du
$formatter->setPattern($date_format);
// On applique le formatage souhaité sur notre date
$date_format_fr = $formatter->format($date);
// On retourne le résultat pour l'afficher à l'emplacement du shortcode
return $date_format_fr;
}
// on créé le shortcode
add_shortcode( 'acf_date', 'acf_date_shortcode' );
Pour rajouter ce code, vous pouvez utiliser soit le rajouter dans le functions.php de votre thème enfant, ou encore via un plugin comme code snippet ()
Une fois le code rajouté, vous pourrez utiliser le shortcode qui va vous permettre de formater un champ date ACF comme vous voulez.
Cela fonctionne aussi très bien dans une loop de posts, comme c’est mon cas ici