Geçmiş Yazıları ve Ortam Dosyalarını Otomatik Silmek
Çok fazla içerik barındıran sitelerde geçmiş yazılar geçerliliğini yitirmiş olabiliyor. Tabii bu haber siteleri gibi çok fazla içerik barındıran siteler için geçerli. Stackexchange sitesinde bu durumda olan ve eski yazılarını kaldırmak isteyen bir kullanıcıya rastladım. Kullanıcı iki seneden fazla süredir yayında olan, eski ve artık gereksiz olarak gördüğü yazıları kaldırmak istemiş. Bu yazılara bağlı olan ortam dosyalarını da kaldırmak istiyormuş.
Geçmiş Yazılar Başa Bela mı?
Bunun için bir eklenti satın almış ama umduğunu bulamamış. Belli ki eski yazılar kendi için başa bela bir durum oluşturuyor. Dahası haber siteleri için belki de bela bu durum.
Kendisine cevap olarak sizlerle de paylaşacağım bu fonksiyonu yazdım. Fonksiyon bir WordPress cron işi oluşturuyor ve bunu her gün 2 sene önce yayınlanmış içerikleri ve ortamları silmek için çalışıyor. Direkt olarak çöp kutusu gözetmeksizin içerikleri veritabanı üzerinden kaldırıyor. Onun için bu kodu dikkatle kullanmak gerekiyor.
Aşağıdaki kodu temanızın functions.php
dosyasına yerleştirebilirsiniz. Bu dosya wp-content/themes/temanızın-adı/
klasöründe bulunuyor.
<?php
// Please use this function carefully.
// Changes can't undone. Best regards from Serkan Algur :)
// Let the function begin
function delete_oldest_posts_salgur( ) {
// We will collect posts from two years ago :)
$args = array(
'date_query' => array(
array(
'column' => 'post_date_gmt',
'before' => '2 years ago', // change this definition for your needs
),
),
'posts_per_page' => -1,
);
// Get posts via WP_Query
$query = new WP_Query( $args );
//We are doing this for 'foreach'
$posts = $query->get_posts();
foreach($posts as $post){
echo $post->ID;
$args = array(
'posts_per_page' => -1,
'order' => 'ASC',
'post_mime_type' => 'image', // only for images. Look at https://codex.wordpress.org/Function_Reference/get_children
'post_parent' => $post->ID,
'post_type' => 'attachment',
);
$attachments = get_children( $args );
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
wp_delete_attachment($attachment->ID,true); //If You Want to trash post set true to false
}
}
wp_delete_post($post->ID,true); //If You Want to trash post set true to false
}
}
// Problem Solver Cron Job definition
function cron_delete_oldest_posts_salgur() {
if ( ! wp_next_scheduled( 'delete_oldest_posts_salgur' ) ) {
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'delete_oldest_posts_salgur' );
}
}
add_action( 'wp', 'cron_delete_oldest_posts_salgur' );
Yukarıdaki kod iki parçadan oluşuyor. Birinci fonksiyon sizler için belirlenmiş tarihten önce oluşturulmuş yazıları topluyor. İşlemleri gerçekleştirirken önce ortamları bulup siliyor ve arkasından bu ortamların sahibi olan makalelerinizi kaldırıyor. Bunları her bir makale için gerçekleştirmemiz gerektiğinden foreach
özelliğinden yararlandık. WP_Query
içerisinde normalde while
kullanılır olsa da biz sadece sorgunun yazıları içeren kısmını alarak bu işleme dahil ettik.
Bu kaldırma işlemi saniyeler içinde tamamlanıyor ve hem veritabanındaki bilgiyi hem de fiziksel olarak sunucunuzda yer kaplayan resim dosyalarını ortadan kaldırıyor. WordPress içerisinde bulunan çekirdek fonksiyonları kullandığımız için de artık olabilecek bir kod ya da dosya bırakmıyor.
Bu fonksiyonun kendi kendine çalışabilmesi için bir cron task (zamanlanmış görev) oluşturmamız gerekiyor. Bunu da alt kısımdaki fonksiyonu kullanarak yapıyoruz. wp_schedule_event
fonksiyonunu kullanıyoruz. Bu fonksiyon bizim zamanlı işler oluşturmamızı sağlayarak fonksiyonların kendi başlarına çalışmasını sağlıyor.
Günlük olarak çalışacak olan bu kodumuz sizlerin dert etmesine gerek kalmadan eski yazılarınızdan kurtulmanızı sağlıyor.
Önerdiğim bu kod için daha verified answer almadım ama bugün bir upvote geldi :) Siz de yukarıdaki linki kaçırdıysanız şu linkten soruya ve cevabıma erişebilirsiniz :)
Umarım hepiniz için faydalı olur. Saygılarımla