Make Sure Important Emails Reach Your Customers
Solve common email deliverability issues for good. Get WP Mail SMTP!
/** * Regenerate Thumbnails: Attachment regenerator class * * @package RegenerateThumbnails * @since 3.0.0 */ /** * Regenerates the thumbnails for a given attachment. * * @since 3.0.0 */ class RegenerateThumbnails_Regenerator { /** * The WP_Post object for the attachment that is being operated on. * * @since 3.0.0 * * @var WP_Post */ public $attachment; /** * The full path to the original image so that it can be passed between methods. * * @since 3.0.0 * * @var string */ public $fullsizepath; /** * An array of thumbnail size(s) that were skipped during regeneration due to already existing. * A class variable is used so that the data can later be used to merge the size(s) back in. * * @since 3.0.0 * * @var array */ public $skipped_thumbnails = array(); /** * The metadata for the attachment before the regeneration process starts. * * @since 3.1.6 * * @var array */ private $old_metadata = array(); /** * Generates an instance of this class after doing some setup. * * MIME type is purposefully not validated in order to be more future proof and * to avoid duplicating a ton of logic that already exists in WordPress core. * * @since 3.0.0 * * @param int $attachment_id Attachment ID to process. * * @return RegenerateThumbnails_Regenerator|WP_Error A new instance of RegenerateThumbnails_Regenerator on success, or WP_Error on error. */ public static function get_instance( $attachment_id ) { $attachment = get_post( $attachment_id ); if ( ! $attachment ) { return new WP_Error( 'regenerate_thumbnails_regenerator_attachment_doesnt_exist', __( 'No attachment exists with that ID.', 'regenerate-thumbnails' ), array( 'status' => 404, ) ); } // We can only regenerate thumbnails for attachments. if ( 'attachment' !== get_post_type( $attachment ) ) { return new WP_Error( 'regenerate_thumbnails_regenerator_not_attachment', __( 'This item is not an attachment.', 'regenerate-thumbnails' ), array( 'status' => 400, ) ); } // Don't touch any attachments that are being used as a site icon. Their thumbnails are usually custom cropped. if ( self::is_site_icon( $attachment ) ) { return new WP_Error( 'regenerate_thumbnails_regenerator_is_site_icon', __( "This attachment is a site icon and therefore the thumbnails shouldn't be touched.", 'regenerate-thumbnails' ), array( 'status' => 415, 'attachment' => $attachment, ) ); } return new RegenerateThumbnails_Regenerator( $attachment ); } /** * The constructor for this class. Don't call this directly, see get_instance() instead. * This is done so that WP_Error objects can be returned during class initiation. * * @since 3.0.0 * * @param WP_Post $attachment The WP_Post object for the attachment that is being operated on. */ private function __construct( WP_Post $attachment ) { $this->attachment = $attachment; } /** * Returns whether the attachment is or was a site icon. * * @since 3.0.0 * * @param WP_Post $attachment The WP_Post object for the attachment that is being operated on. * * @return bool Whether the attachment is or was a site icon. */ public static function is_site_icon( WP_Post $attachment ) { return ( 'site-icon' === get_post_meta( $attachment->ID, '_wp_attachment_context', true ) ); } /** * Get the path to the fullsize attachment. * * @return string|WP_Error The path to the fullsize attachment, or a WP_Error object on error. */ public function get_fullsizepath() { if ( $this->fullsizepath ) { return $this->fullsizepath; } if ( function_exists( 'wp_get_original_image_path' ) ) { $this->fullsizepath = wp_get_original_image_path( $this->attachment->ID ); } else { $this->fullsizepath = get_attached_file( $this->attachment->ID ); } if ( false === $this->fullsizepath || ! file_exists( $this->fullsizepath ) ) { $error = new WP_Error( 'regenerate_thumbnails_regenerator_file_not_found', sprintf( /* translators: The relative upload path to the attachment. */ __( "The fullsize image file cannot be found in your uploads directory at %s. Without it, new thumbnail images can't be generated.", 'regenerate-thumbnails' ), _wp_relative_upload_path( $this->fullsizepath ) ), array( 'status' => 404, 'fullsizepath' => _wp_relative_upload_path( $this->fullsizepath ), 'attachment' => $this->attachment, ) ); $this->fullsizepath = $error; } return $this->fullsizepath; } /** * Regenerate the thumbnails for this instance's attachment. * * @since 3.0.0 * * @param array|string $args { * Optional. Array or string of arguments for thumbnail regeneration. * * @type bool $only_regenerate_missing_thumbnails Skip regenerating existing thumbnail files. Default true. * @type bool $delete_unregistered_thumbnail_files Delete any thumbnail sizes that are no longer registered. Default false. * } * * @return mixed|WP_Error Metadata for attachment (see wp_generate_attachment_metadata()), or WP_Error on error. */ public function regenerate( $args = array() ) { global $wpdb; $args = wp_parse_args( $args, array( 'only_regenerate_missing_thumbnails' => true, 'delete_unregistered_thumbnail_files' => false, ) ); $fullsizepath = $this->get_fullsizepath(); if ( is_wp_error( $fullsizepath ) ) { $fullsizepath->add_data( array( 'attachment' => $this->attachment ) ); return $fullsizepath; } $this->old_metadata = wp_get_attachment_metadata( $this->attachment->ID ); if ( $args['only_regenerate_missing_thumbnails'] ) { add_filter( 'intermediate_image_sizes_advanced', array( $this, 'filter_image_sizes_to_only_missing_thumbnails' ), 10, 2 ); } require_once( ABSPATH . 'wp-admin/includes/admin.php' ); $new_metadata = wp_generate_attachment_metadata( $this->attachment->ID, $fullsizepath ); if ( $args['only_regenerate_missing_thumbnails'] ) { // Thumbnail sizes that existed were removed and need to be added back to the metadata. foreach ( $this->skipped_thumbnails as $skipped_thumbnail ) { if ( ! empty( $this->old_metadata['sizes'][ $skipped_thumbnail ] ) ) { $new_metadata['sizes'][ $skipped_thumbnail ] = $this->old_metadata['sizes'][ $skipped_thumbnail ]; } } $this->skipped_thumbnails = array(); remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'filter_image_sizes_to_only_missing_thumbnails' ), 10 ); } $wp_upload_dir = dirname( $fullsizepath ) . DIRECTORY_SEPARATOR; if ( $args['delete_unregistered_thumbnail_files'] ) { // Delete old sizes that are still in the metadata. $intermediate_image_sizes = get_intermediate_image_sizes(); foreach ( $this->old_metadata['sizes'] as $old_size => $old_size_data ) { if ( in_array( $old_size, $intermediate_image_sizes ) ) { continue; } wp_delete_file( $wp_upload_dir . $old_size_data['file'] ); unset( $new_metadata['sizes'][ $old_size ] ); } $relative_path = dirname( $new_metadata['file'] ) . DIRECTORY_SEPARATOR; // It's possible to upload an image with a filename like image-123x456.jpg and it shouldn't be deleted. $whitelist = $wpdb->get_col( $wpdb->prepare( " SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_wp_attached_file' AND meta_value REGEXP %s /* Regenerate Thumbnails */ ", '^' . preg_quote( $relative_path ) . '[^' . preg_quote( DIRECTORY_SEPARATOR ) . ']+-[0-9]+x[0-9]+\.' ) ); $whitelist = array_map( 'basename', $whitelist ); $filelist = array(); foreach ( scandir( $wp_upload_dir ) as $file ) { if ( '.' == $file || '..' == $file || ! is_file( $wp_upload_dir . $file ) ) { continue; } $filelist[] = $file; } $registered_thumbnails = array(); foreach ( $new_metadata['sizes'] as $size ) { $registered_thumbnails[] = $size['file']; } $fullsize_parts = pathinfo( $fullsizepath ); foreach ( $filelist as $file ) { if ( in_array( $file, $whitelist ) || in_array( $file, $registered_thumbnails ) ) { continue; } if ( ! preg_match( '#^' . preg_quote( $fullsize_parts['filename'], '#' ) . '-[0-9]+x[0-9]+\.' . preg_quote( $fullsize_parts['extension'], '#' ) . '$#', $file ) ) { continue; } wp_delete_file( $wp_upload_dir . $file ); } } elseif ( ! empty( $this->old_metadata ) && ! empty( $this->old_metadata['sizes'] ) && is_array( $this->old_metadata['sizes'] ) ) { // If not deleting, rename any size conflicts to avoid them being lost if the file still exists. foreach ( $this->old_metadata['sizes'] as $old_size => $old_size_data ) { if ( empty( $new_metadata['sizes'][ $old_size ] ) ) { $new_metadata['sizes'][ $old_size ] = $this->old_metadata['sizes'][ $old_size ]; continue; } $new_size_data = $new_metadata['sizes'][ $old_size ]; if ( $new_size_data['width'] !== $old_size_data['width'] && $new_size_data['height'] !== $old_size_data['height'] && file_exists( $wp_upload_dir . $old_size_data['file'] ) ) { $new_metadata['sizes'][ $old_size . '_old_' . $old_size_data['width'] . 'x' . $old_size_data['height'] ] = $old_size_data; } } } wp_update_attachment_metadata( $this->attachment->ID, $new_metadata ); return $new_metadata; } /** * Filters the list of thumbnail sizes to only include those which have missing files. * * @since 3.0.0 * * @param array $sizes An associative array of registered thumbnail image sizes. * @param array $fullsize_metadata An associative array of fullsize image metadata: width, height, file. * * @return array An associative array of image sizes. */ public function filter_image_sizes_to_only_missing_thumbnails( $sizes, $fullsize_metadata ) { if ( ! $sizes ) { return $sizes; } $fullsizepath = $this->get_fullsizepath(); if ( is_wp_error( $fullsizepath ) ) { return $sizes; } $editor = wp_get_image_editor( $fullsizepath ); if ( is_wp_error( $editor ) ) { return $sizes; } $metadata = $this->old_metadata; // This is based on WP_Image_Editor_GD::multi_resize() and others. foreach ( $sizes as $size => $size_data ) { if ( empty( $metadata['sizes'][ $size ] ) ) { continue; } if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { continue; } if ( ! isset( $size_data['width'] ) ) { $size_data['width'] = null; } if ( ! isset( $size_data['height'] ) ) { $size_data['height'] = null; } if ( ! isset( $size_data['crop'] ) ) { $size_data['crop'] = false; } $thumbnail = $this->get_thumbnail( $editor, $fullsize_metadata['width'], $fullsize_metadata['height'], $size_data['width'], $size_data['height'], $size_data['crop'] ); // The false check filters out thumbnails that would be larger than the fullsize image. // The size comparison makes sure that the size is also correct. if ( false === $thumbnail || ( $thumbnail['width'] === $metadata['sizes'][ $size ]['width'] && $thumbnail['height'] === $metadata['sizes'][ $size ]['height'] && file_exists( $thumbnail['filename'] ) ) ) { $this->skipped_thumbnails[] = $size; unset( $sizes[ $size ] ); } } /** * Filters the list of missing thumbnail sizes if you want to add/remove any. * * @since 3.1.0 * * @param array $sizes An associative array of image sizes that are missing. * @param array $fullsize_metadata An associative array of fullsize image metadata: width, height, file. * @param object $this The current instance of this class. * * @return array An associative array of image sizes. */ return apply_filters( 'regenerate_thumbnails_missing_thumbnails', $sizes, $fullsize_metadata, $this ); } /** * Generate the thumbnail filename and dimensions for a given set of constraint dimensions. * * @since 3.0.0 * * @param WP_Image_Editor|WP_Error $editor An instance of WP_Image_Editor, as returned by wp_get_image_editor(). * @param int $fullsize_width The width of the fullsize image. * @param int $fullsize_height The height of the fullsize image. * @param int $thumbnail_width The width of the thumbnail. * @param int $thumbnail_height The height of the thumbnail. * @param bool $crop Whether to crop or not. * * @return array|false An array of the filename, thumbnail width, and thumbnail height, * or false on failure to resize such as the thumbnail being larger than the fullsize image. */ public function get_thumbnail( $editor, $fullsize_width, $fullsize_height, $thumbnail_width, $thumbnail_height, $crop ) { $dims = image_resize_dimensions( $fullsize_width, $fullsize_height, $thumbnail_width, $thumbnail_height, $crop ); if ( ! $dims ) { return false; } list( , , , , $dst_w, $dst_h ) = $dims; $suffix = "{$dst_w}x{$dst_h}"; $file_ext = strtolower( pathinfo( $this->get_fullsizepath(), PATHINFO_EXTENSION ) ); return array( 'filename' => $editor->generate_filename( $suffix, null, $file_ext ), 'width' => $dst_w, 'height' => $dst_h, ); } /** * Update the post content of any public post types (posts and pages by default) * that make use of this attachment. * * @since 3.0.0 * * @param array|string $args { * Optional. Array or string of arguments for controlling the updating. * * @type array $post_type The post types to update. Defaults to public post types (posts and pages by default). * @type array $post_ids Specific post IDs to update as opposed to any that uses the attachment. * @type int $posts_per_loop How many posts to query at a time to keep memory usage down. You shouldn't need to modify this. * } * * @return array|WP_Error List of post IDs that were modified. The key is the post ID and the value is either the post ID again or a WP_Error object if wp_update_post() failed. */ public function update_usages_in_posts( $args = array() ) { // Temporarily disabled until it can be even better tested for edge cases return array(); $args = wp_parse_args( $args, array( 'post_type' => array(), 'post_ids' => array(), 'posts_per_loop' => 10, ) ); if ( empty( $args['post_type'] ) ) { $args['post_type'] = array_values( get_post_types( array( 'public' => true ) ) ); unset( $args['post_type']['attachment'] ); } $offset = 0; $posts_updated = array(); while ( true ) { $posts = get_posts( array( 'numberposts' => $args['posts_per_loop'], 'offset' => $offset, 'orderby' => 'ID', 'order' => 'ASC', 'include' => $args['post_ids'], 'post_type' => $args['post_type'], 's' => 'wp-image-' . $this->attachment->ID, // For faster queries. 'update_post_meta_cache' => false, 'update_post_term_cache' => false, ) ); if ( ! $posts ) { break; } $offset += $args['posts_per_loop']; foreach ( $posts as $post ) { $content = $post->post_content; $search = array(); $replace = array(); // Find all tags for this attachment and update them. preg_match_all( '#]+wp-image-' . $this->attachment->ID . '[^>]+/>#i', $content, $matches, PREG_SET_ORDER ); if ( $matches ) { foreach ( $matches as $img_tag ) { preg_match( '# class="([^"]+)?size-([^" ]+)#i', $img_tag[0], $thumbnail_size ); if ( $thumbnail_size ) { $thumbnail = image_downsize( $this->attachment->ID, $thumbnail_size[2] ); if ( ! $thumbnail ) { continue; } $search[] = $img_tag[0]; $img_tag[0] = preg_replace( '# src="[^"]+"#i', ' src="' . esc_url( $thumbnail[0] ) . '"', $img_tag[0] ); $img_tag[0] = preg_replace( '# width="[^"]+" height="[^"]+"#i', ' width="' . esc_attr( $thumbnail[1] ) . '" height="' . esc_attr( $thumbnail[2] ) . '"', $img_tag[0] ); $replace[] = $img_tag[0]; } } } $content = str_replace( $search, $replace, $content ); $search = array(); $replace = array(); // Update the width in any [caption] shortcodes. preg_match_all( '#\[caption id="attachment_' . $this->attachment->ID . '"([^\]]+)? width="[^"]+"\]([^\[]+)size-([^" ]+)([^\[]+)\[\/caption\]#i', $content, $matches, PREG_SET_ORDER ); if ( $matches ) { foreach ( $matches as $match ) { $thumbnail = image_downsize( $this->attachment->ID, $match[3] ); if ( ! $thumbnail ) { continue; } $search[] = $match[0]; $replace[] = '[caption id="attachment_' . $this->attachment->ID . '"' . $match[1] . ' width="' . esc_attr( $thumbnail[1] ) . '"]' . $match[2] . 'size-' . $match[3] . $match[4] . '[/caption]'; } } $content = str_replace( $search, $replace, $content ); $updated_post_object = (object) array( 'ID' => $post->ID, 'post_content' => $content, ); $posts_updated[ $post->ID ] = wp_update_post( $updated_post_object, true ); } } return $posts_updated; } /** * Returns information about the current attachment for use in the REST API. * * @since 3.0.0 * * @return array|WP_Error The attachment name, fullsize URL, registered thumbnail size status, and any unregistered sizes, or WP_Error on error. */ public function get_attachment_info() { $fullsizepath = $this->get_fullsizepath(); if ( is_wp_error( $fullsizepath ) ) { $fullsizepath->add_data( array( 'attachment' => $this->attachment ) ); return $fullsizepath; } $editor = wp_get_image_editor( $fullsizepath ); if ( is_wp_error( $editor ) ) { // Display a more helpful error message. if ( 'image_no_editor' === $editor->get_error_code() ) { $editor = new WP_Error( 'image_no_editor', __( 'The current image editor cannot process this file type.', 'regenerate-thumbnails' ) ); } $editor->add_data( array( 'attachment' => $this->attachment, 'status' => 415, ) ); return $editor; } $metadata = wp_get_attachment_metadata( $this->attachment->ID ); if ( false === $metadata || ! is_array( $metadata ) ) { return new WP_Error( 'regenerate_thumbnails_regenerator_no_metadata', __( 'Unable to load the metadata for this attachment.', 'regenerate-thumbnails' ), array( 'status' => 404, 'attachment' => $this->attachment, ) ); } if ( ! isset( $metadata['sizes'] ) ) { $metadata['sizes'] = array(); } // PDFs don't have width/height set. $width = ( isset( $metadata['width'] ) ) ? $metadata['width'] : null; $height = ( isset( $metadata['height'] ) ) ? $metadata['height'] : null; require_once( ABSPATH . '/wp-admin/includes/image.php' ); $preview = false; if ( file_is_displayable_image( $fullsizepath ) ) { $preview = wp_get_attachment_url( $this->attachment->ID ); } elseif ( is_array( $metadata['sizes'] ) && is_array( $metadata['sizes']['full'] ) && ! empty( $metadata['sizes']['full']['file'] ) ) { $preview = str_replace( wp_basename( $fullsizepath ), $metadata['sizes']['full']['file'], wp_get_attachment_url( $this->attachment->ID ) ); if ( ! file_exists( $preview ) ) { $preview = false; } } $response = array( 'name' => ( $this->attachment->post_title ) ? $this->attachment->post_title : sprintf( __( 'Attachment %d', 'regenerate-thumbnails' ), $this->attachment->ID ), 'preview' => $preview, 'relative_path' => _wp_get_attachment_relative_path( $fullsizepath ) . DIRECTORY_SEPARATOR . wp_basename( $fullsizepath ), 'edit_url' => get_edit_post_link( $this->attachment->ID, 'raw' ), 'width' => $width, 'height' => $height, 'registered_sizes' => array(), 'unregistered_sizes' => array(), ); $wp_upload_dir = dirname( $fullsizepath ) . DIRECTORY_SEPARATOR; $registered_sizes = RegenerateThumbnails()->get_thumbnail_sizes(); if ( 'application/pdf' === get_post_mime_type( $this->attachment ) ) { $registered_sizes = array_intersect_key( $registered_sizes, array( 'thumbnail' => true, 'medium' => true, 'large' => true, ) ); } // Check the status of all currently registered sizes. foreach ( $registered_sizes as $size ) { // Width and height are needed to generate the thumbnail filename. if ( $width && $height ) { $thumbnail = $this->get_thumbnail( $editor, $width, $height, $size['width'], $size['height'], $size['crop'] ); if ( $thumbnail ) { $size['filename'] = wp_basename( $thumbnail['filename'] ); $size['fileexists'] = file_exists( $thumbnail['filename'] ); } else { $size['filename'] = false; $size['fileexists'] = false; } } elseif ( ! empty( $metadata['sizes'][ $size['label'] ]['file'] ) ) { $size['filename'] = wp_basename( $metadata['sizes'][ $size['label'] ]['file'] ); $size['fileexists'] = file_exists( $wp_upload_dir . $metadata['sizes'][ $size['label'] ]['file'] ); } else { $size['filename'] = false; $size['fileexists'] = false; } $response['registered_sizes'][] = $size; } if ( ! $width && ! $height && is_array( $metadata['sizes']['full'] ) ) { $response['registered_sizes'][] = array( 'label' => 'full', 'width' => $metadata['sizes']['full']['width'], 'height' => $metadata['sizes']['full']['height'], 'filename' => $metadata['sizes']['full']['file'], 'fileexists' => file_exists( $wp_upload_dir . $metadata['sizes']['full']['file'] ), ); } // Look at the attachment metadata and see if we have any extra files from sizes that are no longer registered. foreach ( $metadata['sizes'] as $label => $size ) { if ( ! file_exists( $wp_upload_dir . $size['file'] ) ) { continue; } // An unregistered size could match a registered size's dimensions. Ignore these. foreach ( $response['registered_sizes'] as $registered_size ) { if ( $size['file'] === $registered_size['filename'] ) { continue 2; } } if ( ! empty( $registered_sizes[ $label ] ) ) { /* translators: Used for listing old sizes of currently registered thumbnails */ $label = sprintf( __( '%s (old)', 'regenerate-thumbnails' ), $label ); } $response['unregistered_sizes'][] = array( 'label' => $label, 'width' => $size['width'], 'height' => $size['height'], 'filename' => $size['file'], 'fileexists' => true, ); } return $response; } } 27 Popular Reading & Phonics Program in Singapore – Skoop Singapore | One stop platform for kids education, enrichment and resources
  • You have no bookmark.

Your Wishlist : 0 listings

Sign In

27 Popular Reading & Phonics Program in Singapore

As a parent, it’s common to feel concerned about whether your child is developing strong reading skills. You’ve probably heard about phonics and literacy programs, but knowing where to start can feel overwhelming. Every child learns differently—some may need extra support with phonics, while others benefit from more comprehensive reading approaches. To help guide you, we’ve compiled a list of phonics, reading, and literacy enrichment centres that can provide the support your child needs to grow in their reading journey.

 

1) Mindchamps

 
The MindChamps Reading Programme is designed for children aged 3 to 7, focusing on building literacy skills through a structured approach. The curriculum covers phonics, word recognition, and reading comprehension, encouraging a love for reading while developing cognitive and linguistic abilities. It integrates creativity, critical thinking, and emotional engagement to help children confidently progress from learning to read to reading to learn.


2) Jan & Elly


The Phonics programme is divided into three levels: Phonics Readiness (age 4), Phonics Intermediate (ages 4-5), and Phonics Advanced (ages 5-6). Using a pragmatic, tried-and-tested method of teaching phonics, teachers help children build a strong foundation in reading by learning the alphabet, letter sounds, and decoding words. Through fun and engaging activities, the programme fosters curiosity and excitement for learning. By the end, children will confidently recognize, pronounce, and read words independently.

 

3) LCentral


Lcentral’s reading programme consists of three stages: Foundation, LaunchPad, and LiftOff. Foundation focuses on early literacy by enhancing phonemic awareness and recognizing first sounds. LaunchPad builds on this by teaching children to identify first, middle, and last sounds, introducing grapheme blending, and improving sight word recognition. Finally, LiftOff develops reading fluency, accuracy, and comprehension, helping children from K1 to P2 become confident, independent readers ready for academic success.

 

4) School of Concepts


The School of Concepts’ phonics programme progresses through three stages: Foundation Phonics for 3-4 year olds builds a vocabulary of about 1,000 words; Beginner Phonics for 5-7 year olds enhances vocabulary to 1,500 words and improves sentence and storytelling skills; and Intermediate Phonics for primary students focuses on spelling, comprehension, and confidence. The programme also includes a primary English component that emphasizes grammar.

 

 

5) I Can Read


The I Can Read program, developed by educational psychologists, focuses on helping children aged 2.5 to 8 years old develop reading and literacy skills through two structured programs: Pre-Reading and Reading. These levels build phonemic awareness, vocabulary, and oral communication in a fun and interactive environment. Students can also practice independently with digital tools like I Can Read Heroes. This holistic approach encourages confidence and progression, turning children into capable and independent readers.

 

6) Lorna Whiston


The Fun with Phonics programme at Lorna Whiston helps children build strong reading, writing, and spelling skills through a systematic phonics approach. It uses fun, multisensory activities like stories, songs, and games to engage learners. The program is divided into three levels: Ready!, Steady!, and Go!, which progressively develop phonemic awareness, blending, and decoding skills. Taught by passionate teachers, children gain confidence in reading and spelling as they master each level.

 

7) Learning Point


The Preschool Read for Success program at Learning Point develops early literacy skills through a structured approach. It starts with building phonemic awareness and vocabulary through interactive stories, advances to developing comprehension and fluency with increasingly complex texts, and culminates in refining critical thinking and reading strategies. Recognizing that not all English words are phonics-based, the curriculum also incorporates high-frequency words to help students read effectively. This comprehensive approach ensures that preschoolers are well-prepared for primary school with a strong foundation in reading and language skills.

 

8) Mind Stretcher

The phonics and reading program at MindStretcher focuses on building strong foundational literacy skills for young learners. It starts with phonics instruction to help children understand letter-sound relationships and progresses to developing reading fluency and comprehension. The program emphasizes interactive and engaging activities, using a multitude of Mind Stretcher’s proprietary reading books, worksheets and teaching techniques, to cultivate a love for reading. It enhances phonemic awareness, vocabulary, and reading proficiency, preparing students for more advanced literacy challenges.

 

9) My English School


The English Reading Programme from My English School integrates the five key elements of reading instruction: phonemic awareness, phonics and spelling, fluency, vocabulary, and comprehension. This holistic approach goes beyond just teaching phonics, helping children to recognize sounds, spell words, read fluently, understand new vocabulary, and fully comprehend stories. The program aims to develop confident, fluent readers who not only decode words but also grasp their meanings.

 

10) The Junior Learners


Recognizing the importance of phonics in reading and writing, The Junior Learners help children identify and differentiate words. Early phonics instruction can significantly impact a child’s communication skills. The phonics tuition program offers expert guidance using modern techniques to teach the four key methods: synthetic, analytical, analogy, and embedded phonics.

 

11) Chapter One


Chapter One’s Phonics Programme includes the Hatchling and Waddle Programmes. The Hatchling Programme helps preschoolers build foundational phonics skills, such as letter recognition, vowel-consonant differentiation, and learning high-frequency words. The Waddle Programme expands on this with grammar, vocabulary, sentence structure, and comprehension, while also introducing creative and descriptive writing.

 

12) Independent Creative Learner


CL’s Early Childhood Literacy Programme provides a holistic approach to literacy beyond phonics, emphasizing quick cognition, spelling, comprehension, logical thinking, and creative articulation. The Winning Foundation 5 programme builds foundational skills in reading, spelling, and critical thinking, while the Winning Preparatory Primary extends to grammar, comprehension, and creative writing.

 

13) The Eton Academy


Eton Academy’s Phonics and Reading Programme aims to build a strong foundation in English for young learners. It uses interactive activities, manipulatives, and phonics readers to guide children toward phonics mastery and independent reading. Besides emphasizing on phonemic awareness, helping children recognize letters, isolate sounds, and differentiate between consonants and vowels, it also focuses on decoding and blending sounds to improve fluency through practice.

 

14) Merry Minds Enrichment Centre


Merry Minds’ Phonics Programme provides a structured learning path for early readers, starting with letter recognition and progressing through more advanced phonetic concepts. It includes six stages, covering letter sounds, blending, digraphs, vowel teams, and complex phonetic patterns like silent letters and r-controlled vowels. Interactive activities, games, and visuals are used to make learning engaging. The programme builds reading fluency, spelling, and writing skills, preparing children for more advanced literacy programmes.

 

15) Megaphonics


Megaphonics offers phonics and reading programmes for preschool and primary students to build strong literacy skills. The preschool programme introduces phonemic awareness and letter-sound recognition, while the primary programme focuses on reading fluency, comprehension, and vocabulary development. Both levels use a systematic approach to help students decode words and improve reading confidence.

 

16) Little Readers 


The Little Readers Phonics & Reading programme, established in 1993, specializes in teaching children aged 4 to 8 foundational literacy skills. Through engaging phonics-based instruction, the programme focuses on developing strong reading and language abilities in young learners. With experienced and dedicated teachers, children are guided through fun, systematic lessons to improve their reading fluency and comprehension, ensuring a confident start in their literacy journey.

 

17) The Pink School Bus


The Pink School Bus offers a phonics and reading program that emphasizes foundational literacy skills. The curriculum starts with introducing letter sounds and blends, progressing to reading simple words and sentences. It includes interactive activities and engaging materials designed to build phonemic awareness, vocabulary, and reading fluency. The program aims to foster a love for reading and ensure that children develop strong reading skills through a structured and supportive approach.

 

18) Articulate Literacy


At Articulate Literacy, we recognize the crucial role early literacy plays in a child’s academic and personal growth. Our phonics enrichment program for preschoolers uses art to make learning more engaging, helping children stay focused and interested. By teaching the relationship between letters and sounds, phonics lays the foundation for confident reading and writing. Children develop key skills such as letter recognition, word decoding, sentence writing, and fluency, all while fostering a love for learning through creative, interactive methods.

 

19) Curious Thoughts Academy


Based on the Jolly Phonics Framework, Curious Thoughts Academy is the only centre in Singapore that is trained in both Jolly Phonics and Orton-Gillingham (for Dyslexia Intervention). The program uses a multi-sensory approach to teach reading, grammar, and writing to children aged 18 months to 7 years and is based on 30 years of research and practical application. The program emphasizes developing core literacy skills such as phonics, speech, comprehension, and creative writing. It also enhances oral language abilities, boosting children’s confidence to speak clearly and coherently.

 

20) Metamore Academy


Phonics is a literacy program for children aged 4-7 that focuses on teaching letter sounds, blending, segmenting, and spelling to boost reading and writing skills. It involves learning 42 letter sounds through multi-sensory methods, blending for reading, understanding digraphs and diphthongs, and practicing tricky words. The program progresses through 9 levels of the Oxford Reading Tree, with classes conducted in small groups or one-on-one by trained teachers. By the end, children will have developed enhanced reading, comprehension, spelling, and basic grammar skills.

 

21) Buzzing Bees Montessori


The Montessori Phonics & Reading program at Buzzing Bees is designed for children in Nursery 2 to Kindergarten 2. It focuses on building foundational literacy skills through phonics, blending, and word decoding. Using a Montessori-based approach, the program enhances reading fluency, comprehension, and writing abilities. By incorporating hands-on learning materials, children develop a deep understanding of letter sounds, phonemic awareness, and word recognition, laying a strong foundation for lifelong reading success.

 

22) Starchamps


Starchamps systematic reading program focuses on teaching young learners to sound out letters and words before progressing to phrases and sentences. It includes a variety of games and activities to help students blend letters, learn sight words, and build vocabulary. Each lesson features story reading and introduces listening comprehension, with new vocabulary and spelling introduced at the next level.

 

23) Writing Sprouts 


Writing Sprouts offers literacy programmes that guide children from early emergent to conventional literacy through a multi-sensory approach. The PGE Programme focuses on younger kids, teaching phonics, thematic vocabulary, and writing mechanics through storytelling, illustration, and show-and-tell. The MNI Programme advances older kids’ skills by introducing more complex phonics, grammar, and writing conventions, allowing them to craft simple stories and present their work. Both programmes aim to equip children with foundational literacy skills in preparation for Primary One.

 

24) Little Earth Education


Designed for children aged 3 to 6, Little Earth Education helps young learners master reading and pronunciation through a structured approach. It focuses on building phonemic awareness and literacy skills with interactive, multisensory activities. Experienced tutors provide personalized instruction to suit each child’s learning pace, guiding them through progressive milestones from foundational to advanced levels. The programme aims to transform emerging readers into confident ones, paving the way for lifelong learning success.

 

25) Little Sunshine Learning Centre


Lil’ Sunshine’s literacy programmes for children aged 4 to 8 cover essential skills from beginner to advanced levels. The Beginner levels (1-4) focus on letter recognition, print awareness, blending CVC sounds, and vocabulary development. The Intermediate levels (5-6) introduce double consonant blends, digraphs, and build fluency and storytelling confidence. The Advanced level (7) teaches vowel graphemes, split vowel digraphs, punctuation, comprehension, and fluency, with students learning to create stories and read multisyllabic words. These programmes ensure a comprehensive literacy foundation for young learners.

 

26) The Play Squad


The preschool reading program guides children from learning basic 3-letter words to advanced comprehension and critical thinking. It starts with foundational skills in early readers, progresses through short stories and vocabulary building, introduces intermediate phonics and grammar, and culminates in enhanced comprehension and preparation for primary school and advanced writing.

 

27) Zoo-phonics


Zoo-phonics is a unique, play-based phonics program that uses a multi-sensory approach to help children learn reading, spelling, and writing. It incorporates visual, auditory, kinesthetic, and tactile learning by associating animal characters with letter shapes to aid memory. The program’s holistic method also integrates other subjects like math, music, and social studies, making learning engaging and comprehensive. Developed in 1983, Zoo-phonics is widely used and field-tested in schools across the U.S. and Canada.

 

By selecting the right programme tailored to your child’s needs, you can help foster a love for reading, build essential literacy skills, and boost their confidence. The wide range of programmes available in Singapore provides many options, but remember, the key is finding the one that resonates with your child’s learning style.

Prev Post
FREE must-have checklist for evaluating education centres
primary composition writing Next Post
The PSLE Writing Strategy That Guarantees Success

Add Comment

Your email is safe with us.

0
Close

Your cart

No products in the cart.