Skip to content

Commit 60c3f72

Browse files
Merge pull request #246 from JLG-WOCFR-DEV/codex/extend-cron-scheduling-for-custom-intervals
Add filters to extend cron schedules and preset options
2 parents 1a832e3 + 7e92dca commit 60c3f72

File tree

3 files changed

+170
-50
lines changed

3 files changed

+170
-50
lines changed

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,31 @@ Liens Morts Detector est une extension WordPress qui détecte les liens et image
2424
- L’analyse des images distantes (CDN, sous-domaines médias) peut être activée dans les réglages. Cette vérification reste basée sur les fichiers présents dans `wp-content/uploads` et peut rallonger la durée du scan ou consommer davantage de quotas côté CDN.
2525

2626
## Hooks disponibles
27+
### `blc_cron_schedule_definitions`
28+
Permet d’ajouter, modifier ou supprimer des intervalles WP‑Cron proposés par défaut (heures, jours, semaines…). Chaque entrée doit fournir un identifiant unique ainsi qu’un intervalle en secondes.
29+
30+
```php
31+
add_filter('blc_cron_schedule_definitions', function (array $definitions): array {
32+
$definitions['quarter_hour'] = array(
33+
'interval' => 15 * MINUTE_IN_SECONDS,
34+
'display' => __('Toutes les 15 minutes', 'liens-morts-detector-jlg'),
35+
);
36+
37+
return $definitions;
38+
});
39+
```
40+
41+
### `blc_frequency_preset_options`
42+
Personnalise la liste des fréquences affichées dans les réglages (radios + champ personnalisé). Idéal pour mettre en cohérence l’interface avec un nouvel intervalle WP‑Cron ajouté via le filtre précédent.
43+
44+
```php
45+
add_filter('blc_frequency_preset_options', function (array $options): array {
46+
$options = array('quarter_hour' => __('Toutes les 15 minutes', 'liens-morts-detector-jlg')) + $options;
47+
48+
return $options;
49+
});
50+
```
51+
2752
### `blc_max_load_threshold`
2853
Permet d’ajuster le seuil de charge CPU au‑delà duquel l’analyse est reportée. La valeur par défaut est `2.0`.
2954

liens-morts-detector-jlg/includes/blc-cron.php

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,41 +6,78 @@
66
}
77

88
/**
9-
* Ajoute des planifications personnalisées (hebdomadaire, mensuelle) à la liste des
9+
* Retourne les planifications personnalisées proposées par défaut.
10+
*
11+
* @since 1.1.0
12+
*
13+
* @return array<string, array{interval:int, display:string}> Tableau associatif de définitions.
14+
*/
15+
function blc_get_default_cron_schedules() {
16+
return array(
17+
'blc_hourly' => array(
18+
'interval' => HOUR_IN_SECONDS,
19+
'display' => __('Toutes les heures', 'liens-morts-detector-jlg'),
20+
),
21+
'blc_six_hours' => array(
22+
'interval' => 6 * HOUR_IN_SECONDS,
23+
'display' => __('Toutes les 6 heures', 'liens-morts-detector-jlg'),
24+
),
25+
'blc_twelve_hours' => array(
26+
'interval' => 12 * HOUR_IN_SECONDS,
27+
'display' => __('Toutes les 12 heures', 'liens-morts-detector-jlg'),
28+
),
29+
'weekly' => array(
30+
'interval' => 7 * DAY_IN_SECONDS,
31+
'display' => __('Une fois par semaine', 'liens-morts-detector-jlg'),
32+
),
33+
'monthly' => array(
34+
'interval' => 30 * DAY_IN_SECONDS,
35+
'display' => __('Une fois par mois', 'liens-morts-detector-jlg'),
36+
),
37+
);
38+
}
39+
40+
/**
41+
* Ajoute des planifications personnalisées (hebdomadaire, mensuelle, etc.) à la liste des
1042
* fréquences de WP-Cron.
1143
*
1244
* @param array $schedules Le tableau des planifications existantes.
1345
* @return array Le tableau des planifications mis à jour.
1446
*/
1547
function blc_add_cron_schedules($schedules) {
48+
$default_definitions = blc_get_default_cron_schedules();
1649

17-
// Ajoute des options courtes supplémentaires.
18-
$schedules['blc_hourly'] = array(
19-
'interval' => HOUR_IN_SECONDS,
20-
'display' => __('Toutes les heures', 'liens-morts-detector-jlg'),
21-
);
50+
/**
51+
* Permet de modifier la liste des planifications ajoutées par le plugin.
52+
*
53+
* @since 1.1.0
54+
*
55+
* @param array $default_definitions Tableau associatif `slug => array( 'interval' => int, 'display' => string )`.
56+
*/
57+
$definitions = apply_filters('blc_cron_schedule_definitions', $default_definitions);
2258

23-
$schedules['blc_six_hours'] = array(
24-
'interval' => 6 * HOUR_IN_SECONDS,
25-
'display' => __('Toutes les 6 heures', 'liens-morts-detector-jlg'),
26-
);
59+
foreach ($definitions as $slug => $definition) {
60+
if (!is_scalar($slug)) {
61+
continue;
62+
}
2763

28-
$schedules['blc_twelve_hours'] = array(
29-
'interval' => 12 * HOUR_IN_SECONDS,
30-
'display' => __('Toutes les 12 heures', 'liens-morts-detector-jlg'),
31-
);
64+
$slug = (string) $slug;
65+
if ('' === $slug || !is_array($definition)) {
66+
continue;
67+
}
3268

33-
// Ajoute l'option "Une fois par semaine"
34-
$schedules['weekly'] = array(
35-
'interval' => 7 * DAY_IN_SECONDS,
36-
'display' => __('Une fois par semaine', 'liens-morts-detector-jlg'),
37-
);
69+
$interval = isset($definition['interval']) ? (int) $definition['interval'] : 0;
70+
if ($interval <= 0) {
71+
continue;
72+
}
3873

39-
// Ajoute l'option "Une fois par mois"
40-
$schedules['monthly'] = array(
41-
'interval' => 30 * DAY_IN_SECONDS,
42-
'display' => __('Une fois par mois', 'liens-morts-detector-jlg'),
43-
);
74+
$display = isset($definition['display']) ? (string) $definition['display'] : $slug;
75+
76+
$schedules[$slug] = array(
77+
'interval' => $interval,
78+
'display' => $display,
79+
);
80+
}
4481

4582
$custom_hours = blc_get_custom_frequency_hours();
4683
$default_custom_schedule = array(

liens-morts-detector-jlg/includes/blc-settings-fields.php

Lines changed: 84 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,78 @@ function blc_get_timezone_label() {
404404
return $timezone_label;
405405
}
406406

407+
/**
408+
* Retourne la liste des fréquences prédéfinies disponibles dans l'interface.
409+
*
410+
* @since 1.1.0
411+
*
412+
* @return array<string, string> Tableau associatif `valeur => libellé`.
413+
*/
414+
function blc_get_frequency_preset_options() {
415+
$default_displays = blc_get_default_cron_schedules();
416+
417+
$base_options = array(
418+
'blc_hourly' => isset($default_displays['blc_hourly']['display'])
419+
? $default_displays['blc_hourly']['display']
420+
: __('Toutes les heures', 'liens-morts-detector-jlg'),
421+
'blc_six_hours' => isset($default_displays['blc_six_hours']['display'])
422+
? $default_displays['blc_six_hours']['display']
423+
: __('Toutes les 6 heures', 'liens-morts-detector-jlg'),
424+
'blc_twelve_hours' => isset($default_displays['blc_twelve_hours']['display'])
425+
? $default_displays['blc_twelve_hours']['display']
426+
: __('Toutes les 12 heures', 'liens-morts-detector-jlg'),
427+
'daily' => __('Quotidienne', 'liens-morts-detector-jlg'),
428+
'weekly' => isset($default_displays['weekly']['display'])
429+
? $default_displays['weekly']['display']
430+
: __('Hebdomadaire', 'liens-morts-detector-jlg'),
431+
'monthly' => isset($default_displays['monthly']['display'])
432+
? $default_displays['monthly']['display']
433+
: __('Mensuelle', 'liens-morts-detector-jlg'),
434+
);
435+
436+
/**
437+
* Permet de personnaliser les options affichées dans le sélecteur de fréquence.
438+
*
439+
* @since 1.1.0
440+
*
441+
* @param array $base_options Tableau associatif de valeurs => libellés ou définitions.
442+
*/
443+
$options = apply_filters('blc_frequency_preset_options', $base_options);
444+
445+
$normalized_options = array();
446+
447+
foreach ($options as $value => $definition) {
448+
if (!is_scalar($value)) {
449+
continue;
450+
}
451+
452+
$value = (string) $value;
453+
if ('' === $value) {
454+
continue;
455+
}
456+
457+
if (is_array($definition)) {
458+
if (isset($definition['label']) && is_scalar($definition['label'])) {
459+
$label = (string) $definition['label'];
460+
} elseif (isset($definition['display']) && is_scalar($definition['display'])) {
461+
$label = (string) $definition['display'];
462+
} else {
463+
continue;
464+
}
465+
} else {
466+
$label = (string) $definition;
467+
}
468+
469+
if ('' === $label) {
470+
continue;
471+
}
472+
473+
$normalized_options[$value] = $label;
474+
}
475+
476+
return $normalized_options;
477+
}
478+
407479
/**
408480
* Affiche le champ de sélection de la fréquence de vérification.
409481
*
@@ -423,14 +495,13 @@ function blc_render_frequency_field() {
423495

424496
$is_custom_selected = ('custom' === $frequency);
425497

426-
$preset_options = array(
427-
'blc_hourly' => __('Toutes les heures', 'liens-morts-detector-jlg'),
428-
'blc_six_hours' => __('Toutes les 6 heures', 'liens-morts-detector-jlg'),
429-
'blc_twelve_hours'=> __('Toutes les 12 heures', 'liens-morts-detector-jlg'),
430-
'daily' => __('Quotidienne', 'liens-morts-detector-jlg'),
431-
'weekly' => __('Hebdomadaire', 'liens-morts-detector-jlg'),
432-
'monthly' => __('Mensuelle', 'liens-morts-detector-jlg'),
433-
);
498+
$preset_options = blc_get_frequency_preset_options();
499+
500+
if (empty($preset_options)) {
501+
$preset_options = array(
502+
'daily' => __('Quotidienne', 'liens-morts-detector-jlg'),
503+
);
504+
}
434505
?>
435506
<fieldset id="blc_frequency_fieldset" class="blc-frequency-field">
436507
<legend class="screen-reader-text"><?php esc_html_e('Fréquence de vérification des liens', 'liens-morts-detector-jlg'); ?></legend>
@@ -936,15 +1007,9 @@ function blc_sanitize_frequency_custom_time_option($value) {
9361007
* @return string
9371008
*/
9381009
function blc_sanitize_frequency_option($value) {
939-
$allowed_frequencies = array(
940-
'blc_hourly',
941-
'blc_six_hours',
942-
'blc_twelve_hours',
943-
'daily',
944-
'weekly',
945-
'monthly',
946-
'custom',
947-
);
1010+
$preset_options = blc_get_frequency_preset_options();
1011+
$allowed_frequencies = array_keys($preset_options);
1012+
$allowed_frequencies[] = 'custom';
9481013

9491014
$previous_frequency_option = get_option('blc_frequency', 'daily');
9501015
$previous_frequency_sanitized = sanitize_text_field($previous_frequency_option);
@@ -959,15 +1024,8 @@ function blc_sanitize_frequency_option($value) {
9591024
$frequency = $submitted_frequency;
9601025
} else {
9611026
$frequency = $fallback_frequency;
962-
$frequency_labels = array(
963-
'blc_hourly' => __('toutes les heures', 'liens-morts-detector-jlg'),
964-
'blc_six_hours' => __('toutes les 6 heures', 'liens-morts-detector-jlg'),
965-
'blc_twelve_hours' => __('toutes les 12 heures', 'liens-morts-detector-jlg'),
966-
'daily' => __('quotidienne', 'liens-morts-detector-jlg'),
967-
'weekly' => __('hebdomadaire', 'liens-morts-detector-jlg'),
968-
'monthly' => __('mensuelle', 'liens-morts-detector-jlg'),
969-
'custom' => __('personnalisée', 'liens-morts-detector-jlg'),
970-
);
1027+
$frequency_labels = $preset_options;
1028+
$frequency_labels['custom'] = __('Intervalle personnalisé', 'liens-morts-detector-jlg');
9711029
$frequency_label = isset($frequency_labels[$frequency]) ? $frequency_labels[$frequency] : $frequency;
9721030
$message = sprintf(
9731031
/* translators: %s: fallback frequency label. */

0 commit comments

Comments
 (0)