Helper.php
3 months ago
Importer_Alterator.php
3 months ago
Quiet_Skin.php
5 years ago
Quiet_Skin_Legacy.php
5 years ago
Slug_Mapping.php
3 months ago
Helper.php
210 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Themeisle Onboarding Trait |
| 4 | * |
| 5 | * @package templates-patterns-collection |
| 6 | */ |
| 7 | |
| 8 | namespace TIOB\Importers\Helpers; |
| 9 | |
| 10 | trait Helper { |
| 11 | /** |
| 12 | * A list of allowed mimes. |
| 13 | * |
| 14 | * @var array |
| 15 | */ |
| 16 | protected $extensions = array( |
| 17 | 'jpg|jpeg|jpe' => 'image/jpeg', |
| 18 | 'png' => 'image/png', |
| 19 | 'webp' => 'image/webp', |
| 20 | 'svg' => 'image/svg+xml', |
| 21 | ); |
| 22 | |
| 23 | /** |
| 24 | * Replace demo urls in meta with site urls. |
| 25 | */ |
| 26 | public function replace_image_urls( $markup ) { |
| 27 | // Get all slashed and un-slashed urls. |
| 28 | $old_urls = $this->get_urls_to_replace( $markup ); |
| 29 | if ( ! is_array( $old_urls ) || empty( $old_urls ) ) { |
| 30 | return $markup; |
| 31 | } |
| 32 | |
| 33 | // Create an associative array. |
| 34 | $urls = array_combine( $old_urls, $old_urls ); |
| 35 | // Unslash values of associative array. |
| 36 | $urls = array_map( 'wp_unslash', $urls ); |
| 37 | // Remap host and directory path. |
| 38 | $urls = array_map( array( $this, 'remap_host' ), $urls ); |
| 39 | // Replace image urls in meta. |
| 40 | $markup = str_replace( array_keys( $urls ), array_values( $urls ), $markup ); |
| 41 | |
| 42 | return $markup; |
| 43 | } |
| 44 | |
| 45 | /** |
| 46 | * Get url replace array. |
| 47 | * |
| 48 | * @return array |
| 49 | */ |
| 50 | private function get_urls_to_replace( $markup ) { |
| 51 | $regex = '/(?:http(?:s?):)(?:[\/\\\\\\\\|.|\w|\s|-])*\.(?:' . implode( '|', array_keys( $this->extensions ) ) . ')/m'; |
| 52 | |
| 53 | if ( ! is_string( $markup ) ) { |
| 54 | return array(); |
| 55 | } |
| 56 | |
| 57 | preg_match_all( $regex, $markup, $urls ); |
| 58 | |
| 59 | $urls = array_map( |
| 60 | function ( $value ) { |
| 61 | return rtrim( html_entity_decode( $value ), '\\' ); |
| 62 | }, |
| 63 | $urls[0] |
| 64 | ); |
| 65 | |
| 66 | $urls = array_unique( $urls ); |
| 67 | |
| 68 | return array_values( $urls ); |
| 69 | } |
| 70 | |
| 71 | /** |
| 72 | * Remap URLs host. |
| 73 | * |
| 74 | * @param $url |
| 75 | * |
| 76 | * @return string |
| 77 | */ |
| 78 | private function remap_host( $url ) { |
| 79 | if ( ! strpos( $url, '/uploads/' ) ) { |
| 80 | return $url; |
| 81 | } |
| 82 | $old_url = $url; |
| 83 | $url_parts = parse_url( $url ); |
| 84 | |
| 85 | if ( ! isset( $url_parts['host'] ) ) { |
| 86 | return $url; |
| 87 | } |
| 88 | $url_parts['path'] = preg_split( '/\//', $url_parts['path'] ); |
| 89 | $url_parts['path'] = array_slice( $url_parts['path'], - 3 ); |
| 90 | |
| 91 | $uploads_dir = wp_get_upload_dir(); |
| 92 | $uploads_url = $uploads_dir['baseurl']; |
| 93 | |
| 94 | $new_url = esc_url( $uploads_url . '/' . join( '/', $url_parts['path'] ) ); |
| 95 | |
| 96 | return str_replace( $old_url, $new_url, $url ); |
| 97 | } |
| 98 | |
| 99 | /** |
| 100 | * Hash the demo slug and prefix the page name with it. Drop words like demo, neve, or the demo slug from page slug. |
| 101 | * |
| 102 | * @param string $slug page slug. |
| 103 | * @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. |
| 106 | * |
| 107 | * @return string |
| 108 | */ |
| 109 | public function cleanup_page_slug( $slug, $demo_slug, $check_collisions = false, $reserved_slugs = array() ) { |
| 110 | $unhashed = array( 'shop', 'my-account', 'checkout', 'cart', 'blog', 'news', 'lifter-courses', 'courses', 'dashboard', 'my-courses', 'memberships' ); |
| 111 | $slug = $this->normalize_page_slug( $slug, $demo_slug ); |
| 112 | |
| 113 | if ( $slug === '' ) { |
| 114 | $slug = sanitize_title( $demo_slug ); |
| 115 | } |
| 116 | |
| 117 | if ( in_array( $slug, $unhashed, true ) ) { |
| 118 | return $slug; |
| 119 | } |
| 120 | |
| 121 | $hash = substr( md5( $demo_slug ), 0, 5 ); |
| 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 | } |
| 206 | |
| 207 | return $slug; |
| 208 | } |
| 209 | } |
| 210 |