wake-up-neo.net

Automatische Löschung von WordPress-Bildern/Miniaturansichten (alle Größen) nach X Tagen/Stunden oder ähnlichem?

Ich bin auf der Suche nach einer Lösung zum automatischen Löschen von Bildern alter Beiträge auf einer WordPress-Site. Ich möchte Bilder von derzeit 50 Posts speichern, andere sollten automatisch gelöscht werden. Es kann eine Funktion zum Löschen im Zeitintervall oder zum Speichern von Bildern der letzten 50 Beiträge sein. Kennt jemand eine Funktion oder ein Plugin, das dies oder ähnliches kann, um ältere Bilder automatisch zu löschen? Ich glaube, dass das Einstellen eines Cron-Jobs erforderlich sein wird.

Jemand hat diese Funktion in stackoverflow gepostet, aber ich sehe keine Zeitangabe.


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

Wenn Sie nur Bilder für die letzten 50 Posts behalten müssen, denke ich nicht, dass ein Cron-Job oder ein WP Cron das Beste ist, was Sie tun können. In WordPress können Sie wissen, wann ein Post veröffentlicht wird. und Sie können jedes Mal eine Routine ausführen, indem Sie Bilder für den Beitrag löschen, der vor 50 Beiträgen veröffentlicht wurde.

Das ist einfach und bietet eine bessere Leistung (Sie tun nichts, wenn Sie nichts zu tun haben, ein Cron-Job wird ausgeführt, unabhängig davon, ob Sie etwas löschen möchten oder nicht).

Der Workflow ist ziemlich einfach:

  1. Jedes Mal, wenn ein Beitrag veröffentlicht wird, wird die 51. Beitrags-ID abgerufen (sortiert nach Veröffentlichungsdatum).
  2. alle Bilder mit dieser ID als übergeordnetes Element löschen

der 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.
    }
  }
}

Dies funktioniert für Posts, die nach dem Einfügen des Codes in die Site veröffentlicht wurden. Sie können jedoch eine einmalige Ausführung schreiben, um Bilder für ältere Posts zu löschen

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