From 7c6783f52f77877f773e189dac7d262d47532872 Mon Sep 17 00:00:00 2001 From: Tetrakern <26898880+Tetrakern@users.noreply.github.com> Date: Sun, 27 Oct 2024 22:44:09 +0100 Subject: [PATCH] Optimize blog story IDs validation --- includes/functions/_helpers-query.php | 49 ++++++++++++++++++++++- includes/functions/_setup-meta-fields.php | 26 +----------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/includes/functions/_helpers-query.php b/includes/functions/_helpers-query.php index c0a3f7e1..ac8a5812 100644 --- a/includes/functions/_helpers-query.php +++ b/includes/functions/_helpers-query.php @@ -512,12 +512,12 @@ if ( ! function_exists( 'fictioneer_sql_filter_valid_collection_ids' ) ) { // Prepare $item_ids = is_array( $item_ids ) ? $item_ids : [ $item_ids ]; $item_ids = array_map( 'intval', $item_ids ); + $item_ids = array_filter( $item_ids, function( $value ) { return $value > 0; } ); if ( empty( $item_ids ) ) { return []; } - $item_ids = array_filter( $item_ids, function( $value ) { return $value > 0; } ); $item_ids = array_unique( $item_ids ); // Exclude forbidden IDs @@ -559,6 +559,53 @@ if ( ! function_exists( 'fictioneer_sql_filter_valid_collection_ids' ) ) { } } +if ( ! function_exists( 'fictioneer_sql_filter_valid_blog_story_ids' ) ) { + /** + * Filters out non-valid blog story array IDs + * + * Note: This is a lot faster than using WP_Query(). + * + * @since 5.26.0 + * + * @global wpdb $wpdb WordPress database object. + * + * @param int $story_author_id Author ID of the story. + * @param int[] $story_blogs Array of story blog IDs. + * + * @return int[] Filtered and validated array of item IDs. + */ + + function fictioneer_sql_filter_valid_blog_story_ids( $story_author_id, $story_blogs ) { + global $wpdb; + + // Prepare + $story_blogs = is_array( $story_blogs ) ? $story_blogs : [ $story_blogs ]; + $story_blogs = array_map( 'intval', $story_blogs ); + $story_blogs = array_filter( $story_blogs, function( $value ) { return $value > 0; } ); + + if ( empty( $story_blogs ) ) { + return []; + } + + $story_blogs = array_unique( $story_blogs ); + + // Prepare placeholders + $placeholders = implode( ',', array_fill( 0, count( $story_blogs ), '%d' ) ); + + // Prepare SQL query + $sql = + "SELECT p.ID + FROM {$wpdb->posts} p + WHERE p.post_author = %d + AND p.ID IN ($placeholders) + AND p.post_type = 'fcn_story' + AND p.post_status IN ('publish', 'private', 'future')"; + + // Execute and return + return $wpdb->get_col( $wpdb->prepare( $sql, $story_author_id, ...$story_blogs ) ); + } +} + if ( ! function_exists( 'fictioneer_sql_has_new_story_chapters' ) ) { /** * Checks whether there any added chapters are to be considered "new". diff --git a/includes/functions/_setup-meta-fields.php b/includes/functions/_setup-meta-fields.php index 2548619c..2af2f597 100644 --- a/includes/functions/_setup-meta-fields.php +++ b/includes/functions/_setup-meta-fields.php @@ -3359,31 +3359,9 @@ function fictioneer_save_extra_metabox( $post_id ) { // Story blogs if ( isset( $_POST['fictioneer_post_story_blogs'] ) && $post_type === 'post' ) { $story_blogs = fictioneer_explode_list( $_POST['fictioneer_post_story_blogs'] ); + $story_blogs = fictioneer_sql_filter_valid_blog_story_ids( $post_author_id, $story_blogs ); - if ( ! empty( $story_blogs ) ) { - $story_blogs = array_map( 'absint', $story_blogs ); - $story_blogs = array_unique( $story_blogs ); - - // Ensure the stories belong to the post author - $blog_story_query = new WP_Query( - array( - 'author' => $post_author_id, - 'post_type' => 'fcn_story', - 'post_status' => ['publish', 'private'], - 'post__in' => $story_blogs ?: [0], // Must not be empty! - 'fields' => 'ids', - 'posts_per_page'=> -1, - 'update_post_meta_cache' => false, // Improve performance - 'update_post_term_cache' => false, // Improve performance - 'no_found_rows' => true // Improve performance - ) - ); - - $story_blogs = $blog_story_query->posts; - $story_blogs = array_map( 'strval', $story_blogs ); // Safer to match with LIKE in SQL - } - - $fields['fictioneer_post_story_blogs'] = $story_blogs; + $fields['fictioneer_post_story_blogs'] = array_map( 'strval', $story_blogs ); // Safer to match with LIKE in SQL } // Patreon