@@ -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 }
0 commit comments