WordPress

przekierowanie — Przekierowanie adresu URL usuniętych postów do innej instalacji WordPress

  • 26 lutego, 2014
  • 4 min read
przekierowanie — Przekierowanie adresu URL usuniętych postów do innej instalacji WordPress


To problematyczne zadania.

Sugeruję wykonanie jednorazowego zadania, które:

  1. uzyskaj wszystkie posty oznaczone jako „konsultanci biznesowi”
  2. uruchomić zadanie jednorazowe* aby zapisać w pliku php tablicę ślimaków, które publikują
  3. gdy żądanie zostanie wykonane na jednym z tych adresów URL, przekieruj do nowego adresu URL witryny
  4. usuń posty

Napiszę cały kod jako wtyczkę.

Zdecydowanie sugeruję wykonanie pełnej kopii zapasowej bazy danych przed zainstalowaniem tej wtyczki

Zapisz następujący kod w pliku o nazwie RedirectDeleted.phpumieść w folderze z wtyczkami i aktywuj go.

To zajmie tyle samo sekund, zanim strona zostanie w pełni załadowana, ale potem, jeśli przejdziesz na stronę z listą postów, powinieneś zobaczyć wszystkie posty oznaczone jako „konsultanci biznesowi” usunięte z WordPress, dodatkowo w folderze przesyłania powinieneś zobaczyć plik php o nazwie redirect_deleted_business-consultants.php.

Jeśli kiedykolwiek, po prostu odwiedź adres URL podobny do (gdzie „a-post-slug” to prawdziwy ślimak otagowany jako „konsultanci biznesowi”) i powinieneś zostać przekierowany do http://www.example.com/business-consultants/a-post-slug.

Pamiętaj, że jeśli kiedykolwiek usuniesz redirect_deleted_business-consultants.php plik lub odinstalujesz wtyczkę, plik przekierowanie nie będzie już działać. Zainstaluj wtyczkę jako obowiązkową wtyczkę, która może być pomysłem, aby zapobiec odinstalowaniu.

Warto przeczytać!  Jak importować i eksportować produkty WooCommerce z obrazami

Wspaniałą rzeczą jest to, że możesz przenieść się do własnego WP zainstalować dowolny inny tag!

Np. jeśli masz tag ze ślimakiem „business-stuff” i chcesz go przenieść do innej instalacji WP, po prostu utwórz tę instalację pod adresem URL i dodaj „business-stuff” do pliku wtyczki w $target_tags tablica (patrz poniżej).

Kod:

<?php
/**
 * Plugin Name: RedirectDeletedTag
 * Plugin URI: 
 */

class RedirectDeletedTag {

  /**
  * Adjust this variable according to real tag slug.
  * The key is the tag slug, and the value is the base url for the redirect.
  * If you want, you can add other tag slugs you want ot move to separate sites.
  */
  protected $target_tags = array(
    'business-consultants' => '
  );

  function cacheUrls() {
    if ( ! is_admin() || ! current_user_can( 'install_plugins' ) ) return;
    $t = new ArrayIterator( $this->target_tags );
    while( $t->valid() ) {
      $tag = $t->key();
      if ( $this->shouldCache( $tag ) ) $this->cacheTagUrls( $tag );
      $t->next();
    }
  }

  function redirect() {
    if ( is_admin() ) return;
    $url = $this->getUrl();
    if ( ! empty( $url ) ) {
      $t = new ArrayIterator( $this->target_tags );
      while( $t->valid() ) {
       $this->redirectTag( $t->key(), $url, $t->current() );
       $t->next();
     }
    }
  }

  protected function cacheTagUrls ( $tag ) {
    $args = array( 'post_type' => 'post', 'nopaging' => true, 'tag' => $tag );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) {
      $slugs = wp_list_pluck( $query->posts, 'post_name' );
      $id_list =  implode( ',',  wp_list_pluck( $query->posts, 'ID') );
      $cache="<?php return array("" . implode('","', $slugs ) . '");';
      if ( @file_put_contents( $this->getCachePath( $tag ), $cache ) !== FALSE ) {
        set_transient( __CLASS__ . $tag, '1' );
        // cache saved, delete all posts and term
        global $wpdb;
        $wpdb->query( "DELETE FROM $wpdb->posts WHERE ID IN ($id_list)" );
        $term = get_term_by('slug', $tag, 'post_tag');
        if ( ! empty( $term ) && isset( $term->term_id ) ) {
          wp_delete_term( $term->term_id, 'post_tag' );
        }
      }
    }
  }

  protected function redirectTag( $tag, $url, $base ) {
    if ( file_exists( $this->getCachePath( $tag ) ) ) {
      $cached = (array) include $this->getCachePath( $tag );
      if ( in_array( $url, $cached ) ) {
        wp_redirect( trailingslashit( $base ) . $url );
        exit();
      }
    }
  }

  protected function shouldCache( $tag = '' ) { 
    $should = FALSE;
    if ( is_admin() && current_user_can( 'install_plugins' ) ) {
      $transient = get_transient( __CLASS__ . $tag );
      $file = file_exists( $this->getCachePath( $tag ) );
      $should = empty($transient) && ! $file;
    }
    return $should;
  }

  protected function getCachePath( $tag = '' ) {
    $upload_dir = wp_upload_dir();
    $base = trailingslashit( $upload_dir['basedir'] );
    return  $base . 'redirect_deleted_' . $tag . '.php';
  }

  protected function getUrl() {
    $home_path = trim( parse_url( home_url(), PHP_URL_PATH ), " );
    $full = trim( str_replace( $home_path, '', add_query_arg( array() ) ), " );
    $stripped = explode( '?', $full );
    return trim( $stripped[0], " );
  }

}

$rd = new RedirectDeletedTag();
add_action( 'shutdown', array( $rd, 'cacheUrls' ) );
add_action( 'after_setup_theme', array( $rd, 'redirect' ) );

Wtyczka jest dostępna jako Gist tutaj.

Warto przeczytać!  Najlepsze wtyczki ChatGPT dla Twojej witryny WordPress

* Aby uruchomić jednorazowe zadanie, użyję transjentu oraz sprawdzenia, czy bieżący użytkownik jest administratorem, a także istnienia pliku pamięci podręcznej. Jeśli chcesz, spójrz na to pytanie/odpowiedzi, aby poznać inne podejście do jednorazowych zadań w WordPress.


Źródło