WordPress: usuwanie starych wpisów z automatycznym przekierowaniem

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:

  1. Usunąć kod.
  2. 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ę!

Pani Marta
Jestem Marta. Pani Marta. Na moim blogu dzielę się prostymi sposobami na bezwtyczkowe ulepszenie swojej strony WordPress. Jeśli brakuje Ci czegoś w tym wpisie lub chcesz, abym poruszyła temat, na którym Ci zależy, daj znać w komentarzu!

Dodaj komentarz

*

*

*

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *