Skip to content

Commit adef3f6

Browse files
authored
Merge pull request #455 from Codeinwp/fix/remap-urls
feat: integrate Slug Mapping functionality across importers
2 parents 093e9f9 + 60404c8 commit adef3f6

14 files changed

Lines changed: 1037 additions & 29 deletions

includes/Importers/Cleanup/Manager.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99
namespace TIOB\Importers\Cleanup;
1010

11+
use TIOB\Importers\Helpers\Slug_Mapping;
1112
use TIOB\Importers\Plugin_Importer;
1213

1314
/**
@@ -293,6 +294,7 @@ final public function do_cleanup() {
293294
$this->cleanup_attachments( $state );
294295
$this->cleanup_widgets( $state );
295296
$this->cleanup_plugins( $state );
297+
Slug_Mapping::clear();
296298

297299
return delete_transient( Active_State::STATE_NAME );
298300
}

includes/Importers/Content_Importer.php

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use TIOB\Importers\Cleanup\Active_State;
1212
use TIOB\Importers\Helpers\Helper;
1313
use TIOB\Importers\Helpers\Importer_Alterator;
14+
use TIOB\Importers\Helpers\Slug_Mapping;
1415
use TIOB\Logger;
1516
use TIOB\Importers\WP\WP_Import;
1617
use WP_Error;
@@ -221,15 +222,15 @@ public function setup_front_page( $args, $demo_slug ) {
221222
update_option( 'show_on_front', 'page' );
222223

223224
if ( isset( $args['front_page'] ) && $args['front_page'] !== null ) {
224-
$front_page_obj = get_page_by_path( $this->cleanup_page_slug( $args['front_page'], $demo_slug ) );
225+
$front_page_obj = $this->get_imported_page_by_slug( $args['front_page'], $demo_slug );
225226
if ( isset( $front_page_obj->ID ) ) {
226227
$front_page_options['page_on_front'] = get_option( 'page_on_front' );
227228
update_option( 'page_on_front', $front_page_obj->ID );
228229
}
229230
}
230231

231232
if ( isset( $args['blog_page'] ) && $args['blog_page'] !== null ) {
232-
$blog_page_obj = get_page_by_path( $this->cleanup_page_slug( $args['blog_page'], $demo_slug ) );
233+
$blog_page_obj = $this->get_imported_page_by_slug( $args['blog_page'], $demo_slug );
233234
if ( isset( $blog_page_obj->ID ) ) {
234235
$front_page_options['page_for_posts'] = get_option( 'page_for_posts' );
235236
update_option( 'page_for_posts', $blog_page_obj->ID );
@@ -266,7 +267,7 @@ public function setup_shop_pages( $pages, $demo_slug ) {
266267
$shop_page_options = array();
267268
foreach ( $pages as $option_id => $slug ) {
268269
if ( ! empty( $slug ) ) {
269-
$page_object = get_page_by_path( $this->cleanup_page_slug( $slug, $demo_slug ) );
270+
$page_object = $this->get_imported_page_by_slug( $slug, $demo_slug );
270271
if ( isset( $page_object->ID ) ) {
271272
$shop_page_options[ $option_id ] = get_option( $option_id );
272273
update_option( $option_id, $page_object->ID );
@@ -414,6 +415,8 @@ public function maybe_rebuild_woo_product() {
414415
* @return WP_Error|true
415416
*/
416417
public function import_file( $file_path, $req_body = array(), $builder = '' ) {
418+
Slug_Mapping::clear();
419+
417420
if ( empty( $file_path ) || ! file_exists( $file_path ) || ! is_readable( $file_path ) ) {
418421
return new WP_Error( 'ti__ob_content_err_1', 'No content file' );
419422
}
@@ -424,6 +427,36 @@ public function import_file( $file_path, $req_body = array(), $builder = '' ) {
424427
return $importer->import( $file_path );
425428
}
426429

430+
/**
431+
* Get imported page object by old slug.
432+
*
433+
* @param string $slug old page slug.
434+
* @param string $demo_slug demo slug.
435+
*
436+
* @return \WP_Post|null
437+
*/
438+
private function get_imported_page_by_slug( $slug, $demo_slug ) {
439+
$mapped_slug = Slug_Mapping::resolve_slug( $slug );
440+
$page = get_page_by_path( $mapped_slug );
441+
if ( $page instanceof \WP_Post ) {
442+
return $page;
443+
}
444+
445+
$normalized_slug = $this->normalize_page_slug( $slug, $demo_slug );
446+
$page = get_page_by_path( $normalized_slug );
447+
if ( $page instanceof \WP_Post ) {
448+
return $page;
449+
}
450+
451+
$legacy_hashed_slug = $this->cleanup_page_slug( $slug, $demo_slug );
452+
$page = get_page_by_path( $legacy_hashed_slug );
453+
if ( $page instanceof \WP_Post ) {
454+
return $page;
455+
}
456+
457+
return null;
458+
}
459+
427460
/**
428461
* Load the importer.
429462
*/

includes/Importers/Helpers/Helper.php

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,21 +101,108 @@ private function remap_host( $url ) {
101101
*
102102
* @param string $slug page slug.
103103
* @param string $demo_slug demo slug.
104+
* @param bool $check_collisions should check if slug collisions exist before hashing.
105+
* @param array $reserved_slugs additional reserved slugs from current import run.
104106
*
105107
* @return string
106108
*/
107-
public function cleanup_page_slug( $slug, $demo_slug ) {
109+
public function cleanup_page_slug( $slug, $demo_slug, $check_collisions = false, $reserved_slugs = array() ) {
108110
$unhashed = array( 'shop', 'my-account', 'checkout', 'cart', 'blog', 'news', 'lifter-courses', 'courses', 'dashboard', 'my-courses', 'memberships' );
109-
$slug = str_replace( $demo_slug, '', $slug );
110-
$slug = str_replace( 'demo', '', $slug );
111-
$slug = ltrim( $slug, '-' );
111+
$slug = $this->normalize_page_slug( $slug, $demo_slug );
112+
113+
if ( $slug === '' ) {
114+
$slug = sanitize_title( $demo_slug );
115+
}
112116

113117
if ( in_array( $slug, $unhashed, true ) ) {
114118
return $slug;
115119
}
116120

117121
$hash = substr( md5( $demo_slug ), 0, 5 );
118-
$slug = $hash . '-' . $slug;
122+
if ( ! $check_collisions ) {
123+
return $hash . '-' . $slug;
124+
}
125+
126+
if ( ! $this->is_page_slug_taken( $slug, $reserved_slugs ) ) {
127+
return $slug;
128+
}
129+
130+
$hashed_slug = $hash . '-' . $slug;
131+
132+
if ( ! $this->is_page_slug_taken( $hashed_slug, $reserved_slugs ) ) {
133+
return $hashed_slug;
134+
}
135+
136+
return $this->generate_unique_page_slug( $hashed_slug, $reserved_slugs );
137+
}
138+
139+
/**
140+
* Normalize page slug before collision checks.
141+
*
142+
* @param string $slug page slug.
143+
* @param string $demo_slug demo slug.
144+
*
145+
* @return string
146+
*/
147+
public function normalize_page_slug( $slug, $demo_slug ) {
148+
$slug = str_replace( $demo_slug, '', $slug );
149+
$slug = str_replace( 'demo', '', $slug );
150+
$slug = ltrim( $slug, '-' );
151+
152+
return $slug;
153+
}
154+
155+
/**
156+
* Check if page slug is already taken.
157+
*
158+
* @param string $slug slug to check.
159+
* @param array $reserved_slugs additional reserved slugs from current import.
160+
*
161+
* @return bool
162+
*/
163+
private function is_page_slug_taken( $slug, $reserved_slugs = array() ) {
164+
if ( ! empty( $reserved_slugs ) && in_array( $slug, $reserved_slugs, true ) ) {
165+
return true;
166+
}
167+
168+
if ( $slug === '' ) {
169+
return false;
170+
}
171+
172+
return get_page_by_path( $slug, OBJECT, 'page' ) !== null;
173+
}
174+
175+
/**
176+
* Generate unique page slug.
177+
*
178+
* @param string $base_slug base slug.
179+
* @param array $reserved_slugs additional reserved slugs from current import.
180+
*
181+
* @return string
182+
*/
183+
private function generate_unique_page_slug( $base_slug, $reserved_slugs = array() ) {
184+
if ( function_exists( 'wp_unique_post_slug' ) ) {
185+
$unique_slug = wp_unique_post_slug( $base_slug, 0, 'publish', 'page', 0 );
186+
if ( ! in_array( $unique_slug, $reserved_slugs, true ) ) {
187+
return $unique_slug;
188+
}
189+
190+
$suffix = 2;
191+
while ( in_array( $unique_slug, $reserved_slugs, true ) ) {
192+
$unique_slug = wp_unique_post_slug( $base_slug . '-' . $suffix, 0, 'publish', 'page', 0 );
193+
$suffix++;
194+
}
195+
196+
return $unique_slug;
197+
}
198+
199+
$suffix = 2;
200+
$slug = $base_slug;
201+
202+
while ( $this->is_page_slug_taken( $slug, $reserved_slugs ) ) {
203+
$slug = $base_slug . '-' . $suffix;
204+
$suffix++;
205+
}
119206

120207
return $slug;
121208
}

includes/Importers/Helpers/Importer_Alterator.php

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010

1111
namespace TIOB\Importers\Helpers;
12+
1213
/**
1314
* Class Importer_Alterator
1415
*/
@@ -116,11 +117,31 @@ public function content_to_import( $content, $processed_terms ) {
116117
* @return array
117118
*/
118119
public function drop_slug_and_prefix_pages( $posts ) {
120+
$slug_map = array();
121+
$reserved_slugs = array();
122+
119123
foreach ( $posts as $index => $post ) {
120124
if ( $post['post_type'] !== 'page' ) {
121125
continue;
122126
}
123-
$posts[ $index ]['post_name'] = $this->cleanup_page_slug( $post['post_name'], $this->site_json_data['demoSlug'] );
127+
128+
$old_slug = $post['post_name'];
129+
$new_slug = $this->cleanup_page_slug(
130+
$old_slug,
131+
$this->site_json_data['demoSlug'],
132+
true,
133+
$reserved_slugs
134+
);
135+
136+
$posts[ $index ]['post_name'] = $new_slug;
137+
$reserved_slugs[] = $new_slug;
138+
if ( ! isset( $slug_map[ $old_slug ] ) ) {
139+
$slug_map[ $old_slug ] = $new_slug;
140+
}
141+
}
142+
143+
if ( ! empty( $slug_map ) ) {
144+
Slug_Mapping::set_slug_map( $slug_map );
124145
}
125146

126147
return $posts;
@@ -135,7 +156,8 @@ public function drop_slug_and_prefix_pages( $posts ) {
135156
* @return array
136157
*/
137158
public function change_nav_menu_item_link( $args, $import_source_url ) {
138-
$args['menu-item-url'] = str_replace( $import_source_url, get_home_url(), $args['menu-item-url'] );
159+
Slug_Mapping::register_source_url( $import_source_url );
160+
$args['menu-item-url'] = Slug_Mapping::rewrite_url( $args['menu-item-url'] );
139161

140162
return $args;
141163
}
@@ -151,8 +173,9 @@ public function change_nav_menu_item_link( $args, $import_source_url ) {
151173
* @return string
152174
*/
153175
public function replace_links( $content, $old_base_url ) {
154-
$content = str_replace( $old_base_url, get_home_url(), $content );
176+
Slug_Mapping::register_source_url( $old_base_url );
155177
$content = $this->replace_image_urls( $content );
178+
$content = Slug_Mapping::rewrite_value( $content );
156179
return $content;
157180
}
158181

0 commit comments

Comments
 (0)