{"id":365853,"date":"2026-09-09T10:22:18","date_gmt":"2026-09-09T10:22:18","guid":{"rendered":"https:\/\/fr.wordpress.org\/plugins\/sprint-families\/"},"modified":"2026-09-09T10:22:01","modified_gmt":"2026-09-09T10:22:01","slug":"sprint-families","status":"publish","type":"plugin","link":"https:\/\/hat.wordpress.org\/plugins\/sprint-families\/","author":23539978,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"Sprint Families","header_author":"Sprint Plugins","header_description":"Manage households, legal guardians, family relationships, and permissions between WordPress accounts for clubs and associations.","assets_banners_color":"f3ecf6","last_updated":"2026-09-09 10:22:01","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":39,"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-09-09 10:22:01","revision":3688101}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3688112,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3688112,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3688112,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500-fr_FR.png":{"filename":"banner-1544x500-fr_FR.png","revision":3688112,"resolution":"1544x500","location":"assets","locale":"fr_FR","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3688112,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-fr_FR.png":{"filename":"banner-772x250-fr_FR.png","revision":3688112,"resolution":"772x250","location":"assets","locale":"fr_FR","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3688112,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3688972,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=sprint-families\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":false},\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"sprint-families\"},\"options\":{\"activate\":true}},{\"step\":\"mkdir\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\"},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\\\/sprint-families-playground-demo.php\",\"data\":\"<?php\\n\\\/**\\n * Sprint Families - WordPress.org Playground demo helper.\\n *\\n * All people, households, email addresses, relationships and permissions\\n * created by this file are synthetic and exist only in the Playground site.\\n *\\\/\\n\\ndefined( 'ABSPATH' ) || exit;\\n\\n\\\/** Return true when the current WordPress locale is French. *\\\/\\nfunction sfam_pg_is_french(): bool {\\n\\t$locale = function_exists( 'determine_locale' ) ? determine_locale() : get_locale();\\n\\treturn 0 === strpos( strtolower( (string) $locale ), 'fr' );\\n}\\n\\n\\\/** Return a localized demo string. *\\\/\\nfunction sfam_pg_text( string $en, string $fr ): string {\\n\\treturn sfam_pg_is_french() ? $fr : $en;\\n}\\n\\n\\\/** Create or update a synthetic WordPress account. *\\\/\\nfunction sfam_pg_user( string $login, string $display_name, string $first_name, string $last_name, string $role = 'subscriber' ): int {\\n\\t$user = get_user_by( 'login', $login );\\n\\t$email = $login . '@example.org';\\n\\tif ( ! $user ) {\\n\\t\\t$user_id = wp_insert_user(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'user_login'   => $login,\\n\\t\\t\\t\\t'user_pass'    => wp_generate_password( 24, true, true ),\\n\\t\\t\\t\\t'user_email'   => $email,\\n\\t\\t\\t\\t'display_name' => $display_name,\\n\\t\\t\\t\\t'first_name'   => $first_name,\\n\\t\\t\\t\\t'last_name'    => $last_name,\\n\\t\\t\\t\\t'role'         => $role,\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\tif ( is_wp_error( $user_id ) ) {\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\t\\treturn (int) $user_id;\\n\\t}\\n\\twp_update_user(\\n\\t\\tarray(\\n\\t\\t\\t'ID'           => $user->ID,\\n\\t\\t\\t'user_email'   => $email,\\n\\t\\t\\t'display_name' => $display_name,\\n\\t\\t\\t'first_name'   => $first_name,\\n\\t\\t\\t'last_name'    => $last_name,\\n\\t\\t\\t'role'         => $role,\\n\\t\\t)\\n\\t);\\n\\treturn (int) $user->ID;\\n}\\n\\n\\\/** Seed the functional demo once. *\\\/\\nfunction sfam_pg_seed_demo(): void {\\n\\tif ( ! class_exists( '\\\\SprintPlugins\\\\Families\\\\Plugin' ) || ! class_exists( '\\\\SprintPlugins\\\\Families\\\\Database' ) ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t$state = get_option( 'sprint_families_playground_demo', array() );\\n\\tif ( is_array( $state ) && ! empty( $state['seeded'] ) ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t\\\\SprintPlugins\\\\Families\\\\Database::install();\\n\\t$plugin     = \\\\SprintPlugins\\\\Families\\\\Plugin::instance();\\n\\t$repository = $plugin->repository();\\n\\t$service    = $plugin->family_service();\\n\\n\\t$admin = get_user_by( 'login', 'admin' );\\n\\t$admin_id = $admin ? (int) $admin->ID : 1;\\n\\tif ( $admin_id > 0 ) {\\n\\t\\twp_set_current_user( $admin_id );\\n\\t\\twp_update_user(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'ID'           => $admin_id,\\n\\t\\t\\t\\t'display_name' => 'Camille Martin',\\n\\t\\t\\t\\t'first_name'   => 'Camille',\\n\\t\\t\\t\\t'last_name'    => 'Martin',\\n\\t\\t\\t\\t'user_email'   => 'camille.martin@example.org',\\n\\t\\t\\t)\\n\\t\\t);\\n\\t}\\n\\n\\t$users = array(\\n\\t\\t'camille' => $admin_id,\\n\\t\\t'julien'  => sfam_pg_user( 'julien.martin', 'Julien Martin', 'Julien', 'Martin', 'sprint_family_guardian' ),\\n\\t\\t'lea'     => sfam_pg_user( 'lea.martin', 'L\\u00e9a Martin', 'L\\u00e9a', 'Martin' ),\\n\\t\\t'hugo'    => sfam_pg_user( 'hugo.martin', 'Hugo Martin', 'Hugo', 'Martin' ),\\n\\t\\t'sophie'  => sfam_pg_user( 'sophie.bernard', 'Sophie Bernard', 'Sophie', 'Bernard', 'sprint_family_guardian' ),\\n\\t\\t'lucas'   => sfam_pg_user( 'lucas.bernard', 'Lucas Bernard', 'Lucas', 'Bernard' ),\\n\\t\\t'claire'  => sfam_pg_user( 'claire.dubois', 'Claire Dubois', 'Claire', 'Dubois', 'sprint_family_guardian' ),\\n\\t\\t'thomas'  => sfam_pg_user( 'thomas.dubois', 'Thomas Dubois', 'Thomas', 'Dubois', 'sprint_family_guardian' ),\\n\\t\\t'maxime'  => sfam_pg_user( 'maxime.dubois', 'Maxime Dubois', 'Maxime', 'Dubois' ),\\n\\t\\t'emma'    => sfam_pg_user( 'emma.lee', 'Emma Lee', 'Emma', 'Lee', 'sprint_family_guardian' ),\\n\\t\\t'noah'    => sfam_pg_user( 'noah.lee', 'Noah Lee', 'Noah', 'Lee' ),\\n\\t);\\n\\n\\t$settings = \\\\SprintPlugins\\\\Families\\\\Settings::all();\\n\\t$settings['send_account_email'] = 0;\\n\\t$settings['recommend_one_email'] = 0;\\n\\t$settings['log_retention_days'] = 365;\\n\\t$settings['delete_data_on_uninstall'] = 0;\\n\\tupdate_option( \\\\SprintPlugins\\\\Families\\\\Settings::OPTION, $settings, false );\\n\\t\\\\SprintPlugins\\\\Families\\\\Usage_Modes::set_default( 'expert' );\\n\\tif ( $admin_id > 0 ) {\\n\\t\\t\\\\SprintPlugins\\\\Families\\\\Usage_Modes::set_current( $admin_id, 'expert' );\\n\\t}\\n\\n\\t$groups = array();\\n\\t$groups['martin'] = $repository->create_group( array( 'name' => 'Martin Household', 'status' => 'active', 'created_by' => $admin_id ) );\\n\\t$groups['bernard'] = $repository->create_group( array( 'name' => 'Bernard Household', 'status' => 'active', 'created_by' => $admin_id ) );\\n\\t$groups['dubois'] = $repository->create_group( array( 'name' => 'Dubois Household', 'status' => 'active', 'created_by' => $admin_id ) );\\n\\t$groups['lee'] = $repository->create_group( array( 'name' => 'Lee Household (suspended)', 'status' => 'inactive', 'created_by' => $admin_id ) );\\n\\tforeach ( $groups as $key => $value ) {\\n\\t\\tif ( is_wp_error( $value ) ) {\\n\\t\\t\\t$groups[ $key ] = 0;\\n\\t\\t} else {\\n\\t\\t\\t$groups[ $key ] = (int) $value;\\n\\t\\t}\\n\\t}\\n\\n\\t$save = static function( string $group_key, string $guardian_key, string $member_key, string $type, string $template, string $status = 'active', bool $primary = false, bool $legal = true ) use ( $service, $groups, $users, $admin_id ): int {\\n\\t\\t$group_id = (int) ( $groups[ $group_key ] ?? 0 );\\n\\t\\t$guardian_id = (int) ( $users[ $guardian_key ] ?? 0 );\\n\\t\\t$member_id = (int) ( $users[ $member_key ] ?? 0 );\\n\\t\\tif ( ! $group_id || ! $guardian_id || ! $member_id ) {\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\t\\t$result = $service->save_relationship(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'group_id'            => $group_id,\\n\\t\\t\\t\\t'guardian_user_id'     => $guardian_id,\\n\\t\\t\\t\\t'member_user_id'       => $member_id,\\n\\t\\t\\t\\t'relationship_type'    => $type,\\n\\t\\t\\t\\t'is_legal_guardian'    => $legal,\\n\\t\\t\\t\\t'is_primary'           => $primary,\\n\\t\\t\\t\\t'status'               => $status,\\n\\t\\t\\t\\t'source'               => 'playground',\\n\\t\\t\\t\\t'source_reference'     => 'demo-' . $group_key . '-' . $guardian_key . '-' . $member_key,\\n\\t\\t\\t\\t'permission_template'  => $template,\\n\\t\\t\\t\\t'created_by'           => $admin_id,\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn is_wp_error( $result ) ? 0 : (int) $result;\\n\\t};\\n\\n\\t$relationships = array(\\n\\t\\t'martin_camille_lea'  => $save( 'martin', 'camille', 'lea', 'mother', 'full', 'active', true, true ),\\n\\t\\t'martin_camille_hugo' => $save( 'martin', 'camille', 'hugo', 'mother', 'full', 'active', false, true ),\\n\\t\\t'martin_julien_lea'   => $save( 'martin', 'julien', 'lea', 'father', 'view_only', 'active', false, true ),\\n\\t\\t'martin_julien_hugo'  => $save( 'martin', 'julien', 'hugo', 'father', 'documents', 'active', false, true ),\\n\\t\\t'bernard_sophie_lucas'=> $save( 'bernard', 'sophie', 'lucas', 'legal_guardian', 'events', 'active', true, true ),\\n\\t\\t'dubois_claire_maxime'=> $save( 'dubois', 'claire', 'maxime', 'mother', 'full', 'active', true, true ),\\n\\t\\t'dubois_thomas_maxime'=> $save( 'dubois', 'thomas', 'maxime', 'father', 'view_only', 'pending', false, true ),\\n\\t\\t'lee_emma_noah'       => $save( 'lee', 'emma', 'noah', 'legal_guardian', 'communications', 'active', true, true ),\\n\\t);\\n\\n\\t$portal_page_id = wp_insert_post(\\n\\t\\tarray(\\n\\t\\t\\t'post_title'   => 'Family Portal Demo',\\n\\t\\t\\t'post_name'    => 'sprint-families-demo-portal',\\n\\t\\t\\t'post_content' => '[sprint_families_portal]',\\n\\t\\t\\t'post_status'  => 'publish',\\n\\t\\t\\t'post_type'    => 'page',\\n\\t\\t),\\n\\t\\ttrue\\n\\t);\\n\\t$portal_page_id = is_wp_error( $portal_page_id ) ? 0 : (int) $portal_page_id;\\n\\n\\t$guide_page_id = wp_insert_post(\\n\\t\\tarray(\\n\\t\\t\\t'post_title'   => 'Sprint Families Demo Guide',\\n\\t\\t\\t'post_name'    => 'sprint-families-demo-guide',\\n\\t\\t\\t'post_content' => '',\\n\\t\\t\\t'post_status'  => 'publish',\\n\\t\\t\\t'post_type'    => 'page',\\n\\t\\t),\\n\\t\\ttrue\\n\\t);\\n\\t$guide_page_id = is_wp_error( $guide_page_id ) ? 0 : (int) $guide_page_id;\\n\\n\\tupdate_option(\\n\\t\\t'sprint_families_playground_demo',\\n\\t\\tarray(\\n\\t\\t\\t'seeded'        => 1,\\n\\t\\t\\t'locale'        => '',\\n\\t\\t\\t'users'         => $users,\\n\\t\\t\\t'groups'        => $groups,\\n\\t\\t\\t'relationships' => $relationships,\\n\\t\\t\\t'portal_page_id'=> $portal_page_id,\\n\\t\\t\\t'guide_page_id' => $guide_page_id,\\n\\t\\t),\\n\\t\\tfalse\\n\\t);\\n}\\n\\n\\\/** Keep the synthetic content in the language selected by WordPress.org. *\\\/\\nfunction sfam_pg_localize_demo(): void {\\n\\t$state = get_option( 'sprint_families_playground_demo', array() );\\n\\tif ( ! is_array( $state ) || empty( $state['seeded'] ) || ! class_exists( '\\\\SprintPlugins\\\\Families\\\\Plugin' ) ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t$locale = sfam_pg_is_french() ? 'fr' : 'en';\\n\\tif ( (string) ( $state['locale'] ?? '' ) === $locale ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t$repository = \\\\SprintPlugins\\\\Families\\\\Plugin::instance()->repository();\\n\\t$groups = is_array( $state['groups'] ?? null ) ? $state['groups'] : array();\\n\\t$names = array(\\n\\t\\t'martin'  => sfam_pg_text( 'Martin Household', 'Foyer Martin' ),\\n\\t\\t'bernard' => sfam_pg_text( 'Bernard Household', 'Foyer Bernard' ),\\n\\t\\t'dubois'  => sfam_pg_text( 'Dubois Household', 'Foyer Dubois' ),\\n\\t\\t'lee'     => sfam_pg_text( 'Lee Household (suspended)', 'Foyer Lee (suspendu)' ),\\n\\t);\\n\\tforeach ( $names as $key => $name ) {\\n\\t\\t$group_id = absint( $groups[ $key ] ?? 0 );\\n\\t\\tif ( $group_id ) {\\n\\t\\t\\t$repository->update_group( $group_id, array( 'name' => $name ) );\\n\\t\\t}\\n\\t}\\n\\n\\tupdate_option( 'blogname', sfam_pg_text( 'Sprint Families \\u2014 Playground Demo', 'Sprint Families \\u2014 D\\u00e9mo Playground' ), false );\\n\\tupdate_option( 'blogdescription', sfam_pg_text( 'Synthetic household and delegated-permission data', 'Donn\\u00e9es fictives de foyers et de permissions d\\u00e9l\\u00e9gu\\u00e9es' ), false );\\n\\tupdate_option( 'permalink_structure', '\\\/%postname%\\\/', false );\\n\\n\\t$portal_page_id = absint( $state['portal_page_id'] ?? 0 );\\n\\tif ( $portal_page_id ) {\\n\\t\\twp_update_post(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'ID'         => $portal_page_id,\\n\\t\\t\\t\\t'post_title' => sfam_pg_text( 'Family Portal Demo', 'Portail famille \\u2014 D\\u00e9mo' ),\\n\\t\\t\\t)\\n\\t\\t);\\n\\t}\\n\\n\\t$guide_page_id = absint( $state['guide_page_id'] ?? 0 );\\n\\tif ( $guide_page_id ) {\\n\\t\\t$portal_url = $portal_page_id ? get_permalink( $portal_page_id ) : home_url( '\\\/' );\\n\\t\\t$guide = sfam_pg_is_french()\\n\\t\\t\\t? '<h2>D\\u00e9monstration Sprint Families<\\\/h2><p><strong>Tous les noms, adresses e-mail, foyers et liens familiaux de cette pr\\u00e9visualisation sont fictifs.<\\\/strong><\\\/p><p>La d\\u00e9mo pr\\u00e9sente plusieurs foyers, des repr\\u00e9sentants principaux et secondaires, plusieurs adh\\u00e9rents, diff\\u00e9rents mod\\u00e8les de permissions, une relation en attente de validation et un foyer suspendu.<\\\/p><p>Le compte administrateur de Playground repr\\u00e9sente Camille Martin afin de permettre l\\u2019affichage imm\\u00e9diat du portail frontend.<\\\/p><p><a href=\\\"' . esc_url( $portal_url ) . '\\\">Ouvrir le portail famille de d\\u00e9monstration<\\\/a><\\\/p>'\\n\\t\\t\\t: '<h2>Sprint Families demonstration<\\\/h2><p><strong>All names, email addresses, households, and family relationships in this preview are fictitious.<\\\/strong><\\\/p><p>The demo includes multiple households, primary and secondary guardians, several members, different permission templates, one relationship awaiting review, and one suspended household.<\\\/p><p>The Playground administrator represents Camille Martin so the front-end portal can be viewed immediately.<\\\/p><p><a href=\\\"' . esc_url( $portal_url ) . '\\\">Open the demo family portal<\\\/a><\\\/p>';\\n\\t\\twp_update_post(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'ID'           => $guide_page_id,\\n\\t\\t\\t\\t'post_title'   => sfam_pg_text( 'Sprint Families Demo Guide', 'Guide de d\\u00e9monstration Sprint Families' ),\\n\\t\\t\\t\\t'post_content' => $guide,\\n\\t\\t\\t)\\n\\t\\t);\\n\\t}\\n\\n\\t$state['locale'] = $locale;\\n\\tupdate_option( 'sprint_families_playground_demo', $state, false );\\n\\tupdate_option(\\n\\t\\t'sprint_families_playground_overview',\\n\\t\\tarray(\\n\\t\\t\\t'note' => sfam_pg_text(\\n\\t\\t\\t\\t'All demonstration content is synthetic and contains no real personal data.',\\n\\t\\t\\t\\t'Tout le contenu de d\\u00e9monstration est fictif et ne contient aucune donn\\u00e9e personnelle r\\u00e9elle.'\\n\\t\\t\\t),\\n\\t\\t\\t'portal_page_id' => $portal_page_id,\\n\\t\\t\\t'guide_page_id'  => $guide_page_id,\\n\\t\\t),\\n\\t\\tfalse\\n\\t);\\n\\tflush_rewrite_rules( false );\\n}\\n\\n\\\/** Seed and localize after the regular plugin has loaded. *\\\/\\nfunction sfam_pg_boot_demo(): void {\\n\\tsfam_pg_seed_demo();\\n\\tsfam_pg_localize_demo();\\n}\\nadd_action( 'init', 'sfam_pg_boot_demo', 60 );\\n\\n\\\/** Disable outbound email in the disposable Playground. *\\\/\\nadd_filter(\\n\\t'pre_wp_mail',\\n\\tstatic function( $return, $atts ) {\\n\\t\\tunset( $atts );\\n\\t\\treturn true;\\n\\t},\\n\\t10,\\n\\t2\\n);\\n\\n\\\/** Display a clear notice and a shortcut to the front-end demo. *\\\/\\nadd_action(\\n\\t'admin_notices',\\n\\tstatic function(): void {\\n\\t\\tif ( ! current_user_can( 'manage_sprint_families' ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\t$page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';\\n\\t\\tif ( 0 !== strpos( $page, 'sprint-families' ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\t$state = get_option( 'sprint_families_playground_demo', array() );\\n\\t\\t$portal_page_id = is_array( $state ) ? absint( $state['portal_page_id'] ?? 0 ) : 0;\\n\\t\\t$link = $portal_page_id ? get_permalink( $portal_page_id ) : home_url( '\\\/' );\\n\\t\\t$message = sfam_pg_text(\\n\\t\\t\\t'<strong>WordPress.org Playground demo:<\\\/strong> all households, people, email addresses, relationships and permissions are synthetic. Outbound email is disabled. <a href=\\\"' . esc_url( $link ) . '\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">Open the front-end family portal<\\\/a>.',\\n\\t\\t\\t'<strong>D\\u00e9mo WordPress.org Playground :<\\\/strong> tous les foyers, comptes, adresses e-mail, liens et permissions sont fictifs. Les e-mails sortants sont d\\u00e9sactiv\\u00e9s. <a href=\\\"' . esc_url( $link ) . '\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">Ouvrir le portail famille frontend<\\\/a>.'\\n\\t\\t);\\n\\t\\techo '<div class=\\\"notice notice-info\\\"><p>' . wp_kses_post( $message ) . '<\\\/p><\\\/div>';\\n\\t}\\n);\\n\"},{\"step\":\"runPHP\",\"code\":\"<?php require '\\\/wordpress\\\/wp-load.php';\"},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1-fr_FR.png":{"filename":"screenshot-1-fr_FR.png","revision":3688112,"resolution":"1","location":"assets","locale":"fr_FR","width":1440,"height":900},"screenshot-1.png":{"filename":"screenshot-1.png","revision":3688112,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2-fr_FR.png":{"filename":"screenshot-2-fr_FR.png","revision":3688112,"resolution":"2","location":"assets","locale":"fr_FR","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3688112,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3-fr_FR.png":{"filename":"screenshot-3-fr_FR.png","revision":3688112,"resolution":"3","location":"assets","locale":"fr_FR","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3688112,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4-fr_FR.png":{"filename":"screenshot-4-fr_FR.png","revision":3688112,"resolution":"4","location":"assets","locale":"fr_FR","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3688112,"resolution":"4","location":"assets","locale":"","width":1440,"height":900},"screenshot-5-fr_FR.png":{"filename":"screenshot-5-fr_FR.png","revision":3688112,"resolution":"5","location":"assets","locale":"fr_FR","width":1440,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3688112,"resolution":"5","location":"assets","locale":"","width":1440,"height":900},"screenshot-6-fr_FR.png":{"filename":"screenshot-6-fr_FR.png","revision":3688112,"resolution":"6","location":"assets","locale":"fr_FR","width":1440,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3688112,"resolution":"6","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"Household dashboard and key indicators.","2":"Household overview with guardians and members.","3":"Relationship editor and permission templates.","4":"Hierarchical family relationship view.","5":"Essential, Complete, and Expert display modes.","6":"Audit log and diagnostic tools."}},"plugin_section":[],"plugin_tags":[141027,279912,279914,279913,895],"plugin_category":[54],"plugin_contributors":[274079],"plugin_business_model":[],"class_list":["post-365853","plugin","type-plugin","status-publish","hentry","plugin_tags-associations","plugin_tags-families","plugin_tags-guardians","plugin_tags-households","plugin_tags-permissions","plugin_category-security-and-spam-protection","plugin_contributors-sprintplugins","plugin_committers-sprintplugins"],"banners":{"banner":"https:\/\/ps.w.org\/sprint-families\/assets\/banner-772x250.png?rev=3688112","banner_2x":"https:\/\/ps.w.org\/sprint-families\/assets\/banner-1544x500.png?rev=3688112","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/sprint-families\/assets\/icon.svg?rev=3688112","icon":"https:\/\/ps.w.org\/sprint-families\/assets\/icon.svg?rev=3688112","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sprint-families\/assets\/screenshot-1.png?rev=3688112","caption":"Household dashboard and key indicators."},{"src":"https:\/\/ps.w.org\/sprint-families\/assets\/screenshot-2.png?rev=3688112","caption":"Household overview with guardians and members."},{"src":"https:\/\/ps.w.org\/sprint-families\/assets\/screenshot-3.png?rev=3688112","caption":"Relationship editor and permission templates."},{"src":"https:\/\/ps.w.org\/sprint-families\/assets\/screenshot-4.png?rev=3688112","caption":"Hierarchical family relationship view."},{"src":"https:\/\/ps.w.org\/sprint-families\/assets\/screenshot-5.png?rev=3688112","caption":"Essential, Complete, and Expert display modes."},{"src":"https:\/\/ps.w.org\/sprint-families\/assets\/screenshot-6.png?rev=3688112","caption":"Audit log and diagnostic tools."}],"raw_content":"<!--section=description-->\n<p>Sprint Families helps clubs, associations, schools, and community organizations manage households and the permissions granted by one WordPress user account over another.<\/p>\n\n<p>A household can contain one or more guardians and members. Each relationship can define its family role, legal-guardian status, primary guardian, lifecycle status, and a detailed set of permissions used by compatible plugins.<\/p>\n\n<h4>Household and relationship management<\/h4>\n\n<ul>\n<li>Create and manage households.<\/li>\n<li>Link guardians and members without replacing their WordPress accounts.<\/li>\n<li>Define legal guardians and an optional primary guardian.<\/li>\n<li>Use reusable permission templates or customize each relationship.<\/li>\n<li>Add several guardians or members in a guided workflow.<\/li>\n<li>Suspend or permanently remove individual relationships.<\/li>\n<li>Safely remove an entire household while retaining WordPress accounts.<\/li>\n<\/ul>\n\n<h4>Administration and integrations<\/h4>\n\n<ul>\n<li>Essential, Complete, and Expert administration modes.<\/li>\n<li>Central mode inheritance when Sprint Club is active.<\/li>\n<li>Optional Sprint Club portal integration.<\/li>\n<li>Optional compatibility with One Email, Multiple Users for shared family email addresses.<\/li>\n<li>Public PHP functions for compatible plugins and lifecycle tools.<\/li>\n<li>Audit log with configurable retention.<\/li>\n<li>Diagnostic tools restricted to Expert mode.<\/li>\n<\/ul>\n\n<h4>Personal data<\/h4>\n\n<p>Sprint Families stores household names, relationships between WordPress user IDs, relationship attributes, delegated permissions, and an audit log of permission and relationship changes.<\/p>\n\n<p>The plugin integrates with the WordPress personal-data export and erasure tools. Active or pending family relationships may be retained during an erasure request when they are still required to preserve account permissions and security. Audit records are retained for the period configured in the plugin settings.<\/p>\n\n<p>Sprint Families does not transmit personal data to an external service.<\/p>\n\n<h4>Data retention on uninstall<\/h4>\n\n<p>Plugin data is retained by default. Administrators can explicitly enable complete data removal in Sprint Families settings before uninstalling the plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Sprint Families.<\/li>\n<li>Open Sprint Families in the WordPress administration area.<\/li>\n<li>Create a household and add its guardians and members.<\/li>\n<li>Select a permission template or customize the relationship permissions.<\/li>\n<li>Configure the display mode, audit retention, and optional integrations.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20sprint%20club%20required%3F\"><h3>Is Sprint Club required?<\/h3><\/dt>\n<dd><p>No. Sprint Families works independently. Sprint Club can group its administration screens and expose authorized family data in a shared member portal.<\/p><\/dd>\n<dt id=\"is%20one%20email%2C%20multiple%20users%20required%3F\"><h3>Is One Email, Multiple Users required?<\/h3><\/dt>\n<dd><p>No. It is optional and is useful only when several WordPress accounts need to share the same email address.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20delete%20wordpress%20user%20accounts%3F\"><h3>Does the plugin delete WordPress user accounts?<\/h3><\/dt>\n<dd><p>No. Removing a household or family relationship keeps the related WordPress accounts.<\/p><\/dd>\n<dt id=\"what%20are%20the%20three%20display%20modes%3F\"><h3>What are the three display modes?<\/h3><\/dt>\n<dd><p>Essential focuses on daily household management. Complete adds detailed relationship and permission workflows. Expert also exposes the audit log and diagnostic tools.<\/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. Data remains inside the WordPress installation.<\/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<\/ul>","raw_excerpt":"Manage households, legal guardians, family relationships, and delegated permissions between WordPress user accounts.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/365853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=365853"}],"author":[{"embeddable":true,"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sprintplugins"}],"wp:attachment":[{"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=365853"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=365853"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=365853"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=365853"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=365853"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hat.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=365853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}