Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions includes/Importers/Cleanup/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/
namespace TIOB\Importers\Cleanup;

use TIOB\Importers\Helpers\Slug_Mapping;
use TIOB\Importers\Plugin_Importer;

/**
Expand Down Expand Up @@ -293,6 +294,7 @@ final public function do_cleanup() {
$this->cleanup_attachments( $state );
$this->cleanup_widgets( $state );
$this->cleanup_plugins( $state );
Slug_Mapping::clear();

return delete_transient( Active_State::STATE_NAME );
}
Expand Down
39 changes: 36 additions & 3 deletions includes/Importers/Content_Importer.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use TIOB\Importers\Cleanup\Active_State;
use TIOB\Importers\Helpers\Helper;
use TIOB\Importers\Helpers\Importer_Alterator;
use TIOB\Importers\Helpers\Slug_Mapping;
use TIOB\Logger;
use TIOB\Importers\WP\WP_Import;
use WP_Error;
Expand Down Expand Up @@ -221,15 +222,15 @@ public function setup_front_page( $args, $demo_slug ) {
update_option( 'show_on_front', 'page' );

if ( isset( $args['front_page'] ) && $args['front_page'] !== null ) {
$front_page_obj = get_page_by_path( $this->cleanup_page_slug( $args['front_page'], $demo_slug ) );
$front_page_obj = $this->get_imported_page_by_slug( $args['front_page'], $demo_slug );
if ( isset( $front_page_obj->ID ) ) {
$front_page_options['page_on_front'] = get_option( 'page_on_front' );
update_option( 'page_on_front', $front_page_obj->ID );
}
}

if ( isset( $args['blog_page'] ) && $args['blog_page'] !== null ) {
$blog_page_obj = get_page_by_path( $this->cleanup_page_slug( $args['blog_page'], $demo_slug ) );
$blog_page_obj = $this->get_imported_page_by_slug( $args['blog_page'], $demo_slug );
if ( isset( $blog_page_obj->ID ) ) {
$front_page_options['page_for_posts'] = get_option( 'page_for_posts' );
update_option( 'page_for_posts', $blog_page_obj->ID );
Expand Down Expand Up @@ -266,7 +267,7 @@ public function setup_shop_pages( $pages, $demo_slug ) {
$shop_page_options = array();
foreach ( $pages as $option_id => $slug ) {
if ( ! empty( $slug ) ) {
$page_object = get_page_by_path( $this->cleanup_page_slug( $slug, $demo_slug ) );
$page_object = $this->get_imported_page_by_slug( $slug, $demo_slug );
if ( isset( $page_object->ID ) ) {
$shop_page_options[ $option_id ] = get_option( $option_id );
update_option( $option_id, $page_object->ID );
Expand Down Expand Up @@ -414,6 +415,8 @@ public function maybe_rebuild_woo_product() {
* @return WP_Error|true
*/
public function import_file( $file_path, $req_body = array(), $builder = '' ) {
Slug_Mapping::clear();

if ( empty( $file_path ) || ! file_exists( $file_path ) || ! is_readable( $file_path ) ) {
return new WP_Error( 'ti__ob_content_err_1', 'No content file' );
}
Expand All @@ -424,6 +427,36 @@ public function import_file( $file_path, $req_body = array(), $builder = '' ) {
return $importer->import( $file_path );
}

/**
* Get imported page object by old slug.
*
* @param string $slug old page slug.
* @param string $demo_slug demo slug.
*
* @return \WP_Post|null
*/
private function get_imported_page_by_slug( $slug, $demo_slug ) {
$mapped_slug = Slug_Mapping::resolve_slug( $slug );
$page = get_page_by_path( $mapped_slug );
if ( $page instanceof \WP_Post ) {
return $page;
}

$normalized_slug = $this->normalize_page_slug( $slug, $demo_slug );
$page = get_page_by_path( $normalized_slug );
if ( $page instanceof \WP_Post ) {
return $page;
}

$legacy_hashed_slug = $this->cleanup_page_slug( $slug, $demo_slug );
$page = get_page_by_path( $legacy_hashed_slug );
if ( $page instanceof \WP_Post ) {
return $page;
}

return null;
}

/**
* Load the importer.
*/
Expand Down
97 changes: 92 additions & 5 deletions includes/Importers/Helpers/Helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,21 +101,108 @@ private function remap_host( $url ) {
*
* @param string $slug page slug.
* @param string $demo_slug demo slug.
* @param bool $check_collisions should check if slug collisions exist before hashing.
* @param array $reserved_slugs additional reserved slugs from current import run.
*
* @return string
*/
public function cleanup_page_slug( $slug, $demo_slug ) {
public function cleanup_page_slug( $slug, $demo_slug, $check_collisions = false, $reserved_slugs = array() ) {
$unhashed = array( 'shop', 'my-account', 'checkout', 'cart', 'blog', 'news', 'lifter-courses', 'courses', 'dashboard', 'my-courses', 'memberships' );
$slug = str_replace( $demo_slug, '', $slug );
$slug = str_replace( 'demo', '', $slug );
$slug = ltrim( $slug, '-' );
$slug = $this->normalize_page_slug( $slug, $demo_slug );

if ( $slug === '' ) {
$slug = sanitize_title( $demo_slug );
}

if ( in_array( $slug, $unhashed, true ) ) {
return $slug;
}

$hash = substr( md5( $demo_slug ), 0, 5 );
$slug = $hash . '-' . $slug;
if ( ! $check_collisions ) {
return $hash . '-' . $slug;
}

if ( ! $this->is_page_slug_taken( $slug, $reserved_slugs ) ) {
return $slug;
}

$hashed_slug = $hash . '-' . $slug;

if ( ! $this->is_page_slug_taken( $hashed_slug, $reserved_slugs ) ) {
return $hashed_slug;
}

return $this->generate_unique_page_slug( $hashed_slug, $reserved_slugs );
}

/**
* Normalize page slug before collision checks.
*
* @param string $slug page slug.
* @param string $demo_slug demo slug.
*
* @return string
*/
public function normalize_page_slug( $slug, $demo_slug ) {
$slug = str_replace( $demo_slug, '', $slug );
$slug = str_replace( 'demo', '', $slug );
$slug = ltrim( $slug, '-' );

return $slug;
}

/**
* Check if page slug is already taken.
*
* @param string $slug slug to check.
* @param array $reserved_slugs additional reserved slugs from current import.
*
* @return bool
*/
private function is_page_slug_taken( $slug, $reserved_slugs = array() ) {
if ( ! empty( $reserved_slugs ) && in_array( $slug, $reserved_slugs, true ) ) {
return true;
}

if ( $slug === '' ) {
return false;
}

return get_page_by_path( $slug, OBJECT, 'page' ) !== null;
}

/**
* Generate unique page slug.
*
* @param string $base_slug base slug.
* @param array $reserved_slugs additional reserved slugs from current import.
*
* @return string
*/
private function generate_unique_page_slug( $base_slug, $reserved_slugs = array() ) {
if ( function_exists( 'wp_unique_post_slug' ) ) {
$unique_slug = wp_unique_post_slug( $base_slug, 0, 'publish', 'page', 0 );
if ( ! in_array( $unique_slug, $reserved_slugs, true ) ) {
return $unique_slug;
}

$suffix = 2;
while ( in_array( $unique_slug, $reserved_slugs, true ) ) {
$unique_slug = wp_unique_post_slug( $base_slug . '-' . $suffix, 0, 'publish', 'page', 0 );
$suffix++;
}

return $unique_slug;
}

$suffix = 2;
$slug = $base_slug;

while ( $this->is_page_slug_taken( $slug, $reserved_slugs ) ) {
$slug = $base_slug . '-' . $suffix;
$suffix++;
}

return $slug;
}
Expand Down
29 changes: 26 additions & 3 deletions includes/Importers/Helpers/Importer_Alterator.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@


namespace TIOB\Importers\Helpers;

/**
* Class Importer_Alterator
*/
Expand Down Expand Up @@ -116,11 +117,31 @@ public function content_to_import( $content, $processed_terms ) {
* @return array
*/
public function drop_slug_and_prefix_pages( $posts ) {
$slug_map = array();
$reserved_slugs = array();

foreach ( $posts as $index => $post ) {
if ( $post['post_type'] !== 'page' ) {
continue;
}
$posts[ $index ]['post_name'] = $this->cleanup_page_slug( $post['post_name'], $this->site_json_data['demoSlug'] );

$old_slug = $post['post_name'];
$new_slug = $this->cleanup_page_slug(
$old_slug,
$this->site_json_data['demoSlug'],
true,
$reserved_slugs
);

$posts[ $index ]['post_name'] = $new_slug;
$reserved_slugs[] = $new_slug;
if ( ! isset( $slug_map[ $old_slug ] ) ) {
$slug_map[ $old_slug ] = $new_slug;
}
}

if ( ! empty( $slug_map ) ) {
Slug_Mapping::set_slug_map( $slug_map );
}

return $posts;
Expand All @@ -135,7 +156,8 @@ public function drop_slug_and_prefix_pages( $posts ) {
* @return array
*/
public function change_nav_menu_item_link( $args, $import_source_url ) {
$args['menu-item-url'] = str_replace( $import_source_url, get_home_url(), $args['menu-item-url'] );
Slug_Mapping::register_source_url( $import_source_url );
$args['menu-item-url'] = Slug_Mapping::rewrite_url( $args['menu-item-url'] );

return $args;
}
Expand All @@ -151,8 +173,9 @@ public function change_nav_menu_item_link( $args, $import_source_url ) {
* @return string
*/
public function replace_links( $content, $old_base_url ) {
$content = str_replace( $old_base_url, get_home_url(), $content );
Slug_Mapping::register_source_url( $old_base_url );
$content = $this->replace_image_urls( $content );
$content = Slug_Mapping::rewrite_value( $content );
return $content;
}

Expand Down
Loading
Loading