{"id":351324,"date":"2026-08-11T10:39:18","date_gmt":"2026-08-11T10:39:18","guid":{"rendered":"https:\/\/fr.wordpress.org\/plugins\/sprint-birthdays\/"},"modified":"2026-08-11T10:38:51","modified_gmt":"2026-08-11T10:38:51","slug":"sprint-birthdays","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/sprint-birthdays\/","author":23539978,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Sprint Birthdays","header_author":"Sprint Plugins","header_description":"Automatically send personalized birthday emails to WordPress users from user meta or an ACF date field.","assets_banners_color":"e5f4fa","last_updated":"2026-08-11 10:38:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/sprintplugins.fr\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"sprintplugins","date":"2026-08-11 10:38:51"}},"upgrade_notice":{"1.0.0":"<p>Initial public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3641770,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3641770,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3641770,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3641770,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3641770,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3641836,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=sprint-birthdays\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"sprint-birthdays\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\n\\nupdate_option( 'blogname', 'Club D\\u00e9mo Sprint' );\\nupdate_option( 'timezone_string', 'Europe\\\/Paris' );\\n\\n$people = array(\\n\\tarray( 'login' => 'lea.martin',     'email' => 'lea.martin@example.test',     'first' => 'L\\u00e9a',     'last' => 'Martin',    'offset' => 0,  'year' => 1994 ),\\n\\tarray( 'login' => 'hugo.bernard',   'email' => 'hugo.bernard@example.test',   'first' => 'Hugo',    'last' => 'Bernard',   'offset' => 2,  'year' => 1988 ),\\n\\tarray( 'login' => 'camille.robert', 'email' => 'camille.robert@example.test', 'first' => 'Camille', 'last' => 'Robert',    'offset' => 5,  'year' => 1999 ),\\n\\tarray( 'login' => 'nina.dubois',    'email' => 'nina.dubois@example.test',    'first' => 'Nina',    'last' => 'Dubois',    'offset' => 12, 'year' => 1991 ),\\n\\tarray( 'login' => 'lucas.moreau',   'email' => 'lucas.moreau@example.test',   'first' => 'Lucas',   'last' => 'Moreau',    'offset' => 20, 'year' => 1985 ),\\n\\tarray( 'login' => 'ines.laurent',   'email' => 'ines.laurent@example.test',   'first' => 'In\\u00e8s',    'last' => 'Laurent',   'offset' => 28, 'year' => 2000 ),\\n);\\n\\n$today       = new DateTimeImmutable( 'today', wp_timezone() );\\n$created_ids = array();\\n\\nforeach ( $people as $person ) {\\n\\t$user_id = username_exists( $person['login'] );\\n\\n\\tif ( ! $user_id ) {\\n\\t\\t$user_id = wp_create_user(\\n\\t\\t\\t$person['login'],\\n\\t\\t\\twp_generate_password( 24, true, true ),\\n\\t\\t\\t$person['email']\\n\\t\\t);\\n\\t}\\n\\n\\tif ( is_wp_error( $user_id ) ) {\\n\\t\\tcontinue;\\n\\t}\\n\\n\\twp_update_user(\\n\\t\\tarray(\\n\\t\\t\\t'ID'           => $user_id,\\n\\t\\t\\t'first_name'   => $person['first'],\\n\\t\\t\\t'last_name'    => $person['last'],\\n\\t\\t\\t'display_name' => $person['first'] . ' ' . $person['last'],\\n\\t\\t)\\n\\t);\\n\\n\\t$user = new WP_User( $user_id );\\n\\t$user->set_role( 'subscriber' );\\n\\n\\t$target    = $today->modify( '+' . (int) $person['offset'] . ' days' );\\n\\t$birthdate = sprintf( '%04d-%s', (int) $person['year'], $target->format( 'm-d' ) );\\n\\n\\tupdate_user_meta( $user_id, 'date_naissance', $birthdate );\\n\\t$created_ids[] = $user_id;\\n}\\n\\n$settings = wp_parse_args(\\n\\tget_option( 'sprint_birthdays_settings', array() ),\\n\\tSprint_Birthdays::defaults()\\n);\\n\\n$settings['enabled']            = 1;\\n$settings['meta_key']           = 'date_naissance';\\n$settings['date_format']        = 'Y-m-d';\\n$settings['roles']              = array( 'subscriber' );\\n$settings['member_days_before'] = 0;\\n$settings['send_hour']          = 8;\\n$settings['feb29_behavior']     = 'feb28';\\n$settings['from_name']          = 'Club D\\u00e9mo Sprint';\\n$settings['primary_color']      = '#3B82C4';\\n\\nupdate_option( 'sprint_birthdays_settings', $settings );\\n\\nSprint_Birthdays::clear_analysis_cache();\\nSprint_Birthdays_Cron::schedule_event();\\n\\nif ( class_exists( 'Sprint_Birthdays_Logger' ) && count( $created_ids ) >= 3 ) {\\n\\t$logger    = new Sprint_Birthdays_Logger();\\n\\t$last_year = (int) $today->format( 'Y' ) - 1;\\n\\n\\t$logger->record(\\n\\t\\tarray(\\n\\t\\t\\t'user_id'   => $created_ids[0],\\n\\t\\t\\t'email'     => 'lea.martin@example.test',\\n\\t\\t\\t'event_key' => 'birthday-member-' . $last_year,\\n\\t\\t\\t'send_type' => 'automatic',\\n\\t\\t\\t'status'    => 'sent',\\n\\t\\t\\t'details'   => 'Email anniversaire envoy\\u00e9 avec succ\\u00e8s.',\\n\\t\\t)\\n\\t);\\n\\n\\t$logger->record(\\n\\t\\tarray(\\n\\t\\t\\t'user_id'   => $created_ids[1],\\n\\t\\t\\t'email'     => 'hugo.bernard@example.test',\\n\\t\\t\\t'event_key' => 'birthday-member-' . $last_year,\\n\\t\\t\\t'send_type' => 'automatic',\\n\\t\\t\\t'status'    => 'sent',\\n\\t\\t\\t'details'   => 'Email anniversaire envoy\\u00e9 avec succ\\u00e8s.',\\n\\t\\t)\\n\\t);\\n\\n\\t$logger->record(\\n\\t\\tarray(\\n\\t\\t\\t'user_id'       => $created_ids[2],\\n\\t\\t\\t'email'         => 'camille.robert@example.test',\\n\\t\\t\\t'event_key'     => 'birthday-member-' . $last_year,\\n\\t\\t\\t'send_type'     => 'automatic',\\n\\t\\t\\t'status'        => 'failed',\\n\\t\\t\\t'details'       => 'Exemple de journal de d\\u00e9monstration.',\\n\\t\\t\\t'error_message' => '\\u00c9chec simul\\u00e9 pour pr\\u00e9senter les diagnostics.',\\n\\t\\t)\\n\\t);\\n}\\n\\nSprint_Birthdays::clear_analysis_cache();\\n\"},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3641770,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3641770,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3641770,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3641770,"resolution":"4","location":"assets","locale":"","width":1440,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3641770,"resolution":"5","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"Birthday source, recipient roles, delivery timing, and February 29 settings.","2":"Email customization with variables, visual settings, preview, and test delivery.","3":"Upcoming birthdays and the daily scheduled processing queue.","4":"Delivery history with status details and manual retry actions.","5":"Individual opt-out preference and administration diagnostics."}},"plugin_section":[],"plugin_tags":[2211,1435,267,1919,1917],"plugin_category":[41,58,59],"plugin_contributors":[274079],"plugin_business_model":[],"class_list":["post-351324","plugin","type-plugin","status-publish","hentry","plugin_tags-acf","plugin_tags-birthday","plugin_tags-email","plugin_tags-members","plugin_tags-users","plugin_category-communication","plugin_category-user-management","plugin_category-utilities-and-tools","plugin_contributors-sprintplugins","plugin_committers-sprintplugins"],"banners":{"banner":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/banner-772x250.png?rev=3641770","banner_2x":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/banner-1544x500.png?rev=3641770","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/icon.svg?rev=3641770","icon":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/icon.svg?rev=3641770","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/screenshot-1.png?rev=3641770","caption":"Birthday source, recipient roles, delivery timing, and February 29 settings."},{"src":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/screenshot-2.png?rev=3641770","caption":"Email customization with variables, visual settings, preview, and test delivery."},{"src":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/screenshot-3.png?rev=3641770","caption":"Upcoming birthdays and the daily scheduled processing queue."},{"src":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/screenshot-4.png?rev=3641770","caption":"Delivery history with status details and manual retry actions."},{"src":"https:\/\/ps.w.org\/sprint-birthdays\/assets\/screenshot-5.png?rev=3641770","caption":"Individual opt-out preference and administration diagnostics."}],"raw_content":"<!--section=description-->\n<p>Sprint Birthdays reads a birth date already stored in a WordPress user profile and automatically sends a personalized birthday email. It can use an existing user meta key or a detected ACF date field.<\/p>\n\n<h4>Birthday source and recipients<\/h4>\n\n<ul>\n<li>Select an existing user meta key or a detected ACF date field.<\/li>\n<li>Support for common date formats and automatic format detection.<\/li>\n<li>Filter recipients by WordPress user role.<\/li>\n<li>Let an individual user opt out from birthday emails in their profile.<\/li>\n<li>Choose how February 29 birthdays are handled outside leap years.<\/li>\n<\/ul>\n\n<h4>Emails and notifications<\/h4>\n\n<ul>\n<li>Send on the birthday or a configurable number of days beforehand.<\/li>\n<li>Customize the subject, message, signature, logo, colors, button, and footer.<\/li>\n<li>Use standard variables and custom user meta variables such as <code>{user_meta:my_key}<\/code>.<\/li>\n<li>Preview the rendered email and send test messages.<\/li>\n<li>Optionally inform selected responsible roles before the birthday.<\/li>\n<li>Optionally send a separate notification to responsible roles after delivery.<\/li>\n<li>Use Cc or Bcc for grouped responsible-role notifications.<\/li>\n<\/ul>\n\n<h4>Reliability and administration<\/h4>\n\n<ul>\n<li>Daily WP-Cron processing with configurable batch size and delay.<\/li>\n<li>Catch-up processing after missed scheduled tasks.<\/li>\n<li>Annual duplicate protection for automatic deliveries.<\/li>\n<li>Delivery history, manual retry, diagnostics, and configurable log retention.<\/li>\n<li>Administrator alerts when processing fails or the configuration is unusable.<\/li>\n<li>Integration with WordPress personal-data export and erasure tools.<\/li>\n<li>Optional detection by Sprint Club without sharing birth-date data.<\/li>\n<\/ul>\n\n<p>Sprint Birthdays does not use an external service, add open tracking, or collect telemetry. Email delivery uses the mail system configured for the WordPress site.<\/p>\n\n<h4>Personal data<\/h4>\n\n<p>Depending on the configuration, birthday emails may contain the member's name, email address, birthday, age, and selected custom user metadata.<\/p>\n\n<p>The technical log stores only the information required to monitor delivery: the WordPress user ID, destination address, event type, status, timestamps, and an optional error message. The complete birth date is not stored in the log.<\/p>\n\n<p>The plugin registers a personal-data exporter and eraser. The source birth-date field is not deleted by Sprint Birthdays because it may belong to WordPress, ACF, or another plugin that owns that profile field.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Sprint Birthdays.<\/li>\n<li>Open the \u201cSprint Birthdays\u201d menu in WordPress administration.<\/li>\n<li>Select the user meta key or ACF date field that contains the birth date.<\/li>\n<li>Configure recipients and the email template.<\/li>\n<li>Send a test email.<\/li>\n<li>Enable daily automatic processing.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20create%20a%20new%20birth-date%20field%3F\"><h3>Does the plugin create a new birth-date field?<\/h3><\/dt>\n<dd><p>No. It is designed to use an existing user meta key or an ACF date field. A key can also be entered manually.<\/p><\/dd>\n<dt id=\"is%20acf%20required%3F\"><h3>Is ACF required?<\/h3><\/dt>\n<dd><p>No. ACF integration is optional. Any existing scalar user meta value can be used when its date format is supported.<\/p><\/dd>\n<dt id=\"can%20the%20same%20birthday%20email%20be%20sent%20more%20than%20once%3F\"><h3>Can the same birthday email be sent more than once?<\/h3><\/dt>\n<dd><p>Automatic processing stores an annual event key to prevent duplicates. An administrator can still force a manual resend from the delivery history.<\/p><\/dd>\n<dt id=\"how%20are%20february%2029%20birthdays%20handled%3F\"><h3>How are February 29 birthdays handled?<\/h3><\/dt>\n<dd><p>The settings can send on February 28, March 1, or only on February 29 during leap years.<\/p><\/dd>\n<dt id=\"does%20sprint%20club%20need%20to%20be%20installed%3F\"><h3>Does Sprint Club need to be installed?<\/h3><\/dt>\n<dd><p>No. Sprint Birthdays works independently. When Sprint Club is active, it can detect the plugin and provide a direct administration link.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20data%20to%20an%20external%20service%3F\"><h3>Does the plugin send data to an external service?<\/h3><\/dt>\n<dd><p>No. It uses <code>wp_mail()<\/code> and the mail delivery configuration of the WordPress site. No telemetry or remote tracking is included.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Automatic personalized birthday emails from user meta or ACF date fields.<\/li>\n<li>Role filtering, individual opt-out, responsible-role notifications, previews, and test emails.<\/li>\n<li>Batch processing, catch-up jobs, duplicate protection, delivery logs, diagnostics, and privacy tools.<\/li>\n<li>Lightweight Sprint Club integration with a direct administration link.<\/li>\n<\/ul>","raw_excerpt":"Automatically send personalized birthday emails to WordPress users from an existing user meta key or an ACF date field.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/351324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=351324"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sprintplugins"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=351324"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=351324"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=351324"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=351324"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=351324"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=351324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}