Je souhaite supprimer automatiquement les images de plus de 3 jours dans la médiathèque. Y at-il une méthode pour faire cela?
Vous pouvez utiliser ces fonctions pour rechercher et supprimer des pièces jointes d’image datant de 3 jours depuis leur date de création:
// Delete attachments (images) that are {n} days old.
function auto_delete_old_image_atts() {
// How many days old.
$days = 3;
// TRUE = bypasses the trash and force deletion.
$force_delete = true;
// Get all attachments that are images.
$atts = get_posts( array(
'post_type' => 'attachment',
'post_mime_type' => 'image/%',
'posts_per_page' => -1,
'post_days_old' => $days,
'suppress_filters' => false,
) );
$current_date = current_time( 'mysql' );
foreach ( $atts as $att ) {
// Get the number of days since the attachment was created.
$created_datetime = new DateTime( $att->post_date );
$current_datetime = new DateTime( $current_date );
$interval = $created_datetime->diff( $current_datetime );
// If the attachment is $days days old since its CREATION DATE, delete
// the attachment (post data and image) and all thumbnails.
if ( $interval->days >= $days ) {
wp_delete_attachment( $att->ID, $force_delete );
}
}
}
// Filter the query so that only posts which are {n} (e.g. 3) days old will be
// returned by MySQL. For this to work, use 'post_days_old' when querying for
// posts using `get_posts()` or `new WP_Query()`.
add_filter( 'posts_clauses', 'filter_posts_by_dates_days', 10, 2 );
function filter_posts_by_dates_days( array $clauses, WP_Query $wp_query ) {
$days = $wp_query->get( 'post_days_old' );
if ( is_numeric( $days ) && $days >= 0 ) {
global $wpdb;
$clauses['where'] .= $wpdb->prepare( "
AND ( DATEDIFF( NOW(), {$wpdb->posts}.post_date ) >= %d )
", $days );
}
return $clauses;
}
Pour des raisons d'optimisation, nous filtrons la requête/requête WP_Query
afin que MySQL ne sélectionne et ne renvoie que les publications/pièces jointes datant de moins de 3 jours. et dans la boucle foreach
, nous utilisons la fonction DateTime::diff()
intégrée de PHP pour nous assurer que chaque publication a en réalité 3 jours.
Maintenant, pour la partie de suppression automatique, vous pouvez utiliser wp_schedule_event
like so: (voir le Codex pour plus de détails)
// Schedule an event that runs once in every hour.
add_action( 'init', 'schedule_my_hourly_event' );
function schedule_my_hourly_event() {
if ( ! wp_next_scheduled( 'my_hourly_event' ) ) {
wp_schedule_event( time(), 'hourly', 'my_hourly_event' );
}
}
// Auto-check for old images and delete them, if any.
add_action( 'my_hourly_event', 'auto_delete_old_image_atts' );
Ou vous pouvez ignorer le code ci-dessus et utiliser WP Crontrol à la place pour ajouter l'événement cron. (Voir la page du plugin pour plus de détails à ce sujet)
wp-cron.php
Oui, parce que la auto_delete_old_image_atts()
pourrait prendre un temps delong(si pas very long), vous devriez donc plutôt utiliser un "vrai" travail cron et voir ceci et ceci pour plus de détails.