web-dev-qa-db-fra.com

Supprimer automatiquement les images/miniatures WordPress (toutes tailles) et en vedette après X jours/heures, ou similaire?

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.
        }
    }
}
3
drabello

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:

  1. Chaque fois qu'un article est publié, obtenez le 51ème article (classé par date de publication)
  2. supprimer toutes les images ayant cet identifiant comme post parent

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 );
  }
}
2
gmazzap