Je suis à la recherche d'une solution pour supprimer automatiquement les images d'anciennes publications sur le site WordPress. Je souhaite conserver des images des 50 publications actuelles, les autres doivent être supprimées automatiquement. Il peut s'agir d'une fonction permettant de supprimer l'intervalle de temps ou de ne conserver que les images des 50 derniers messages. Est-ce que quelqu'un connaît la fonction ou un plugin qui peut faire ceci ou des choses similaires, pour supprimer automatiquement les anciennes images? Je crois que la création d'un travail cron sera nécessaire.
Quelqu'un a posté cette fonction dans stackoverflow mais je ne vois aucune mention du temps.
function delete_post_media( $post_id ) {
$attachments = get_posts( array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'any',
'post_parent' => $post_id
) );
foreach ( $attachments as $attachment ) {
if ( false === wp_delete_attachment( $attachment->ID ) ) {
// Log failure to delete attachment.
}
}
}
Si vous ne souhaitez conserver que les images des 50 derniers articles, je ne pense pas qu'un travail cron ou un WP cron soit la meilleure chose à faire. Dans WordPress, vous pouvez savoir quand un article est publié. et vous pouvez lancer une routine chaque fois que cela se produit, en supprimant des images pour le post publié il y a 50 publications.
C'est facile, plus performant (vous ne faites rien si vous n'avez rien à faire, un travail cron est exécuté que vous ayez quelque chose à supprimer ou non).
Le flux de travail est assez simple:
le code:
add_action( 'save_post', 'cleanup_old_post_images', 10, 3 );
function cleanup_old_post_images( $post_ID, $post, $update ) {
if ( $update ) return; // do nothing on update
$postid51th = get51th_postid(); // see below
if ( ! empty( $postid51th ) && is_numeric( $postid51th ) ) {
delete_post_media( $postid51th ); // see below, function in OP
}
}
function get51th_postid() {
return $GLOBALS['wpdb']->get_var(
"SELECT ID FROM " . $GLOBALS['wpdb']->posts .
" WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC
LIMIT 50, 1"
);
}
function delete_post_media( $post_id ) {
$attachments = get_posts( array(
'post_type' => 'attachment',
'nopaging' => TRUE,
'post_parent' => $post_id
) );
if ( empty( $attachments ) ) return; // added this line to prevent errors
foreach ( $attachments as $attachment ) {
if ( false === wp_delete_attachment( $attachment->ID ) ) {
// Log failure to delete attachment.
}
}
}
Cela fonctionne pour les publications publiées après que vous ayez inséré le code sur le site, mais vous pouvez écrire une fonction instantanée pour supprimer les images des publications antérieures.
add_action( 'shutdown', 'delete_older_attachments' );
function delete_older_attachments() {
// run only on admin and use a transient to run once
if ( ! is_admin() || get_transient('get_older_postids') ) return;
// the query to exclude last 50 posts
$latest_query = "SELECT ID FROM " . $GLOBALS['wpdb']->posts .
" WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC
LIMIT 50"
);
// get older posts ids
$older_ids = $GLOBALS['wpdb']->get_row(
"SELECT ID FROM " . $GLOBALS['wpdb']->posts .
" WHERE post_type = 'post' AND post_status = 'publish'
AND ID NOT IN (" . $latest_query . ")"
);
// get attachments for older posts
if ( ! empty( $older_ids ) && is_array( $older_ids ) ) {
$attachments = $GLOBALS['wpdb']->get_row(
"SELECT ID FROM " . $GLOBALS['wpdb']->posts .
" WHERE post_type = 'attachments'
AND post_parent IN (" . implode( ',', $older_ids ) . ")"
);
}
if ( isset($attachments) && ! empty( $attachments ) && is_array( $attachments ) ) {
foreach ( $attachments as $attachment ) {
if ( false === wp_delete_attachment( $attachment ) ) {
// Log failure to delete attachment.
}
}
// set the transient to assure run once
set_transient( 'get_older_postids', 1 );
}
}