web-dev-qa-db-ja.com

WordPressの画像/サムネイル(全サイズ)を自動削除し、X日/時間後に表示されるようになりましたか。

私はWordPressサイトで古い投稿の画像を自動削除するための解決策を探しています。現在の50の投稿の画像を保持したいのですが、他は自動的に削除されるべきです。時間間隔で削除する機能でも、最後の50投稿の画像だけを保持する機能でも構いません。誰かが古い画像を自動的に削除するための、これに似たことをすることができる機能やプラグインを知っていますか?私はクーロンの仕事を設定する必要があると思います。

誰かがこの関数をstackoverflowに投稿しましたが、私は時間についての言及を見ません。


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

過去50件の投稿の画像のみを保持する必要がある場合は、cronジョブやWP cronを実行するのが最善の方法ではないと思います。また、毎回ルーチンを実行して、50投稿前に投稿された投稿の画像を削除することもできます。

それは簡単で、より良いパフォーマンスです(あなたに何もしなければ何もしません、cronジョブはあなたが削除するものがあってもなくても実行されます)。

ワークフローはとても簡単です。

  1. 投稿が公開されるたびに、51番目の投稿IDを取得します(公開日順)。
  2. そのIDを投稿親として持つすべての画像を削除します

コード:

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

これは、サイトにコードを追加した後に公開された投稿には有効ですが、古い投稿の画像を削除するためのrun-once関数を作成することもできます。

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