$tite_max_length ) { $title = '/' . $title . __( '...', 'wplingua' ); } else { $title = '/' . $title . '/'; } /** * Create the post and get this ID */ $new_post_id = wp_insert_post( array( 'post_title' => esc_html( $title ), 'post_type' => 'wplng_slug', 'post_status' => 'publish', 'post_name' => sanitize_title( 'wplingua-slug-' . md5( $title ) . '-' . $title ), ) ); if ( is_wp_error( $new_post_id ) || empty( $new_post_id ) ) { return false; } /** * Make $translation_meta */ $languages_target = wplng_get_languages_target_ids(); $slug_meta = array(); foreach ( $languages_target as $target_language ) { $slug_meta[] = array( 'language_id' => $target_language, 'translation' => $slug, 'status' => 'ungenerated', ); } add_post_meta( $new_post_id, 'wplng_slug_original', $slug ); add_post_meta( $new_post_id, 'wplng_slug_md5', md5( $slug ) ); add_post_meta( $new_post_id, 'wplng_slug_original_language_id', wplng_get_language_website_id() ); add_post_meta( $new_post_id, 'wplng_slug_translations', wp_json_encode( $slug_meta, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) ); wplng_clear_slugs_cache(); return $new_post_id; } /** * Get the count of published 'wplng_slug' posts. * * This function retrieves the number of posts of type 'wplng_slug' * that are currently published on the site. * * @return int The number of published 'wplng_slug' posts. */ function wplng_get_slug_count() { global $wplng_slug_count; if ( null !== $wplng_slug_count ) { return $wplng_slug_count; } $count_posts = wp_count_posts( 'wplng_slug' ); $wplng_slug_count = (int) ( $count_posts->publish ?? 0 ); return $wplng_slug_count; } /** * Get all saved slugs from a wp_query * * @return array */ function wplng_get_slugs_from_query() { $slug_to_delete = array(); $slugs = array(); $args = array( 'post_type' => 'wplng_slug', 'posts_per_page' => -1, 'no_found_rows' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'cache_results' => false, 'fields' => 'ids', // Only retrieve post IDs 'meta_query' => array( array( 'key' => 'wplng_slug_original_language_id', 'value' => wplng_get_language_website_id(), 'compare' => '=', ), ), ); // Get all slug IDs $post_ids = get_posts( $args ); if ( empty( $post_ids ) ) { return $slugs; } foreach ( $post_ids as $slug_id ) { $meta = get_post_meta( $slug_id ); // Check for valid source slug if ( ! isset( $meta['wplng_slug_original'][0] ) || ! is_string( $meta['wplng_slug_original'][0] ) ) { continue; } $source = sanitize_title( $meta['wplng_slug_original'][0] ); // Skip unwanted slugs and mark them for deletion if ( in_array( $source, array( 'index-php', 'wp-includes', 'wp-json', 'go', 'refer', 'recommend', 'recommends', ), true ) ) { $slug_to_delete[] = $slug_id; continue; } // Check for translations and build translation array if ( empty( $meta['wplng_slug_translations'][0] ) ) { continue; } $translations = array(); $translations_meta = json_decode( $meta['wplng_slug_translations'][0], true ); if ( ! is_array( $translations_meta ) ) { continue; } foreach ( $translations_meta as $translation_meta ) { // Validate language ID if ( empty( $translation_meta['language_id'] ) || ! wplng_is_valid_language_id( $translation_meta['language_id'] ) ) { continue; } $language_id = sanitize_key( $translation_meta['language_id'] ); // Check and validate slug translation if ( empty( $translation_meta['translation'] ) || ! is_string( $translation_meta['translation'] ) || $translation_meta['translation'] === '[WPLNG_EMPTY]' || $translation_meta['translation'] === $source ) { continue; } // Sanitize and add valid translation $translations[ $language_id ] = sanitize_title( $translation_meta['translation'] ); } // Add source and translations to slugs array $slugs[] = array( 'source' => $source, 'id' => $slug_id, 'translations' => $translations, ); } // Delete invalid slugs, limit to 32 deletions if ( ! empty( $slug_to_delete ) ) { foreach ( array_slice( $slug_to_delete, 0, 32 ) as $id ) { wp_delete_post( $id, true ); } // Cache slugs for 30 seconds after deletion set_transient( 'wplng_cached_slugs', $slugs, 30 ); } else { // Cache slugs for a month if no deletions occurred set_transient( 'wplng_cached_slugs', $slugs, MONTH_IN_SECONDS ); } return $slugs; } /** * Get the slug translations * * @return array Slug translations */ function wplng_get_slugs() { $slugs_from_cache = get_transient( 'wplng_cached_slugs' ); if ( ! is_array( $slugs_from_cache ) ) { return wplng_get_slugs_from_query(); } $slugs = array(); foreach ( $slugs_from_cache as $slug ) { if ( empty( $slug['source'] ) || ! is_string( $slug['source'] ) || ! is_array( $slug['translations'] ) ) { continue; } $translations = array(); $language_target_ids = wplng_get_languages_target_ids(); foreach ( $slug['translations'] as $language_id => $translation ) { if ( ! in_array( $language_id, $language_target_ids ) || ! is_string( $translation ) ) { continue; } $translations[ $language_id ] = $translation; } $slugs[] = array( 'source' => $slug['source'], 'translations' => $translations, ); } return $slugs; } /** * Get slug data from original slug * * @param string $original * @return array|false Translation data */ function wplng_get_slug_saved_from_original( $original ) { $original = trim( strtolower( $original ) ); if ( empty( $original ) ) { return false; } $args = array( 'post_type' => 'wplng_slug', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'wplng_slug_md5', 'value' => md5( $original ), 'compare' => '=', ), ), 'fields' => 'ids', 'meta_query' => array( array( 'key' => 'wplng_slug_original_language_id', 'value' => wplng_get_language_website_id(), 'compare' => '=', ), ), ); $posts = get_posts( $args ); if ( empty( $posts ) ) { return false; } foreach ( $posts as $post_id ) { $meta = get_post_meta( $post_id ); if ( isset( $meta['wplng_slug_original'][0] ) && is_string( $meta['wplng_slug_original'][0] ) && $meta['wplng_slug_original'][0] === $original ) { return get_post( $post_id ); } } return false; }