Compare commits

..

1 commit

Author SHA1 Message Date
Sebastien Hattry
c0366822ce Add new CN 4.0.0 2024-01-15 15:29:48 +01:00
224 changed files with 781 additions and 59408 deletions

View file

@ -41,7 +41,7 @@ MAIL_FROM_NAME="Réghalal"
MAIL_FROM_ADDRESS=no-reply@reghalal.com
# Contact
CONTACT_RECIPIENT=
MAIL_MKT=
MAIL_PASSERELLE=
# Matomo
@ -51,11 +51,8 @@ MATOMO_SITE_ID=
GOOGLE_RECAPTCHA_PUBLIC=
GOOGLE_RECAPTCHA_PRIVATE=
# UWIL ADMIN SECURE
# - LIST SEPARATED WITH ',' (Required)
UWIL_ADMIN_SECURE_CIDR_LIST=""
# - LIST SEPARATED WITH ',' (Optional)
UWIL_ADMIN_SECURE_CIDR_PROJECT_ALLOWED_LIST=""
#LDC WEB API TOKEN
LDCWEB_API_TOKEN=
#MESBR
MESBR_REF_CAMP=
@ -65,9 +62,6 @@ MESBR_ENDPOINT=
CRM_ENDPOINT=
CRM_TOKEN=
CRM_PASSWORD=
CRM_SUBJECT_GAME=
CRM_SUBJECT_COMMERCIAL=
CRM_SUBJECT_OTHER=
# IMPORT SOCIAL NETWORKS WP PLUGIN
SOCIAL_NETWORKS=

11
.gitignore vendored
View file

@ -3,14 +3,12 @@ public/app/plugins/*
!public/app/plugins/ldc-import-inco-products
!public/app/plugins/.gitkeep
public/app/mu-plugins/*/
!public/app/mu-plugins/uwil-faq/
public/app/themes/reghalal-theme/
public/app/upgrade
public/app/uploads/*
!public/app/uploads/.gitkeep
public/app/uploads/passerelle/archive/*
!public/app/uploads/passerelle/archive/.gitkeep
public/app/cache/*
public/app/passerelle/*
# WordPress
public/wp
@ -26,6 +24,9 @@ public/wp
# auth.json
auth.json
# npmrc
.npmrc
# Composer
/vendor
@ -35,7 +36,3 @@ wp-cli.phar
# Dumps
*.tar.gz
# .npmrc
# .zshrc
# .composer

View file

@ -1,22 +1,23 @@
include:
- project: "ldc-web/shared-ci"
ref: "main"
file: "security/composer.yml"
- project: "ldc-web/shared-ci"
ref: "main"
file: "build/composer-bedrock-8.3.yml"
- project: "ldc-web/shared-ci"
ref: "main"
file: "build/docker-bedrock.yml"
- project: "ldc-web/shared-ci"
ref: "main"
file: "test/test.yml"
- project: "ldc-web/shared-ci"
ref: "main"
file: "deploy/deploy.yml"
- project: 'ldc-web/shared-ci'
ref: 'main'
file: 'security/composer.yml'
- project: 'ldc-web/shared-ci'
ref: 'main'
file: 'build/composer-bedrock.yml'
- project: 'ldc-web/shared-ci'
ref: 'main'
file: 'build/docker-bedrock.yml'
- project: 'ldc-web/shared-ci'
ref: 'main'
file: 'test/test.yml'
- project: 'ldc-web/shared-ci'
ref: 'main'
file: 'deploy/deploy.yml'
stages:
- security
- build
- test
- deploy
- security
- build
- test
- deploy

View file

@ -1,7 +1,5 @@
ARG PHP_8_5_TAG=latest
FROM registry.s-web.fr/ldc-web/projets/ldc-web-images-docker/ldcweb-production-8.5:${PHP_8_5_TAG}
FROM registry.s-web.fr/ldc-web/projets/ldc-web-images-docker/ldcweb-production-8.2:latest
COPY --chown=www-data:www-data . /app/srcs
USER root
RUN chmod -R 755 /app/srcs/public/app/uploads
USER www-data
USER www-data

35
RGPD.md
View file

@ -1,35 +0,0 @@
# RGPD
## Site
### En base de données
| Table | Colonne | Contenu | Utilisation |
| ----- | ------- | ------- | ----------- |
| ldc_wp_customer | hashcode | Identifiant client en CRM | Liaison avec la CRM |
| ldc_wp_customer | email | Email du client | Connexion au club |
| --- | --- | --- | --- |
| wpjz_usermeta | meta_value | Des informations sur l'utilisateur, avec par exemple le nom et le prénom | Affichage sur le site ou BO |
| --- | --- | --- | --- |
| wpjz_users | user_email | Adresse mail | Identifiant, sert à la connexion au BO |
### Formulaire de contact (Passerelle et marketing)
| Donnée | Contenu |
| ------ | ------- |
| Civilité | Nom de la personne |
| Nom | Nom de la personne |
| Prénom | Prénom de la personne |
| Téléphone | Numéro de téléphone de la personne |
| Adresse E-mail | Adresse email de la personne |
| Adresse | Adresse de la personne |
| Ville | Ville de la personne |
| Code postal | Code postal de la personne |
## Cookies
| Service | Utilité |
| ------- | ------- |
| Matomo | Mesure d'audience |
| Google Recaptcha | Empêcher la soumission de formulaire par des robots |
| Youtube | Visionner du contenu disponible sur la plateforme Youtube |

View file

@ -2,6 +2,10 @@
"name": "uwil/reghalal",
"description": "Reghalal website",
"repositories": [
{
"type": "path",
"url": "./crm-client-3.0.6"
},
{
"type": "composer",
"url": "https://lab.s-web.fr/api/v4/group/23/-/packages/composer/packages.json"
@ -20,21 +24,21 @@
}
],
"require": {
"php": ">=8.3",
"php": ">=8.0",
"composer/installers": "^2.2",
"ldc/ldccrmv4client": "^4.0",
"nesbot/carbon": "^3.7",
"ldc/ldccrmv2client": "^3.0",
"oscarotero/env": "^2.1",
"roots/bedrock-autoloader": "^1.0",
"roots/bedrock-disallow-indexing": "^2.0",
"roots/wordpress": "^7.0",
"roots/wordpress": "6.3.1",
"roots/wp-config": "1.0.0",
"uwil/admin-secure-wp": "^3.1",
"roots/wp-password-bcrypt": "1.1.0",
"uwil/admin-secure-wp": "^2.0",
"uwil/import-social-networks-wp": "^2.0",
"uwil/mesbr-wp": "^1.2",
"uwil/reghalal-theme": "^1.6",
"uwil/mesbr-wp": "^1.0",
"uwil/reghalal-theme": "^1.0",
"vlucas/phpdotenv": "^5.5",
"wpackagist-plugin/wordpress-seo": "^27.4",
"wpackagist-plugin/wordpress-seo": "^21.2",
"wpackagist-plugin/wp-sitemap-page": "^1.9",
"wpengine/advanced-custom-fields-pro": "*"
},

2328
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,8 @@ Config::define('SMTP_PASS', env('SMTP_PASS'));
Config::define('SMTP_SECURE', env('SMTP_SECURE'));
Config::define('MAIL_FROM_NAME', env('MAIL_FROM_NAME'));
Config::define('MAIL_FROM_ADDRESS', env('MAIL_FROM_ADDRESS'));
Config::define('MAIL_MKT', env('MAIL_MKT'));
Config::define('MAIL_PASSERELLE', env('MAIL_PASSERELLE'));
/**
* Contact
@ -54,10 +56,9 @@ Config::define('GOOGLE_RECAPTCHA_PRIVATE', env('GOOGLE_RECAPTCHA_PRIVATE'));
Config::define('MATOMO_SITE_ID', env('MATOMO_SITE_ID'));
/**
* UWIL ADMIN SECURE
* LDC Web API TOKEN
*/
Config::define('UWIL_ADMIN_SECURE_CIDR_LIST', env('UWIL_ADMIN_SECURE_CIDR_LIST', ''));
Config::define('UWIL_ADMIN_SECURE_CIDR_PROJECT_ALLOWED_LIST', env('UWIL_ADMIN_SECURE_CIDR_PROJECT_ALLOWED_LIST', ''));
Config::define('LDCWEB_API_TOKEN', env('LDCWEB_API_TOKEN'));
/**
* CRM
@ -65,6 +66,3 @@ Config::define('UWIL_ADMIN_SECURE_CIDR_PROJECT_ALLOWED_LIST', env('UWIL_ADMIN_SE
Config::define('CRM_ENDPOINT', env('CRM_ENDPOINT'));
Config::define('CRM_TOKEN', env('CRM_TOKEN'));
Config::define('CRM_PASSWORD', env('CRM_PASSWORD'));
Config::define('CRM_SUBJECT_GAME', env('CRM_SUBJECT_GAME'));
Config::define('CRM_SUBJECT_COMMERCIAL', env('CRM_SUBJECT_COMMERCIAL'));
Config::define('CRM_SUBJECT_OTHER', env('CRM_SUBJECT_OTHER'));

View file

@ -1,23 +0,0 @@
<?php
use Carbon\Carbon;
/** @var WP_Filesystem_Direct $wp_filesystem */
global $wp_filesystem;
require_once(ABSPATH . 'wp-load.php');
require_once ABSPATH . 'wp-admin/includes/file.php';
WP_Filesystem();
$archiveFolder = sprintf('%s/uploads/passerelle/archive', WP_CONTENT_DIR);
if (is_dir($archiveFolder)) {
array_map(
function ($value) use ($wp_filesystem) {
if (Carbon::parse(filemtime($value))->lessThan(Carbon::now()->sub('3 months'))) {
$wp_filesystem->delete($value);
};
},
glob(sprintf('%s/*', $archiveFolder))
);
}

View file

@ -7,11 +7,11 @@ data:
DB_NAME: "${APP_DB_NAME}"
DB_USER: "${APP_DB_USER}"
DB_PASSWORD: "${APP_DB_PASSWORD}"
DB_HOST: "${APP_DB_HOST}"
DB_HOST: "mariadb-service.common-services"
DB_PREFIX: "wpjz_"
WP_ENV: "${APP_WP_ENV}"
WP_HOME: "https://${REDIRECT}${APP_DOMAIN}"
WP_SITEURL: "https://${REDIRECT}${APP_DOMAIN}/wp"
WP_HOME: "https://www.${APP_DOMAIN}"
WP_SITEURL: "https://www.${APP_DOMAIN}/wp"
AUTH_KEY: "${APP_AUTH_KEY}"
SECURE_AUTH_KEY: "${APP_SECURE_AUTH_KEY}"
LOGGED_IN_KEY: "${APP_LOGGED_IN_KEY}"
@ -32,6 +32,7 @@ data:
CONTACT_RECIPIENT: "${APP_CONTACT_RECIPIENT}"
MAIL_PASSERELLE: "${APP_MAIL_PASSERELLE}"
MATOMO_SITE_ID: "${APP_MATOMO_SITE_ID}"
LDCWEB_API_TOKEN: "${APP_LDCWEB_API_TOKEN}"
SOCIAL_NETWORKS: "${APP_SOCIAL_NETWORKS}"
FACEBOOK_APP_ID: "${APP_FACEBOOK_APP_ID}"
FACEBOOK_APP_SECRET: "${APP_FACEBOOK_APP_SECRET}"
@ -46,10 +47,6 @@ data:
CRM_ENDPOINT: "${APP_CRM_ENDPOINT}"
CRM_TOKEN: "${APP_CRM_TOKEN}"
CRM_PASSWORD: "${APP_CRM_PASSWORD}"
CRM_SUBJECT_GAME: "${APP_CRM_SUBJECT_GAME}"
CRM_SUBJECT_COMMERCIAL: "${APP_CRM_SUBJECT_COMMERCIAL}"
CRM_SUBJECT_OTHER: "${APP_CRM_SUBJECT_OTHER}"
UWIL_ADMIN_SECURE_CIDR_LIST: "${APP_GLOBAL_UWIL_ADMIN_SECURE_CIDR_LIST}"
---
apiVersion: v1
@ -85,13 +82,6 @@ spec:
envFrom:
- configMapRef:
name: ${CI_PROJECT_PATH_SLUG}-config-map
resources:
limits:
cpu: "${APP_CI_CPU_LIMIT}"
memory: "${APP_CI_MEMORY_LIMIT}"
requests:
cpu: "${APP_CI_CPU_REQUEST}"
memory: "${APP_CI_MEMORY_REQUEST}"
volumeMounts:
- name: storage
mountPath: /app/srcs/public/app/uploads
@ -107,6 +97,7 @@ spec:
persistentVolumeClaim:
claimName: ${CI_PROJECT_PATH_SLUG}-pvc-storage
---
apiVersion: v1
kind: Service
@ -117,10 +108,10 @@ spec:
app: ${CI_PROJECT_PATH_SLUG}-app
ports:
- port: 80
targetPort: 80
targetPort: 443
---
apiVersion: traefik.io/v1alpha1
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ${CI_PROJECT_PATH_SLUG}-ingress-route
@ -129,15 +120,30 @@ spec:
- web
- websecure
routes:
- match: Host(`${APP_DOMAIN}`) || Host(`www.${APP_DOMAIN}`)
- match: Host(`${APP_DOMAIN}`, `www.${APP_DOMAIN}`)
kind: Rule
services:
- name: ${CI_PROJECT_PATH_SLUG}-service
port: 80
middlewares:
- name: redirect-no-www-to-www
namespace: common-services
tls:
secretName: ${CRT_TLS_NAME}
secretName: $APP_DOMAIN
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: $APP_DOMAIN
spec:
dnsNames:
- $APP_DOMAIN
- www.${APP_DOMAIN}
secretName: $APP_DOMAIN
issuerRef:
name: $APP_CERT_ISSUER
kind: ClusterIssuer
---
apiVersion: batch/v1
@ -146,9 +152,6 @@ metadata:
name: ${CI_PROJECT_PATH_SLUG}-cronjob-sn
spec:
schedule: "30 4 * * *"
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
@ -191,9 +194,6 @@ metadata:
name: ${CI_PROJECT_PATH_SLUG}-cronjob-mbr
spec:
schedule: "30 4 * * *"
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
@ -228,48 +228,3 @@ spec:
fsGroup: 33
fsGroupChangePolicy: "OnRootMismatch"
restartPolicy: OnFailure
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: ${CI_PROJECT_PATH_SLUG}-cronjob-purge-archive
spec:
schedule: "0 0 * * 0"
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ${CI_PROJECT_PATH_SLUG}-app
topologyKey: "kubernetes.io/hostname"
namespaces: [$KUBE_NAMESPACE]
containers:
- name: ${CI_PROJECT_PATH_SLUG}-scheduled
image: $IMAGE_TAG
imagePullPolicy: IfNotPresent
command:
- "php"
args:
- "crons/PurgePasserelleArchive.php"
envFrom:
- configMapRef:
name: ${CI_PROJECT_PATH_SLUG}-config-map
imagePullSecrets:
- name: docker-registry-credentials
securityContext:
runAsUser: 33
runAsGroup: 33
fsGroup: 33
fsGroupChangePolicy: "OnRootMismatch"
restartPolicy: OnFailure

View file

@ -1,14 +0,0 @@
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: $APP_DOMAIN
spec:
dnsNames:
- $APP_DOMAIN
- www.${APP_DOMAIN}
secretName: $APP_DOMAIN
issuerRef:
name: $APP_CERT_ISSUER
kind: ClusterIssuer

View file

@ -12,16 +12,4 @@ RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
# Rules to disable WP Comments
<files wp-comments-post.php>
Order allow,deny
Deny from all
</files>
# END WordPress

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"The suggested policy text has been copied to your clipboard.":["Le texte de la politique propos\u00e9e a \u00e9t\u00e9 copi\u00e9 dans votre presse-papiers."],"This user&#8217;s personal data export file was downloaded.":["L\u2019exportation des donn\u00e9es personnelles de ce compte a \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9e."],"This user&#8217;s personal data export link was sent.":["Le lien d\u2019exportation des donn\u00e9es personnelles de ce compte a \u00e9t\u00e9 envoy\u00e9."],"An error occurred while attempting to find and erase personal data.":["Une erreur est survenue lors de la tentative de trouver et de retirer des donn\u00e9es personnelles."],"Personal data was found for this user but some of the personal data found was not erased.":["Des donn\u00e9es personnelles ont \u00e9t\u00e9 trouv\u00e9es pour ce compte mais certaines donn\u00e9es personnelles trouv\u00e9es n\u2019ont pas \u00e9t\u00e9 supprim\u00e9es."],"All of the personal data found for this user was erased.":["Toutes les donn\u00e9es personnelles trouv\u00e9es pour ce compte ont \u00e9t\u00e9 supprim\u00e9es."],"Personal data was found for this user but was not erased.":["Des donn\u00e9es personnelles ont \u00e9t\u00e9 trouv\u00e9es pour ce compte mais n\u2019ont pas \u00e9t\u00e9 supprim\u00e9es."],"No personal data was found for this user.":["Aucune donn\u00e9e personnelle n\u2019a \u00e9t\u00e9 trouv\u00e9e pour ce compte."],"An error occurred while attempting to export personal data.":["Une erreur est survenue en tentant d\u2019exporter des donn\u00e9es personnelles."],"No personal data export file was generated.":["Aucun fichier d\u2019exportation de donn\u00e9es personnelles n\u2019a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9."]}},"comment":{"reference":"wp-admin\/js\/privacy-tools.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Editor tips":["Astuces de l\u2019\u00e9diteur"],"Disable tips":["D\u00e9sactiver les astuces"],"Got it":["J\u2019ai compris"],"See next tip":["Voir l\u2019astuce suivante"]}},"comment":{"reference":"wp-includes\/js\/dist\/nux.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%1$s is deprecated since version %2$s! Use %3$s instead. Please consider writing more inclusive code.":["%1$s est obsol\u00e8te depuis la version %2$s\u00a0! Utilisez %3$s \u00e0 la place. Pensons \u00e0 \u00e9crire du code plus inclusif."]}},"comment":{"reference":"wp-admin\/js\/password-strength-meter.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%s applied.":["%s appliqu\u00e9."],"%s removed.":["%s retir\u00e9."]}},"comment":{"reference":"wp-includes\/js\/dist\/rich-text.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Create pattern\/reusable block":["Cr\u00e9er une composition ou un bloc r\u00e9utilisable"],"Unsynced Pattern created: %s":["Composition non synchronis\u00e9e cr\u00e9\u00e9e\u00a0: %s"],"Synced Pattern created: %s":["Composition synchronis\u00e9e cr\u00e9\u00e9e\u00a0: %s"],"Untitled Pattern block":["Composition de blocs sans titre"],"Editing the pattern will update it anywhere it is used.":["La modification de cette composition mettra \u00e0 jour son contenu partout o\u00f9 elle est utilis\u00e9e."],"Synced":["Synchronis\u00e9e"],"My pattern":["Ma composition"],"Create pattern":["Cr\u00e9er une composition"],"Manage patterns":["G\u00e9rer les compositions"],"Detach pattern":["D\u00e9tacher la composition"],"Detach patterns":["D\u00e9tacher les compositions"],"Create":["Cr\u00e9er"],"Cancel":["Annuler"],"Name":["Nom"]}},"comment":{"reference":"wp-includes\/js\/dist\/reusable-blocks.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%1$s Block. Row %2$d":["Bloc %1$s. Ligne %2$d"],"Design":["Apparence"],"%s Block":["Bloc %s"],"%1$s Block. %2$s":["Bloc %1$s. %2$s"],"%1$s Block. Column %2$d":["%1$s bloc. Colonne %2$d"],"%1$s Block. Column %2$d. %3$s":["Bloc %1$s. Colonne %2$d. %3$s"],"%1$s Block. Row %2$d. %3$s":["Bloc %1$s. Ligne %2$d. %3$s"],"Reusable blocks":["Blocs r\u00e9utilisables"],"Embeds":["Contenus embarqu\u00e9s"],"Text":["Texte"],"Widgets":["Widgets"],"Theme":["Th\u00e8me"],"Media":["M\u00e9dias"]}},"comment":{"reference":"wp-includes\/js\/dist\/blocks.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"You are probably offline.":["Vous \u00eates probablement hors ligne."],"Media upload failed. If this is a photo or a large image, please scale it down and try again.":["Le t\u00e9l\u00e9versement du m\u00e9dia a \u00e9chou\u00e9. S\u2019il s\u2019agit d\u2019une photo ou d\u2019une grande image, veuillez la redimensionner puis r\u00e9essayer."],"The response is not a valid JSON response.":["La r\u00e9ponse n\u2019est pas une r\u00e9ponse JSON valide."],"An unknown error occurred.":["Une erreur inconnue est survenue."]}},"comment":{"reference":"wp-includes\/js\/dist\/api-fetch.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Submitted on:":["Envoy\u00e9 le\u00a0:"],"%1$s %2$s, %3$s at %4$s:%5$s":["%2$s %1$s %3$s \u00e0 %4$sh%5$s"]}},"comment":{"reference":"wp-admin\/js\/comment.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Selected crop ratio exceeds the boundaries of the image. Try a different ratio.":["Le ratio de recadrage s\u00e9lectionn\u00e9 d\u00e9passe les limites de l\u2019image. Essayez un ratio diff\u00e9rent."],"Could not load the preview image.":["Impossible de charger l\u2019image de pr\u00e9visualisation."],"Could not load the preview image. Please reload the page and try again.":["Impossible de charger l\u2019image de pr\u00e9visualisation. Veuillez recharger la page et r\u00e9essayer."],"Image updated.":["Image mise \u00e0 jour."]}},"comment":{"reference":"wp-admin\/js\/image-edit.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Type a command or search":["Saisir une commande ou rechercher"],"Command palette":["Palette de commande"],"Open the command palette":["Ouvrir la palette de commandes"],"No results found.":["Aucun r\u00e9sultat."]}},"comment":{"reference":"wp-includes\/js\/dist\/commands.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Pattern imported successfully!":["Composition bien import\u00e9e\u00a0!"],"Invalid Pattern JSON file":["Fichier JSON de la composition invalide"],"button label\u0004Import":["Importer"],"Unknown error":["Erreur inconnue"],"Invalid JSON file":["Fichier JSON non valide"],"Import from JSON":["Importer depuis un JSON"],"File":["Fichier"]}},"comment":{"reference":"wp-includes\/js\/dist\/list-reusable-blocks.js"}}

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Annotation":["Annotation"]}},"comment":{"reference":"wp-includes\/js\/dist\/annotations.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Notifications":["Notifications"]}},"comment":{"reference":"wp-includes\/js\/dist\/a11y.js"}}

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Global Styles":["Styles globaux"],"Widget types":["Types de widget"],"Menu Item":["\u00c9l\u00e9ment de menu"],"Comment":["Commentaire"],"Widget areas":["Zone de widget"],"Site":["Site"],"Post Type":["Type de publication"],"Taxonomy":["Taxonomie"],"Menu Location":["Emplacements de menus"],"Menu":["Menu"],"User":["Compte"],"Base":["Base"],"Widgets":["Widgets"],"Site Title":["Titre du site"],"Themes":["Th\u00e8mes"],"(no title)":["(pas de titre)"],"Media":["M\u00e9dias"],"Plugins":["Extensions"]}},"comment":{"reference":"wp-includes\/js\/dist\/core-data.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Unavailable":["Indisponible"],"No details available":["Aucun d\u00e9tail disponible"],"A test is unavailable":["Un test n\u2019est pas disponible"],"All site health tests have finished running. There are items that should be addressed, and the results are now available on the page.":["Tous les tests de sant\u00e9 du site ont fini de tourner. Il y a des \u00e9l\u00e9ments qui devraient \u00eatre pris en charge, et les r\u00e9sultats sont maintenant disponible sur cette page."],"Should be improved":["Peut \u00eatre am\u00e9lior\u00e9"],"Good":["Bien"],"%s critical issue":["%s probl\u00e8me critique","%s probl\u00e8mes critiques"],"%s item with no issues detected":["%s \u00e9l\u00e9ment sans probl\u00e8me d\u00e9tect\u00e9","%s \u00e9l\u00e9ments sans probl\u00e8me d\u00e9tect\u00e9s"],"%s recommended improvement":["%s am\u00e9lioration recommand\u00e9e","%s am\u00e9liorations recommand\u00e9es"],"Site information has been copied to your clipboard.":["Les informations du site ont \u00e9t\u00e9 copi\u00e9es dans le presse-papier."],"All site health tests have finished running. Your site is looking good, and the results are now available on the page.":["Les v\u00e9rifications de sant\u00e9 sont termin\u00e9es. Votre site a bonne mine, et les r\u00e9sultats sont maintenant disponibles sur la page."],"All site health tests have finished running.":["Tous les tests de v\u00e9rification de sant\u00e9 du site sont termin\u00e9s."],"Please wait...":["Veuillez patienter\u2026"]}},"comment":{"reference":"wp-admin\/js\/site-health.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Use as featured image":["Utiliser comme image mise en avant"],"Saving\u2026":["Enregistrement\u2026"],"Could not set that as the thumbnail image. Try a different attachment.":["Impossible de s\u2019en servir comme miniature. Essayez un autre fichier joint."],"Done":["Termin\u00e9"]}},"comment":{"reference":"wp-admin\/js\/set-post-thumbnail.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Drag boxes here":["Glissez les blocs ici"],"Add boxes from the Screen Options menu":["Ajouter des blocs depuis le menu d\u2019options de l\u2019\u00e9cran"],"The boxes order has been saved.":["L\u2019ordre des boites a \u00e9t\u00e9 enregistr\u00e9."],"The box is on the last position":["La boite est en derni\u00e8re position"],"The box is on the first position":["La boite est en premi\u00e8re position"]}},"comment":{"reference":"wp-admin\/js\/postbox.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Widget has been added to the selected sidebar":["Le widget a \u00e9t\u00e9 ajout\u00e9 \u00e0 la colonne lat\u00e9rale s\u00e9lectionn\u00e9e"],"Saved":["Enregistr\u00e9"],"The changes you made will be lost if you navigate away from this page.":["Les modifications que vous avez faites seront perdues si vous changez de page."],"Save":["Enregistrer"]}},"comment":{"reference":"wp-admin\/js\/widgets.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"All application passwords revoked.":["Tous les mots de passe d\u2019application ont \u00e9t\u00e9 r\u00e9voqu\u00e9s."],"Are you sure you want to revoke all passwords? This action cannot be undone.":["Confirmez-vous la r\u00e9vocation de tous les mots de passe\u00a0? Cette action ne peut \u00eatre annul\u00e9e."],"Application password revoked.":["Mot de passe d\u2019application r\u00e9voqu\u00e9."],"Are you sure you want to revoke this password? This action cannot be undone.":["Confirmez-vous la r\u00e9vocation de ce mot de passe\u00a0? Cette action ne peut \u00eatre annul\u00e9e."],"Dismiss this notice.":["Ignorer cette notification."]}},"comment":{"reference":"wp-admin\/js\/application-passwords.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"URL Slug":["Slug de l\u2019URL"],"Permalink saved":["Permalien enregistr\u00e9"],"Published on:":["Publi\u00e9 le\u00a0:"],"Publish on:":["Publi\u00e9 le\u00a0:"],"Schedule for:":["Planifier pour\u00a0:"],"Saving Draft\u2026":["Enregistrement du brouillon\u2026"],"No more comments found.":["Aucun autre commentaire trouv\u00e9."],"Show more comments":["Afficher plus de commentaires"],"post action\/button label\u0004Schedule":["Planifier"],"%1$s %2$s, %3$s at %4$s:%5$s":["%2$s %1$s %3$s \u00e0 %4$sh%5$s"],"Public, Sticky":["Public, \u00e9pingl\u00e9"],"Privately Published":["Mis en ligne en priv\u00e9"],"Save as Pending":["Mettre en attente"],"Password Protected":["Prot\u00e9g\u00e9 par mot de passe"],"The file URL has been copied to your clipboard":["L\u2019URL du fichier a \u00e9t\u00e9 copi\u00e9e dans votre presse-papier"],"Could not set that as the thumbnail image. Try a different attachment.":["Impossible de s\u2019en servir comme miniature. Essayez un autre fichier joint."],"The changes you made will be lost if you navigate away from this page.":["Les modifications que vous avez faites seront perdues si vous changez de page."],"Update":["Mettre \u00e0 jour"],"Public":["Publique"],"Private":["Priv\u00e9e"],"OK":["OK"],"Save Draft":["Enregistrer le brouillon"],"Cancel":["Annuler"],"Publish":["Publier"],"Published":["Publi\u00e9"]}},"comment":{"reference":"wp-admin\/js\/post.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Are you sure you want to do this?\nThe comment changes you made will be lost.":["Voulez-vous vraiment faire cela\u00a0?\nLes modifications apport\u00e9es au commentaire seront perdues."],"Are you sure you want to edit this comment?\nThe changes you made will be lost.":["Confirmez-vous la modification de ce commentaire\u00a0?\nLes modifications que vous y avez apport\u00e9es seront perdues."],"Approve and Reply":["Approuver et r\u00e9pondre"],"Comments (%s)":["Commentaires (%s)"],"Reply":["R\u00e9pondre"],"Comments":["Commentaires"]}},"comment":{"reference":"wp-admin\/js\/edit-comments.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Preference activated - %s":["Pr\u00e9f\u00e9rence activ\u00e9e - %s"],"Preference deactivated - %s":["Pr\u00e9f\u00e9rence d\u00e9sactiv\u00e9e - %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/preferences.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Text direction":["Direction du texte"],"A valid language attribute, like \"en\" or \"fr\".":["Un attribut de langue valide, comme \u00ab\u00a0en\u00a0\u00bb ou \u00ab\u00a0fr\u00a0\u00bb."],"Clear Unknown Formatting":["Effacer le formatage inconnu"],"Create page: <mark>%s<\/mark>":["Cr\u00e9er une page\u00a0: <mark>%s<\/mark>"],"Highlight":["Mettre en \u00e9vidence"],"Keyboard input":["Saisie au clavier"],"Inline code":["Code en ligne"],"Link edited.":["Lien modifi\u00e9."],"Link removed.":["Lien retir\u00e9."],"Inline image":["Image en ligne"],"media":["m\u00e9dia"],"photo":["photo"],"Warning: the link has been inserted but may have errors. Please test it.":["Attention\u00a0: le lien a bien \u00e9t\u00e9 ins\u00e9r\u00e9 mais peut contenir des erreurs. Veuillez le tester."],"Link inserted.":["Lien ins\u00e9r\u00e9."],"Left to right":["De gauche \u00e0 droite"],"Right to left":["De droite \u00e0 gauche"],"Link":["Lien"],"Background":["Arri\u00e8re-plan"],"Superscript":["Exposant"],"Subscript":["Indice"],"Unlink":["Supprimer le lien"],"Strikethrough":["Barrer"],"Underline":["Souligner"],"Italic":["Italique"],"Bold":["Gras"],"Language":["Langue"],"Text":["Texte"],"Width":["Largeur"],"Apply":["Appliquer"]}},"comment":{"reference":"wp-includes\/js\/dist\/format-library.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Create a classic widget layout with a title that\u2019s styled by your theme for your widget areas.":["Cr\u00e9ez une mise en page de widget classique avec un titre mis en forme par votre th\u00e8me pour vos zones de widgets."],"Widget Group":["Groupe de widget"],"The \"%s\" block was affected by errors and may not function properly. Check the developer tools for more details.":["Le bloc \u00ab\u00a0%s\u00a0\u00bb a \u00e9t\u00e9 affect\u00e9 par des erreurs et peut ne pas fonctionner correctement. V\u00e9rifiez les outils de d\u00e9veloppement pour obtenir plus de d\u00e9tails."],"Move to widget area":["D\u00e9placer vers la zone des widgets"],"Widget is missing.":["Widget manquant."],"No preview available.":["Aucun aper\u00e7u disponible."],"Legacy Widget Preview":["Aper\u00e7u de l\u2019ancien widget"],"Select widget":["S\u00e9lectionner le widget"],"Convert to blocks":["Convertir en blocs"],"Move to":["D\u00e9placer vers"],"Legacy Widget":["Ancien widget"],"Select a legacy widget to display:":["S\u00e9lectionner un ancien widget pour l\u2019afficher\u00a0:"],"There are no widgets available.":["Il n\u2019y a aucun widget disponible."],"Save":["Enregistrer"],"Title":["Titre"]}},"comment":{"reference":"wp-includes\/js\/dist\/widgets.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"The file URL has been copied to your clipboard":["L\u2019URL du fichier a \u00e9t\u00e9 copi\u00e9e dans votre presse-papier"],"An error has occurred. Please reload the page and try again.":["Une erreur est survenue. Veuillez recharger la page et r\u00e9essayer."]}},"comment":{"reference":"wp-admin\/js\/media.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Plugin details":["D\u00e9tails de l\u2019extension"],"Plugin: %s":["Extension\u00a0: %s"]}},"comment":{"reference":"wp-admin\/js\/plugin-install.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%1$s is deprecated since version %2$s with no alternative available.":["%1$s est obsol\u00e8te depuis la version %2$s, aucune alternative n\u2019est disponible."],"%1$s is deprecated since version %2$s! Use %3$s instead.":["%1$s est obsol\u00e8te depuis la version %2$s\u00a0! Utilisez %3$s \u00e0 la place."],"Expand Main menu":["D\u00e9plier le menu principal"],"Dismiss this notice.":["Ignorer cette notification."],"You are about to permanently delete these items from your site.\nThis action cannot be undone.\n'Cancel' to stop, 'OK' to delete.":["Vous \u00eates en train de supprimer d\u00e9finitivement ces \u00e9l\u00e9ments de votre site.\nCette action ne peut pas \u00eatre annul\u00e9e.\n\u00ab\u00a0Annuler\u00a0\u00bb pour arr\u00eater, \u00ab\u00a0OK\u00a0\u00bb pour supprimer."],"Collapse Main menu":["Replier le menu principal"]}},"comment":{"reference":"wp-admin\/js\/common.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Something went wrong.":["Une mauvaise manipulation\u00a0?"],"Sorry, you are not allowed to do that.":["D\u00e9sol\u00e9, vous n\u2019avez pas l\u2019autorisation de faire cela."]}},"comment":{"reference":"wp-admin\/js\/tags.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Hide":["Masquer"],"Show":["Afficher"],"Hide password":["Cacher le mot de passe"],"Show password":["Afficher le mot de passe"]}},"comment":{"reference":"wp-admin\/js\/password-toggle.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Term selected.":["Terme s\u00e9lectionn\u00e9."],"tag delimiter\u0004,":[", "]}},"comment":{"reference":"wp-admin\/js\/tags-suggest.js"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Showing %1$s of %2$s media items":["Affichage de %1$s m\u00e9dias sur %2$s"],"Jump to first loaded item":["Aller au premier \u00e9l\u00e9ment charg\u00e9"],"Load more":["Charger la suite"],"Number of media items displayed: %d. Click load more for more results.":["Nombre de m\u00e9dias affich\u00e9s\u00a0: %d. Cliquer sur \u00ab\u00a0en afficher plus\u00a0\u00bb pour charger plus de r\u00e9sultats."],"The file URL has been copied to your clipboard":["L\u2019URL du fichier a \u00e9t\u00e9 copi\u00e9e dans votre presse-papier"],"%s item selected":["%s \u00e9l\u00e9ment s\u00e9lectionn\u00e9","%s \u00e9l\u00e9ments s\u00e9lectionn\u00e9s"],"Number of media items displayed: %d. Scroll the page for more results.":["Nombre d\u2019\u00e9l\u00e9ments m\u00e9dia affich\u00e9s\u00a0: %d. Fa\u00eetes d\u00e9filer la page pour plus de r\u00e9sultats."]}},"comment":{"reference":"wp-includes\/js\/media-views.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Your new password has not been saved.":["Votre nouveau mot de passe n\u2019a pas \u00e9t\u00e9 enregistr\u00e9."],"Hide":["Masquer"],"Show":["Afficher"],"Confirm use of weak password":["Confirmer l\u2019utilisation du mot de passe faible"],"Hide password":["Cacher le mot de passe"],"Show password":["Afficher le mot de passe"]}},"comment":{"reference":"wp-admin\/js\/user-profile.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"There is %s error which must be fixed before you can update this file.":["Il y a %s erreur qui doit \u00eatre corrig\u00e9e avant que vous puissiez mettre \u00e0 jour ce fichier.","Il y a %s erreurs qui doivent \u00eatre corrig\u00e9es avant que vous puissiez mettre \u00e0 jour ce fichier."],"Something went wrong. Your change may not have been saved. Please try again. There is also a chance that you may need to manually fix and upload the file over FTP.":["Quelque chose a mal tourn\u00e9. Votre modification n\u2019a peut-\u00eatre pas \u00e9t\u00e9 enregistr\u00e9e. Veuillez r\u00e9essayer. Il est \u00e9galement possible que vous deviez corriger manuellement et t\u00e9l\u00e9verser le fichier par FTP."],"The changes you made will be lost if you navigate away from this page.":["Les modifications que vous avez faites seront perdues si vous changez de page."]}},"comment":{"reference":"wp-admin\/js\/theme-plugin-editor.js"}}

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Your session has expired. You can log in again from this page or go to the login page.":["Votre session a expir\u00e9. Vous pouvez vous reconnecter depuis cette page ou aller \u00e0 la page de connexion."]}},"comment":{"reference":"wp-includes\/js\/wp-auth-check.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Get started here":["Premiers pas ici"],"Interested in creating your own block?":["Int\u00e9ress\u00e9\u00b7e pour cr\u00e9er votre propre bloc\u00a0?"],"Select a block to install and add it to your post.":["S\u00e9lectionnez un bloc \u00e0 installer et ajoutez-le \u00e0 votre publication."],"Available to install":["Disponible(s) pour l\u2019installation"],"No results available from your installed blocks.":["Aucun r\u00e9sultat disponible \u00e0 partir de vos blocs install\u00e9s."],"%d additional block is available to install.":["%d bloc suppl\u00e9mentaire est disponible pour l\u2019installation.","%d blocs suppl\u00e9mentaires sont disponibles pour l\u2019installation."],"Blocks available for install":["Blocs disponibles pour l\u2019installation"],"Install block":["Installer un bloc"],"%1$s <span>by %2$s<\/span>":["%1$s <span>par %2$s<\/span>"],"Installing\u2026":["Installation\u2026"],"Install %1$s. %2$s stars with %3$s review.":["Installer %1$s. %2$s \u00e9toile et %3$s avis.","Installer %1$s. %2$s \u00e9toiles et %3$s avis."],"Try reloading the page.":["Essayez de recharger la page."],"Block %s installed and added.":["Bloc %s install\u00e9 et ajout\u00e9."],"Your site doesn\u2019t include support for the %s block. You can try installing the block, convert it to a Custom HTML block, or remove it entirely.":["Votre site ne prend pas en charge le bloc %s. Vous pouvez essayer de l\u2019installer, de le convertir en bloc de HTML personnalis\u00e9 ou de le retirer compl\u00e8tement."],"Your site doesn\u2019t include support for the %s block. You can try installing the block or remove it entirely.":["Votre site ne prend pas en charge le bloc \u00ab\u00a0%s\u00a0\u00bb. Vous pouvez essayer de l\u2019installer ou de le retirer compl\u00e8tement."],"The following block has been added to your site.":["Le bloc suivant a \u00e9t\u00e9 ajout\u00e9 \u00e0 votre site.","Les blocs suivants ont \u00e9t\u00e9 ajout\u00e9s \u00e0 votre site."],"Added: %d block":["Ajout\u00e9\u00a0: %d bloc","Ajout\u00e9s\u00a0: %d blocs"],"Error installing block. You can reload the page and try again.":["Erreur lors de l\u2019installation du bloc. Vous pouvez recharger la page et r\u00e9essayer."],"This block is already installed. Try reloading the page.":["Ce bloc est d\u00e9j\u00e0 install\u00e9. Essayez de recharger la page."],"An error occurred.":["Une erreur s\u2019est produite."],"Error registering block. Try reloading the page.":["Erreur lors de l\u2019enregistrement du bloc. Essayez de recharger la page."],"%s out of 5 stars":["%s sur 5 \u00e9toiles"],"Keep as HTML":["Conserver en HTML"],"Install %s":["Installer %s"],"Installed!":["Install\u00e9\u00a0!"],"No results found.":["Aucun r\u00e9sultat."],"By %s":["Par %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/block-directory.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"All selected items have been removed. Select new items to use Bulk Actions.":["Tous les \u00e9l\u00e9ments s\u00e9lectionn\u00e9s ont \u00e9t\u00e9 supprim\u00e9s. S\u00e9lectionnez de nouveaux \u00e9l\u00e9ments pour utiliser les actions group\u00e9es."],"Remove &#8220;%s&#8221; from Bulk Edit":["Retirer \u00ab\u00a0%s\u00a0\u00bb de l\u2019action group\u00e9e"],"Error while saving the changes.":["Erreur lors de la sauvegarde des modifications."],"Changes saved.":["Modifications enregistr\u00e9es."],"Item removed.":["\u00c9l\u00e9ment retir\u00e9."],"tag delimiter\u0004,":[", "],"(no title)":["(pas de titre)"]}},"comment":{"reference":"wp-admin\/js\/inline-edit-post.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Clear color":["Effacer la couleur"],"Select default color":["S\u00e9lectionner la couleur par d\u00e9faut"],"Color value":["Valeur de couleur"],"Select Color":["S\u00e9lectionner une couleur"],"Clear":["Effacer"],"Default":["Valeur par d\u00e9faut"]}},"comment":{"reference":"wp-admin\/js\/color-picker.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Term added.":["Terme ajout\u00e9."],"Term removed.":["Terme retir\u00e9."],"Remove term:":["Retirer un terme\u00a0:"],"tag delimiter\u0004,":[", "]}},"comment":{"reference":"wp-admin\/js\/tags-box.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Tilde":["Tilde"],"Backtick":["Retour arri\u00e8re"],"Period":["P\u00e9riode"],"Comma":["Virgule"]}},"comment":{"reference":"wp-includes\/js\/dist\/keycodes.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"You are about to permanently delete this menu.\n'Cancel' to stop, 'OK' to delete.":["Vous \u00eates sur le point de supprimer d\u00e9finitivement ce menu.\nCliquez sur \u00ab\u00a0Annuler\u00a0\u00bb pour abandonner, \u00ab\u00a0OK\u00a0\u00bb pour le supprimer."],"missing menu item navigation label\u0004(no label)":["(sans libell\u00e9)"],"The changes you made will be lost if you navigate away from this page.":["Les modifications que vous avez faites seront perdues si vous changez de page."],"No results found.":["Aucun r\u00e9sultat."]}},"comment":{"reference":"wp-admin\/js\/nav-menu.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Your new password for %s is:":["Votre nouveau mot de passe pour %s est\u00a0:"],"Be sure to save this in a safe location. You will not be able to retrieve it.":["Assurez-vous de le conserver en lieu s\u00fbr. Vous ne pourrez pas le r\u00e9cup\u00e9rer."]}},"comment":{"reference":"wp-admin\/js\/auth-app.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"text direction\u0004ltr":["ltr"]}},"comment":{"reference":"wp-includes\/js\/dist\/i18n.js"}}

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Dismiss":["Ignorer"]}},"comment":{"reference":"wp-includes\/js\/wp-pointer.js"}}

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Error while saving the changes.":["Erreur lors de la sauvegarde des modifications."],"Changes saved.":["Modifications enregistr\u00e9es."]}},"comment":{"reference":"wp-admin\/js\/inline-edit-tax.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%s: Sorry, you are not allowed to upload this file type.":["D\u00e9sol\u00e9, vous n\u2019avez pas l\u2019autorisation de t\u00e9l\u00e9verser ce type de fichier."],"Select or Upload Media":["S\u00e9lectionnez ou t\u00e9l\u00e9versez un fichier"],"Error while uploading file %s to the media library.":["Erreur lors du t\u00e9l\u00e9versement du fichier %s dans la m\u00e9diath\u00e8que."],"%s: This file is empty.":["%s\u00a0: ce fichier est vide."],"%s: Sorry, this file type is not supported here.":["%s\u00a0: d\u00e9sol\u00e9, ce type de fichier n\u2019est pas pris en charge ici."],"%s: This file exceeds the maximum upload size for this site.":["%s\u00a0: ce fichier d\u00e9passe la taille maximum de t\u00e9l\u00e9versement pour ce site."]}},"comment":{"reference":"wp-includes\/js\/dist\/media-utils.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Block rendered as empty.":["Bloc devenu vide."],"Error loading block: %s":["Erreur de chargement du bloc\u00a0: %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/server-side-render.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:18:24+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Attend an upcoming event near you.":["Assistez au prochain \u00e9v\u00e9nement pr\u00e8s de chez vous."],"Events widget offset prefix\u0004GMT":["GMT"],"%1$s %2$d \u2013 %3$s %4$d, %5$d":["%1$s %2$d \u2013 %3$s %4$d, %5$d"],"upcoming events year format\u0004Y":["Y"],"upcoming events day format\u0004j":["j"],"%1$s %2$d\u2013%3$d, %4$d":["%1$s %2$d\u2013%3$d, %4$d"],"upcoming events month format\u0004F":["F"],"City updated. Listing events near %s.":["Ville mise \u00e0 jour. Affichage des \u00e9v\u00e8nements pr\u00e8s de %s."],"We couldn\u2019t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland.":["Nous ne localisons pas %s. Veuillez essayer une autre ville proche. Par exemple\u00a0: Lille, Bordeaux ou Grenoble."],"An error occurred. Please try again.":["Une erreur est survenue. Veuillez essayer \u00e0 nouveau."],"Enter your closest city to find nearby events.":["Saisissez une ville proche de chez vous pour trouver un \u00e9v\u00e8nement."],"l, M j, Y":["l j M Y"]}},"comment":{"reference":"wp-admin\/js\/dashboard.js"}}

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Could not set that as the thumbnail image. Try a different attachment.":["Impossible de s\u2019en servir comme miniature. Essayez un autre fichier joint."]}},"comment":{"reference":"wp-includes\/js\/media-editor.js"}}

View file

@ -1 +0,0 @@
{"translation-revision-date":"2023-10-12 12:16:45+0000","generator":"GlotPress\/4.0.0-alpha.9","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Open library":["Ouvrir la biblioth\u00e8que"],"Open templates":["Ouvrir les mod\u00e8les"],"Open style variations":["Ouvrir les variations de style"],"Open pages":["Ouvrir les pages"],"Open navigation":["Ouvrir la navigation"],"Manage all of my patterns":["G\u00e9rer toutes mes compositions"],"Add new post":["Ajouter un article"],"Add new page":["Ajouter une page"],"(no title)":["(pas de titre)"]}},"comment":{"reference":"wp-includes\/js\/dist\/core-commands.js"}}

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -1,2 +0,0 @@
<?php
require_once WPMU_PLUGIN_DIR . '/uwil-faq/index.php';

View file

@ -1,238 +0,0 @@
<?php
/*
Plugin Name: UWIL FAQ
Description: Plugin to manage topics, questions and responses
Version: 1.0
Author: UWIL
*/
require_once __DIR__ . '/utils.php';
/**
* Add foreign key constraints (dbDelta doesn't handle them).
*
* @return void
*/
function uwil_add_foreign_keys(): void
{
global $wpdb;
$constraints = [
[
'table' => 'uwil_questions',
'name' => 'fk_questions_topic',
'sql' => "ALTER TABLE uwil_questions
ADD CONSTRAINT fk_questions_topic
FOREIGN KEY (topic_id) REFERENCES uwil_topics(id)
ON DELETE CASCADE",
],
];
foreach ($constraints as $constraint) {
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = %s
AND TABLE_NAME = %s
AND CONSTRAINT_NAME = %s",
DB_NAME,
$constraint['table'],
$constraint['name']
));
if (!$exists) {
$wpdb->query($constraint['sql']);
}
}
}
/**
* Create tables.
*
* @return void
*/
function uwil_faq_create_tables(): void
{
global $wpdb;
$charset = $wpdb->get_charset_collate();
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta("CREATE TABLE uwil_topics (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
`order` INT NOT NULL DEFAULT 0
) $charset;");
dbDelta("CREATE TABLE uwil_questions (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
topic_id BIGINT UNSIGNED NOT NULL,
title VARCHAR(255) NOT NULL,
contenu TEXT NOT NULL,
`order` INT NOT NULL DEFAULT 0,
KEY topic_id (topic_id)
) $charset;");
uwil_add_foreign_keys();
}
add_action('admin_init', function () {
global $wpdb;
$tables = ['uwil_topics', 'uwil_questions', 'uwil_responses'];
foreach ($tables as $table) {
if ($wpdb->get_var("SHOW TABLES LIKE '$table'") !== $table) {
uwil_faq_create_tables();
break;
}
}
});
/**
* Add button plugin in the admin.
*
* @return void
*/
function plugin_menu(): void
{
add_menu_page(
'UWIL FAQ',
'UWIL FAQ',
'edit_pages',
'uwil-faq-topics',
'renderTopics',
'dashicons-editor-help',
);
add_submenu_page(
'uwil-faq-topics',
'Thématiques',
'Thématiques',
'edit_pages',
'uwil-faq-topics',
'renderTopics',
);
add_submenu_page(
'uwil-faq-topics',
'Questions/Réponses',
'Questions/Réponses',
'edit_pages',
'uwil-faq-questions',
'renderQuestions',
);
}
add_action('admin_menu', 'plugin_menu');
/**
* Add style resource.
*
* @return void
*/
function custom_style(): void
{
wp_register_style('uwil-faq', WPMU_PLUGIN_URL . '/uwil-faq/style.css');
wp_enqueue_style('uwil-faq');
}
add_action('admin_init', 'custom_style');
/** LIMITS */
define('UWIL_MIN_TOPIC', 3);
define('UWIL_MAX_TOPIC', 6);
define('UWIL_MIN_QUESTIONS_PER_TOPIC', 3);
define('UWIL_MAX_QUESTIONS_PER_TOPIC', 8);
/**
* Render FAQ topics page.
*
* @return void
*/
function renderTopics(): void
{
global $wpdb;
uwil_render_crud([
'table' => 'uwil_topics',
'title' => 'Thématiques',
'min_total' => UWIL_MIN_TOPIC,
'max_total' => UWIL_MAX_TOPIC,
'fields' => [
[
'name' => 'title',
'label' => 'Titre',
'type' => 'text',
],
],
'columns' => [
[
'label' => 'Titre',
'field' => 'title',
],
[
'label' => 'Questions',
'field' => 'id',
'render' => function ($item) use ($wpdb) {
$count = (int) $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM uwil_questions WHERE topic_id = %d",
$item->id
));
$class = ($count < UWIL_MIN_QUESTIONS_PER_TOPIC || $count > UWIL_MAX_QUESTIONS_PER_TOPIC) ? 'uwil-count-warning' : 'uwil-count-ok';
return '<span class="' . $class . '">' . $count . ' / ' . UWIL_MAX_QUESTIONS_PER_TOPIC . '</span>';
},
],
],
]);
}
/**
* Render FAQ questions page.
*
* @return void
*/
function renderQuestions(): void
{
global $wpdb;
uwil_render_crud([
'table' => 'uwil_questions',
'title' => 'Questions',
'parent_key' => 'topic_id',
'min_per_parent' => UWIL_MIN_QUESTIONS_PER_TOPIC,
'max_per_parent' => UWIL_MAX_QUESTIONS_PER_TOPIC,
'filter' => [
'key' => 'topic_id',
'label' => 'Filtrer par thématique',
'options' => fn() => $wpdb->get_results("SELECT id, title FROM uwil_topics ORDER BY `order`"),
],
'fields' => [
[
'name' => 'topic_id',
'label' => 'Thématique',
'type' => 'select',
'options' => fn() => $wpdb->get_results("SELECT id, title FROM uwil_topics ORDER BY `order`"),
],
[
'name' => 'title',
'label' => 'Question',
'type' => 'text',
],
[
'name' => 'contenu',
'label' => 'Réponse',
'type' => 'wysiwyg',
],
],
'columns' => [
[
'label' => 'Thématique',
'field' => 'topic_id',
'render' => function ($item) use ($wpdb) {
return esc_html($wpdb->get_var($wpdb->prepare(
"SELECT title FROM uwil_topics WHERE id = %d",
$item->topic_id
)));
},
],
[
'label' => 'Question',
'field' => 'title',
],
[
'label' => 'Réponse',
'field' => 'contenu',
],
],
]);
}

View file

@ -1,131 +0,0 @@
:root {
--faq-spacing: 15px;
}
.uwil-faq {
width: calc(100% - 20px);
padding-right: 20px;
padding-left: 0;
margin-right: auto;
margin-left: auto;
}
.uwil-faq-title {
padding-bottom: 0px !important;
margin-bottom: var(--faq-spacing) !important;
}
.uwil-faq-cards {
display: flex;
gap: var(--faq-spacing);
flex-wrap: wrap;
}
.uwil-faq-card {
background: #fff;
border: 1px solid #c3c4c7;
padding: 24px;
text-align: center;
min-width: 180px;
flex: 1;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}
.uwil-faq-card-count {
font-size: 32px;
font-weight: 600;
margin: var(--faq-spacing) 0;
}
.uwil-faq-card-label {
color: #646970;
margin-bottom: var(--faq-spacing);
}
.uwil-faq-content {
display: flex;
flex-direction: column;
justify-content: start;
align-items: start;
gap: var(--faq-spacing);
}
@media screen and (min-width: 1100px) {
.uwil-faq-content {
flex-direction: row;
}
}
.uwil-faq-list {
display: flex;
flex-direction: column;
justify-content: start;
align-items: stretch;
width: 100%;
gap: var(--faq-spacing);
}
.uwil-faq-form {
padding-bottom: var(--faq-spacing);
border-bottom: 1px solid #c3c4c7;
display: flex;
flex-direction: column;
justify-content: start;
align-items: stretch;
gap: var(--faq-spacing);
width: 100%;
}
.uwil-faq-form select {
max-width: 100%;
}
@media screen and (min-width: 1100px) {
.uwil-faq-form {
padding-bottom: 0px;
padding-right: var(--faq-spacing);
border-bottom: 0;
border-right: 1px solid #c3c4c7;
width: fit-content;
}
.uwil-faq-form > * {
width: 25rem;
}
}
.uwil-faq-field {
display: flex;
flex-direction: column;
justify-content: center;
align-items: stretch;
gap: 2px;
}
.uwil-faq-actions {
width: 100%;
display: flex;
justify-content: center;
align-items: stretch;
gap: var(--faq-spacing);
}
.uwil-faq-actions > * {
width: inherit;
margin: 0 !important;
text-align: center;
}
.uwil-count-ok {
color: #00a32a;
font-weight: 600;
}
.uwil-count-warning {
color: #d63638;
font-weight: 600;
}
.uwil-faq-border-0 {
border: 0 !important;
}

View file

@ -1,285 +0,0 @@
<?php
/**
* CRUD order.
*
* @param string $table Name of the table.
* @param integer $id Target id to move.
* @param string $direction Direction to move target element.
* @param string|null $parent_key Relation parent key.
* @return void
*/
function uwil_move_item(string $table, int $id, string $direction, ?string $parent_key = null): void
{
global $wpdb;
$current = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE id = %d", $id));
if (!$current) return;
$operator = $direction === 'up' ? '<' : '>';
$order = $direction === 'up' ? 'DESC' : 'ASC';
$where = "`order` $operator %d";
$params = [$current->order];
if ($parent_key) {
$where .= " AND $parent_key = %d";
$params[] = $current->{$parent_key};
}
$neighbor = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $table WHERE $where ORDER BY `order` $order LIMIT 1",
...$params
));
if ($neighbor) {
$wpdb->update($table, ['order' => $neighbor->order], ['id' => $current->id]);
$wpdb->update($table, ['order' => $current->order], ['id' => $neighbor->id]);
}
}
/**
* CRUD generic.
*
* @param array $config {
* string table Name of the table.
* string title Title of the page.
* array fields List of fields in formulary.
* array columns Columns to display in the table.
* string parent_key Name of the relationship column (optionnal).
* }
*/
function uwil_render_crud(array $config): void
{
global $wpdb;
$table = $config['table'];
$parent_key = $config['parent_key'] ?? null;
$min_per_parent = $config['min_per_parent'] ?? null;
$max_per_parent = $config['max_per_parent'] ?? null;
$min_total = $config['min_total'] ?? null;
$max_total = $config['max_total'] ?? null;
$filter = $config['filter'] ?? null;
// Delete action.
if (isset($_GET['delete']) && check_admin_referer('uwil_delete_' . $_GET['delete'])) {
$id = (int) $_GET['delete'];
$item = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE id = %d", $id));
$can_delete = true;
if ($item && $parent_key && $min_per_parent !== null) {
$count = (int) $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table WHERE $parent_key = %d",
$item->{$parent_key}
));
if ($count <= $min_per_parent) {
$can_delete = false;
echo '<div class="error"><p>Suppression impossible : minimum de ' . esc_html($min_per_parent) . ' élément(s) requis.</p></div>';
}
}
if ($can_delete && $item && $min_total !== null) {
$count = (int) $wpdb->get_var("SELECT COUNT(*) FROM $table");
if ($count <= $min_total) {
$can_delete = false;
echo '<div class="error"><p>Suppression impossible : minimum de ' . esc_html($min_total) . ' élément(s) requis au total.</p></div>';
}
}
if ($can_delete) {
$wpdb->delete($table, ['id' => $id]);
echo '<div class="updated"><p>Élément supprimé.</p></div>';
}
}
// Add/modification.
if (isset($_POST['uwil_submit']) && check_admin_referer('uwil_form_' . $config['table'])) {
$data = [];
foreach ($config['fields'] as $field) {
$value = wp_unslash($_POST[$field['name']] ?? '');
$data[$field['name']] = $field['type'] === 'wysiwyg'
? wp_kses_post($value)
: sanitize_text_field($value);
}
$is_new = empty($_POST['id']);
$can_save = true;
// Check max per parent before save.
if ($is_new && $parent_key && $max_per_parent !== null && !empty($data[$parent_key])) {
$count = (int) $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table WHERE $parent_key = %d",
$data[$parent_key]
));
if ($count >= $max_per_parent) {
$can_save = false;
echo '<div class="error"><p>Ajout impossible : maximum de ' . esc_html($max_per_parent) . ' élément(s) atteint pour ce parent.</p></div>';
}
}
// Check max total before save.
if ($can_save && $is_new && $max_total !== null) {
$count = (int) $wpdb->get_var("SELECT COUNT(*) FROM $table");
if ($count >= $max_total) {
$can_save = false;
echo '<div class="error"><p>Ajout impossible : maximum de ' . esc_html($max_total) . ' élément(s) atteint au total.</p></div>';
}
}
if ($can_save) {
if (!$is_new) {
$wpdb->update($table, $data, ['id' => (int) $_POST['id']]);
echo '<div class="updated"><p>Élément modifié.</p></div>';
} else {
$where = '';
if ($parent_key && !empty($data[$parent_key])) {
$where = $wpdb->prepare(" WHERE $parent_key = %d", $data[$parent_key]);
}
$max_order = (int) $wpdb->get_var("SELECT MAX(`order`) FROM $table$where");
$data['order'] = $max_order + 1;
$wpdb->insert($table, $data);
echo '<div class="updated"><p>Élément ajouté.</p></div>';
}
}
}
// Order action.
if (isset($_GET['move'], $_GET['id']) && check_admin_referer('uwil_move_' . $_GET['id'])) {
uwil_move_item($table, (int) $_GET['id'], $_GET['move'], $parent_key);
}
// Edit action.
$edit_item = null;
if (isset($_GET['edit'])) {
$edit_item = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE id = %d", (int) $_GET['edit']));
}
// Filter action.
$filter_value = null;
if ($filter && isset($_GET[$filter['key']]) && $_GET[$filter['key']] !== '') {
$filter_value = (int) $_GET[$filter['key']];
}
// List and order.
$order_by = $parent_key ? "$parent_key ASC, `order` ASC" : "`order` ASC";
if ($filter_value) {
$items = $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table WHERE {$filter['key']} = %d ORDER BY $order_by",
$filter_value
));
} else {
$items = $wpdb->get_results("SELECT * FROM $table ORDER BY $order_by");
}
?>
<div class="wrap uwil-faq">
<h1 class="uwil-faq-title"><?= esc_html($config['title']) ?></h1>
<div class="uwil-faq-content">
<!-- Formulary -->
<form class="uwil-faq-form" method="post">
<?php wp_nonce_field('uwil_form_' . $config['table']); ?>
<input type="hidden" name="id" value="<?= esc_attr($edit_item->id ?? '') ?>">
<?php foreach ($config['fields'] as $field): ?>
<?php
$value = $edit_item->{$field['name']} ?? '';
$field_id = 'uwil_field_' . $field['name'];
?>
<?php if ($field['type'] === 'select'): ?>
<div class="uwil-faq-field">
<label for="<?= esc_attr($field_id) ?>"><?= esc_html($field['label']) ?></label>
<select id="<?= esc_attr($field_id) ?>" name="<?= esc_attr($field['name']) ?>" required>
<option value="" selected disabled>Sélectionner une valeur</option>
<?php foreach ($field['options']() as $opt): ?>
<option value="<?= esc_attr($opt->id) ?>" <?= selected($value, $opt->id, false) ?>>
<?= esc_html($opt->title) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<?php elseif ($field['type'] === 'wysiwyg'): ?>
<div class="uwil-faq-field">
<label for="<?= esc_attr($field_id) ?>"><?= esc_attr($field['label']) ?></label>
<?php
wp_editor($value, esc_attr($field_id), [
'textarea_name' => $field['name'],
'teeny' => true,
'media_buttons' => false,
'textarea_rows' => 6,
'quicktags' => false,
'tinymce' => [
'toolbar1' => 'bold,italic,underline,link,unlink',
'toolbar2' => '',
],
]);
?>
</div>
<?php else: ?>
<div class="uwil-faq-field">
<label for="<?= esc_attr($field_id) ?>"><?= esc_attr($field['label']) ?></label>
<input id="<?= esc_attr($field_id) ?>" type="text" name="<?= esc_attr($field['name']) ?>" value="<?= esc_attr($value) ?>" required>
</div>
<?php endif; ?>
<?php endforeach; ?>
<div class="uwil-faq-actions">
<?php if ($edit_item): ?>
<a href="<?= esc_url(remove_query_arg('edit')) ?>" class="button button-secondary">
Annuler
</a>
<?php endif; ?>
<button type="submit" name="uwil_submit" class="button button-primary">
<?= $edit_item ? 'Modifier' : 'Ajouter' ?>
</button>
</div>
</form>
<div class="uwil-faq-list">
<!-- Filter -->
<?php if ($filter): ?>
<form method="get" class="uwil-faq-form uwil-faq-border-0">
<input type="hidden" name="page" value="<?= esc_attr($_GET['page']) ?>">
<div class="uwil-faq-field">
<label for="uwil_filter_<?= esc_attr($filter['key']) ?>"><?= esc_html($filter['label']) ?></label>
<select id="uwil_filter_<?= esc_attr($filter['key']) ?>" name="<?= esc_attr($filter['key']) ?>" onchange="this.form.submit()">
<option value="">Toutes les thématiques</option>
<?php foreach ($filter['options']() as $opt): ?>
<option value="<?= esc_attr($opt->id) ?>" <?= selected($filter_value, $opt->id, false) ?>>
<?= esc_html($opt->title) ?>
</option>
<?php endforeach; ?>
</select>
</div>
</form>
<?php endif; ?>
<!-- Listing elements -->
<table class="widefat">
<thead>
<tr>
<?php foreach ($config['columns'] as $col): ?>
<th><?= esc_html($col['label']) ?></th>
<?php endforeach; ?>
<th>Ordre</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php foreach ($items as $item): ?>
<tr>
<?php foreach ($config['columns'] as $col): ?>
<td><?= isset($col['render']) ? $col['render']($item) : esc_html($item->{$col['field']}) ?></td>
<?php endforeach; ?>
<td><?= esc_html($item->order) ?></td>
<td>
<a href="<?= wp_nonce_url(add_query_arg(['move' => 'up', 'id' => $item->id]), 'uwil_move_' . $item->id) ?>">▲</a>
<a href="<?= wp_nonce_url(add_query_arg(['move' => 'down', 'id' => $item->id]), 'uwil_move_' . $item->id) ?>">▼</a> |
<a href="<?= add_query_arg(['edit' => $item->id]) ?>">Éditer</a> |
<a href="<?= wp_nonce_url(add_query_arg(['delete' => $item->id]), 'uwil_delete_' . $item->id) ?>" onclick="return confirm('Supprimer cet élément ?');">Supprimer</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<?php
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

View file

@ -1,743 +0,0 @@
<!doctype html>
<html lang="und" dir="auto" xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<title>La Newsletter Janvier 2026</title><!--[if !mso]><!-->
<meta http-equiv="X-UA-Compatible" content="IE=edge"><!--<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#outlook a,
body {
padding: 0
}
body {
margin: 0;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%
}
table,
td {
border-collapse: collapse;
mso-table-lspace: 0;
mso-table-rspace: 0
}
img {
border: 0;
height: auto;
line-height: 100%;
outline: none;
text-decoration: none;
-ms-interpolation-mode: bicubic
}
p {
display: block;
margin: 13px 0
}
</style><!--[if mso]>
<noscript>
<xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
</noscript>
<![endif]--><!--[if lte mso 11]>
<style type="text/css">
.mj-outlook-group-fix { width:100% !important; }
</style>
<![endif]-->
<style type="text/css">
@media only screen and (min-width:480px) {
.mj-column-per-100 {
max-width: 100%;
width: 100% !important
}
.mj-column-per-33-333333333333336 {
max-width: 33.333333333333336%;
width: 33.333333333333336% !important
}
.mj-column-per-50 {
max-width: 50%;
width: 50% !important
}
}
</style>
<style media="screen and (min-width:480px)">
.moz-text-html .mj-column-per-100 {
max-width: 100%;
width: 100% !important
}
.moz-text-html .mj-column-per-33-333333333333336 {
max-width: 33.333333333333336%;
width: 33.333333333333336% !important
}
.moz-text-html .mj-column-per-50 {
max-width: 50%;
width: 50% !important
}
</style>
<style type="text/css">
@media only screen and (max-width:479px) {
table.mj-full-width-mobile {
width: 100% !important
}
td.mj-full-width-mobile {
width: auto !important
}
}
</style>
</head>
<body style="background-color:#fff;word-spacing:normal">
<div style="color:#fff;display:none;font-size:1px;line-height:1px;max-height:0;max-width:0;opacity:0;overflow:hidden">
La Newsletter Janvier 2026</div>
<div style="background-color:#fff" lang="und" dir="auto">
<div style="background:#fff;background-color:#fff;margin:0 auto;max-width:600px">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="background:#fff;background-color:#fff;width:100%">
<tbody>
<tr>
<td style="direction:ltr;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="right" class="nl-title"
style="font-size:0;padding:10px 40px 10px 25px;word-break:break-word">
<div
style="color:#024e2a;font-family:Barlow,Arial,sans-serif;font-size:24px;font-weight:700;line-height:1;text-align:right">
LA NEWSLETTER<br> <span
style="color:#00803a;font-family:Barlow,Arial,sans-serif;font-size:20px;font-weight:700">JANVIER
2026</span></div>
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:600px"> <a
href="https://www.reghalal.com/?mtm_campaign=newsletter_janvier_2026_reghalal&mtm_source=newsletter_mensuelle_reghalal&mtm_medium=newsletter"
target="_blank"> <img alt="Logo Réghalal et sa signature halal & engagés"
src="https://www.reghalal.com/newsletters/ref/header.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="600" height="auto"> </a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" bgcolor="#024e2a" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
<div style="background:#024e2a;background-color:#024e2a;margin:0 auto;max-width:600px">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="background:#024e2a;background-color:#024e2a;width:100%">
<tbody>
<tr>
<td style="direction:ltr;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:600px"> <img
alt="Visuel de plusieurs personnes autour d'une table en train de partager un moment de convivialité"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_cle.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="600" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:30px 25px 10px;word-break:break-word">
<div
style="color:#fdf5eb;font-family:Arial,sans-serif;font-size:42px;font-weight:700;line-height:1;text-align:center">
L'ÉQUIPE RÉGHALAL VOUS SOUHAITE SES MEILLEURS VOEUX !</div>
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:10px 25px 30px;word-break:break-word">
<div
style="color:#fff;font-family:Arial,sans-serif;font-size:20px;line-height:1.4;text-align:center">
Une nouvelle année commence, l’occasion de partager ensemble des moments remplis de
gourmandise <br> et de saveurs ! <br> C'est l'occasion parfaite pour parcourir nos recettes
<br> et trouver vos prochaines inspirations !
</div>
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:5px 25px 30px;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%">
<tbody>
<tr>
<td align="center" bgcolor="#00803a" role="presentation"
style="border:2px solid #fff;border-radius:6px;cursor:auto;mso-padding-alt:10px 16px;background:#00803a"
valign="middle"> <a
href="https://www.reghalal.com/recettes-halal/?mtm_campaign=newsletter_janvier_2026_reghalal&mtm_source=newsletter_mensuelle_reghalal&mtm_medium=newsletter"
style="background:#00803a;color:#fff;display:inline-block;font-family:Arial Narrow,Arial;font-size:17px;font-weight:400;line-height:120%;margin:0;padding:10px 16px;text-decoration:none;text-transform:uppercase;mso-padding-alt:0;border-radius:6px"
target="_blank"> JE DÉCOUVRE LES RECETTES </a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" bgcolor="#00803a" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
<div style="background:#00803a;background-color:#00803a;margin:0 auto;max-width:600px">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="background:#00803a;background-color:#00803a;width:100%">
<tbody>
<tr>
<td style="direction:rtl;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:middle;width:600px;" ><![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:middle;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tbody>
<tr>
<td style="padding-bottom:15px;padding-top:15px;vertical-align:middle">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:10px 25px 5px;word-break:break-word">
<div
style="color:#fff;font-family:Arial,sans-serif;font-size:24px;font-weight:700;line-height:1.2;text-align:center">
2026 S'ANNONCE PLEINE DE SURPRISES CHEZ RÉGHALAL !</div>
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:10px 25px;word-break:break-word">
<div
style="color:#fff;font-family:Arial,sans-serif;font-size:17px;line-height:1.15;text-align:center">
De nouvelles saveurs, des offres inédites, des produits qui vont vous régaler... et
bien plus encore. <br> Notre site et nos réseaux sociaux évolueront pour vous offrir
toujours plus d’inspiration et de gourmandise. <br> Restez connectés, l’aventure
continue... et elle promet d’être savoureuse !</div>
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:5px 25px 10px;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%">
<tbody>
<tr>
<td align="center" bgcolor="#024e2a" role="presentation"
style="border:2px solid #fff;border-radius:6px;cursor:auto;mso-padding-alt:10px 16px;background:#024e2a"
valign="middle"> <a
href="https://www.reghalal.com/?mtm_campaign=newsletter_janvier_2026_reghalal&mtm_source=newsletter_mensuelle_reghalal&mtm_medium=newsletter"
style="background:#024e2a;color:#fff;display:inline-block;font-family:Arial Narrow,Arial;font-size:17px;font-weight:400;line-height:120%;margin:0;padding:10px 16px;text-decoration:none;text-transform:uppercase;mso-padding-alt:0;border-radius:6px"
target="_blank"> JE DÉCOUVRE LE SITE </a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" bgcolor="#024e2a" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
<div style="background:#024e2a;background-color:#024e2a;margin:0 auto;max-width:600px">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="background:#024e2a;background-color:#024e2a;width:100%">
<tbody>
<tr>
<td style="direction:rtl;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:middle;width:600px;" ><![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:middle;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tbody>
<tr>
<td style="padding-bottom:15px;padding-top:15px;vertical-align:middle">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:10px 25px 5px;word-break:break-word">
<div
style="color:#fff;font-family:Arial,sans-serif;font-size:24px;font-weight:700;line-height:1.2;text-align:center">
AU REVOIR 2025</div>
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:10px 25px;word-break:break-word">
<p style="border-top:4px solid #00803a;font-size:1px;margin:0 auto;width:90px"> </p> <!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:solid 4px #00803a;font-size:1px;margin:0px auto;width:90px;" role="presentation" width="90px" ><tr><td style="height:0;line-height:0;"> &nbsp;
</td></tr></table><![endif]-->
</td>
</tr>
<tr>
<td align="center" style="font-size:0;padding:10px 25px;word-break:break-word">
<div
style="color:#fff;font-family:Arial,sans-serif;font-size:17px;line-height:1.15;text-align:center">
Avant de commencer 2026, prenons un moment pour revenir sur 2025 : une année riche en
échanges, en gourmandise et en belles réussites partagées avec vous. <br> Merci pour
votre <strong>fidélité</strong> et votre <strong>engagement</strong> qui font
<strong>vivre la marque Réghalal au quotidien.</strong><br> Découvrez maintenant le
récapitulatif de vos publications préférées de l’année !
</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
<div style="margin:0 auto;max-width:600px">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%">
<tbody>
<tr>
<td style="direction:rtl;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img
alt="Visuel d'une personne trempant ses samoussas dans une sauce blanche"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_4.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img alt="Visuel d'un chat sur un canapé"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_3.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img
alt="Visuel de deux personnes dans une cuisine en train de se servir dans un plat"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_2.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
<div style="margin:0 auto;max-width:600px">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%">
<tbody>
<tr>
<td style="direction:rtl;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img alt="Visuel d'un plat de pâtes carbonara dans une assiette"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_7.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img
alt="Visuel de morceaux de poulet Réghalal et des pâtes en sauce dans une assiette"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_6.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img
alt="Visuel d'un pique-nique avec différents produits Réghalal"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_5.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
<div style="margin:0 auto;max-width:600px">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%">
<tbody>
<tr>
<td style="direction:rtl;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img
alt="Visuel d'un plat préparé à base de filet de poulet Réghalal"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_10.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img alt="Visuel de plusieurs buns"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_9.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td><td class="" style="vertical-align:top;width:200px;" ><![endif]-->
<div class="mj-column-per-33-333333333333336 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:0;word-break:break-word">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0">
<tbody>
<tr>
<td style="width:200px"> <img
alt="Visuel de feuilletés préparés avec les dés de dinde Réghalal"
src="https://www.reghalal.com/newsletters/2026_01_07/assets/visuel_8.jpg"
style="border:0;display:block;font-size:13px;height:auto;outline:none;text-decoration:none;width:100%"
width="200" height="auto"> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><v:rect style="width:600px;" xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false"><v:fill origin="0.5, 0" position="0.5, 0" src="https://www.reghalal.com/newsletters/ref/fond-sable.jpg" type="tile" /><v:textbox style="mso-fit-shape-to-text:true" inset="0,0,0,0"><![endif]-->
<div
style="background:url(https://www.reghalal.com/newsletters/ref/fond-sable.jpg) top/auto repeat;background-position:top;background-repeat:repeat;background-size:auto;margin:0 auto;max-width:600px">
<div style="font-size:0;line-height:0">
<table align="center" background="https://www.reghalal.com/newsletters/ref/fond-sable.jpg" border="0"
cellpadding="0" cellspacing="0" role="presentation"
style="background:url(https://www.reghalal.com/newsletters/ref/fond-sable.jpg) top/auto repeat;background-position:top;background-repeat:repeat;background-size:auto;width:100%">
<tbody>
<tr>
<td style="direction:ltr;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:top;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top"
width="100%">
<tbody>
<tr>
<td align="left" class="s-title" style="font-size:0;padding:10px 25px;word-break:break-word">
<div
style="color:#00803a;font-family:Barlow,Arial,sans-serif;font-size:37.5px;font-weight:700;line-height:1;text-align:left">
REJOIGNEZ LA COMMUNAUTÉ</div>
</td>
</tr>
<tr>
<td align="left" style="font-size:0;padding:10px 25px;word-break:break-word">
<div
style="color:#000;font-family:Arial,sans-serif;font-size:13px;line-height:1;text-align:left">
<span class="s-subtitle"
style="color:#024e2a;font-family:Barlow,Arial,sans-serif;font-size:33px;font-weight:700">@reghalal
!</span>
</div>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
</div> <!--[if mso | IE]></v:textbox></v:rect></td></tr></table><![endif]-->
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><v:rect style="width:600px;" xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false"><v:fill origin="0.5, 0" position="0.5, 0" src="https://www.reghalal.com/newsletters/ref/fond-sable.jpg" type="tile" size="200px" aspect="atmost" /><v:textbox style="mso-fit-shape-to-text:true" inset="0,0,0,0"><![endif]-->
<div
style="background:url(https://www.reghalal.com/newsletters/ref/fond-sable.jpg) top/200px repeat;background-position:top;background-repeat:repeat;background-size:200px;margin:0 auto;max-width:600px">
<div style="font-size:0;line-height:0">
<table align="center" background="https://www.reghalal.com/newsletters/ref/fond-sable.jpg" border="0"
cellpadding="0" cellspacing="0" role="presentation"
style="background:url(https://www.reghalal.com/newsletters/ref/fond-sable.jpg) top/200px repeat;background-position:top;background-repeat:repeat;background-size:200px;width:100%">
<tbody>
<tr>
<td style="direction:ltr;font-size:0;padding:0;text-align:center">
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:middle;width:300px;" ><![endif]-->
<div class="mj-column-per-50 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:middle;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:middle"
width="100%">
<tbody>
<tr>
<td align="left" class="f-text" style="font-size:0;padding:10px 25px;word-break:break-word">
<div
style="color:#024e2a;font-family:Barlow,Arial,sans-serif;font-size:24px;line-height:1;text-align:left">
Retrouvez toutes nos actualités sur nos réseaux sociaux ou sur <a
style="color:#024e2a;font-weight:700"
href="https://www.reghalal.com/?mtm_campaign=newsletter_janvier_2026_reghalal&mtm_source=newsletter_mensuelle_reghalal&mtm_medium=newsletter">reghalal.com</a>
</div>
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td><td class="" style="vertical-align:bottom;width:300px;" ><![endif]-->
<div class="mj-column-per-50 mj-outlook-group-fix"
style="direction:ltr;display:inline-block;font-size:0;text-align:left;vertical-align:bottom;width:100%">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:bottom"
width="100%">
<tbody>
<tr>
<td align="center" style="font-size:0;padding:10px 25px;word-break:break-word">
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" ><tr><td><![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="display:inline-table;float:none">
<tbody>
<tr>
<td style="padding:4px;vertical-align:middle">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:58px">
<tbody>
<tr>
<td style="font-size:0;height:58px;vertical-align:middle;width:58px"> <a
href="https://www.facebook.com/reghalalofficiel/" target="_blank"> <img alt
height="58" src="https://www.reghalal.com/newsletters/ref/facebook.png"
style="border-radius:3px;display:block" width="58"> </a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table> <!--[if mso | IE]></td><td><![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="display:inline-table;float:none">
<tbody>
<tr>
<td style="padding:4px;vertical-align:middle">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:58px">
<tbody>
<tr>
<td style="font-size:0;height:58px;vertical-align:middle;width:58px"> <a
href="https://www.instagram.com/reghalal/" target="_blank"> <img alt
height="58" src="https://www.reghalal.com/newsletters/ref/instagram.png"
style="border-radius:3px;display:block" width="58"> </a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table> <!--[if mso | IE]></td><td><![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="display:inline-table;float:none">
<tbody>
<tr>
<td style="padding:4px;vertical-align:middle">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:58px">
<tbody>
<tr>
<td style="font-size:0;height:58px;vertical-align:middle;width:58px"> <a
href="https://www.tiktok.com/@reghalal" target="_blank"> <img alt
height="58" src="https://www.reghalal.com/newsletters/ref/tiktok.png"
style="border-radius:3px;display:block" width="58"> </a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div> <!--[if mso | IE]></td></tr></table><![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
</div> <!--[if mso | IE]></v:textbox></v:rect></td></tr></table><![endif]-->
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
</div>
</body>
</html>

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Some files were not shown because too many files have changed in this diff Show more