Jeśli chcesz usunąć stare wpisy, możesz zrobić to ręcznie w panelu administratora. Problem pojawia się wtedy, gdy wpisów do usunięcia jest bardzo dużo i w dodatku chcesz przekierować usunięte wpisy na inną stronę, żeby uniknąć błędu 404. Wtedy należałoby przed usunięciem wpisu skopiować jego adres i zapisać odpowiednie przekierowanie np. w pliku .htaccess. Brzmi uciążliwie. Na szczęście można to zrobić automatycznie.
Poniższy kod będzie pobierał co godzinę 25 wpisów, robił zapis do pliku .htaccess, a na końcu usuwał wpis. Wpisy wybrane do usunięcia spełniają dwa warunki: należą do kategorii „wiadomosci” oraz zostały utworzone przed 31 grudnia 2020. Warunki można dowolnie modyfikować za pomocą tablicy $args
przekazywanej do funkcji get_posts
.
add_action( 'init', function() {
add_action( 'remove_old_posts', 'remove_25_posts' );
if (! wp_next_scheduled ( 'remove_old_posts' )) {
wp_schedule_event( time(), 'hourly', 'remove_old_posts' );
}
}, 20 );
function remove_25_posts() {
// Pobierz 25 wpisów z kategorii "wiadomosci" sprzed 31.12.2020
$term = get_term_by( 'name', 'wiadomosci', 'category' );
$term_id = $term->term_id;
$args = array(
'category' => $term_id,
'post_type' => 'post',
'date_query' => array(
'before' => array(
'year' => 2020,
'month' => 12,
'day' => 31
)
),
'posts_per_page' => 25,
'orderby' => 'id',
'order' => 'ASC',
);
$posts = get_posts( $args );
if ( empty( $posts ) ) {
return;
}
$rules = array();
foreach ( $posts as $post ) {
$rules[] = 'Redirect 301 /' . $post->post_name . ' https://example.com/wiadomosci/' . PHP_EOL;
}
// Zapisz przekierowanie do pliku .htaccess
require_once ABSPATH . 'wp-admin/includes/file.php';
$home_path = get_home_path();
$htaccess_location = $home_path . '.htaccess';
$status = file_put_contents( $htaccess_location, $rules, FILE_APPEND );
if ( false === $status ) {
error_log('Could not write to .htaccess');
return;
}
// Usuń post
foreach ( $posts as $post ) {
wp_delete_post( $post->ID, true );
}
}
Co zrobić, gdy wszystkie stare wpisy zostaną usunięte
Nawet gdy wszystkie stare wpisy zostaną usunięte, kod będzie co godzinę próbował pobrać 25 wpisów do usunięcia. Jest to zupełnie niepotrzebne, dlatego na koniec należy wykonać dwie rzeczy:
- Usunąć kod.
- Zainstalować i włączyć wtyczkę WP Crontrol, przejść do Narzędzia → Cron Events i usunąć zadanie
remove_old_posts
. Następnie trzeba wyłączyć i odinstalować wtyczkę.
Potrzebujesz pomocy ze stroną? Skontaktuj się ze mną przez stronę Kontakt. Chętnie pomogę!