サポート » その他 » 3ヶ月前の投稿情報を削除するには

  • 解決済 koyki

    (@koyki)


    タイトルのとおりなのですが、
    ・3ヶ月前の投稿情報を削除
    ・3ヶ月以内の投稿情報を残す
    ※同じ意味ですが・・。

    という条件で削除したいと考えています。

    プラグイン関係でないか・・実際に行なっている方はいないかな・・と検索はしてみたのですが、投稿した情報をわざわざ削除するといった方はいないようで、ご質問させていただきました。

    phpmyadminで、wp_postsの中身を削除すればいけるのか・・とも思っていますが、ちょっとリスクが高すぎるので、ほかに方法があれば・・と思っています。

    すいません、よろしくお願いします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • wordpress 本体に、wp_delete_post という関数が用意されています。
    データベースを直接いじるよりは、こちらを使うほうが良いでしょう。

    http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_delete_post
    記事、添付ファイル、固定ページなどの投稿を削除します。記事やページの場合は、それに関連づけられている情報(コメント、カスタムフィールド、タームなど)もすべて削除されます。

    トピック投稿者 koyki

    (@koyki)

    php-webさん、情報ありがとうございます。

    苦手な関数(プログラム)ですが、がんばってみます。

    ありがとうございます。

    もう解決済みなのですが、一応。

    <?php
    /*
    Plugin Name: Old Post Delete
    Plugin URI: http://geeeek.crz.jp/
    Description: 3か月前より以前の古い投稿をデータベースから削除します。
    Author: oumiya shun
    Version: 0.1
    Author URI: http://geeeek.crz.jp/
    */
    
    function delete_old_options() {
    ?>
        <div class=wrap>
          <?php if ( function_exists( 'screen_icon' ) ) { screen_icon(); } ?>
          <h2>古い投稿の削除</h2>
    <?php
        if ( !empty($_POST) && check_admin_referer( 'delete_old_post_page', 'delete_old_post_field' ) ) {
            $year = isset($_POST['year']) ? $_POST['year'] : null;
            $month = isset($_POST['month']) ? $_POST['month'] : null;
            $day = isset($_POST['day']) ? $_POST['day'] : null;
            $delete_option = isset($_POST['delete_option']) ? $_POST['delete_option'] : null;
    
            if (empty($year)
                || empty($month)
                || empty($day)
                || empty($delete_option)) {
            echo '<p>設定値が正しくありません。</p>';
            } else {
                $force_delete = false;
                if ($delete_option == "2") {
                    $force_delete = true;
                }
                delete_old_posts($year, $month, $day, $force_delete);
            }
        }
    ?>
          <p class="description">
          削除対象の日付を設定して「変更を保存」ボタンをクリックすると、
          設定した日付より過去の投稿がすべて削除されます。
          (設定日付は含みません。)
          </p>
          <p style="color: #ff0000; font-weight: bold;">
          この操作を行う前に必ずデータベースのバックアップ・投稿のエクスポートを行ってください。<br />
          この操作は元に戻せません!
          </p>
          <form action="" method="post">
            <?php wp_nonce_field( 'delete_old_post_page','delete_old_post_field' ); ?>
            <table class="form-table">
              <tr valign="top">
                <th>年</th>
                <td>
                  <input type="text" name="year" />
                </td>
              </tr>
              <tr valign="top">
                <th>月</th>
                <td>
                  <input type="text" name="month" />
                </td>
              </tr>
              <tr valign="top">
                <th>日</th>
                <td>
                  <input type="text" name="day" />
                </td>
              </tr>
              <tr valign="top">
                <th>削除操作</th>
                <td>
                    <select name="delete_option">
                        <option value="1">ゴミ箱に移動</option>
                        <option value="2">完全に削除</option>
                    </select>
                </td>
              </tr>
            </table>
            <?php submit_button(); ?>
          </form>
        </div>
    <?php
    }
    
    function delete_old_menu() {
      add_options_page('古い投稿の削除', '古い投稿の削除', 8, __FILE__, 'delete_old_options');
    }
    
    add_action('admin_menu', 'delete_old_menu');
    
    // 指定の日付より前の投稿を削除します。(指定の日付は含みません。)
    // 引数にtrueを指定するとゴミ箱に移動ではなく削除します。
    function delete_old_posts($year, $month, $day, $force_delete = false) {
        global $wpdb;
    
        if (checkdate($month, $day, $year) === false) {
            echo '<p>日付が正しくありません。</p>';
            return;
        }
    
        // 指定の日付より前の投稿IDを取得
        // NOTE: WordPressに用意されている関数で指定日付より以前のpost_idを取得が見つからなかったので
        // wpdbでデータベースを直接検索しています。
        // NOTE: よって公開状態や修正日時を考慮したい場合はSELECT文を直接修正してください。
        $target_date = $year . '-' . $month . '-' .$day;
        $query_text = "SELECT ID FROM wp_posts WHERE post_type = 'post' AND post_date < '$target_date'";
        $query_result = $wpdb->get_results($query_text);
    
        // 削除したリスト
        $delete_post_ids = "";
        // 削除に失敗したリスト
        $not_found_post_id = "";
        foreach($query_result as $item) {
            $id = $item->ID;
            if (wp_delete_post($id, $force_delete) === false) {
                $not_found_post_id .= "<li>$id</li>";
            } else {
                $delete_post_ids .= "<li>$id</li>";
            }
        }
    
        if (empty($delete_post_ids)) {
            echo "<p>対象の投稿が見つかりませんでした。日付を指定しなおしてください。</p>";
        } else {
            if ($force_delete === true) {
                echo "<p>次の投稿を削除しました。</p>";
            } else {
                echo "<p>次の投稿をゴミ箱に移動しました。</p>";
            }
            echo '<ul>';
            echo $delete_post_ids;
            echo '</ul>';
        }
    
        if (empty($not_found_post_id) === false) {
            if ($force_delete === true) {
                echo "<p>次の投稿を削除できませんでした。</p>";
            } else {
                echo "<p>次の投稿をゴミ箱に移動できませんでした。</p>";
            }
            echo '<ul>';
            echo $not_found_post_id;
            echo '</ul>';
        }
    }

    トピック投稿者 koyki

    (@koyki)

    sigeyamaさん、ありがとうございます。

    助かりました!
    希望通り、削除できました!

    削除日時の設定期間(~以降までの期間)を、ちょっと多くとりすぎてしまって、最初はタイムアウトになることがあったんですが、もっと期間を短く設定するとタイムアウトもなくうまくいきました。

    後、プラグインってこういう風に作るのか!と勉強にもなりました。

    本当にありがとうございます。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「3ヶ月前の投稿情報を削除するには」には新たに返信することはできません。