post_access_checker = $post_access_checker; $this->meta_writer = $meta_writer; $this->logger = new NullLogger(); } /** * Applies the given score updates. Updates are applied independently: one failing update does * not block the others. * * @param array $updates The score updates to apply. * * @return Update_Result_Collection The result per score update. */ public function update( array $updates ): Update_Result_Collection { $results = new Update_Result_Collection(); foreach ( $updates as $update ) { $results->add( $this->apply( $update ) ); } return $results; } /** * Applies a single score update. * * @param Post_Score_Update $update The score update to apply. * * @return Update_Result The result of the update. */ private function apply( Post_Score_Update $update ): Update_Result { $post_id = $update->get_post_id(); if ( ! $this->post_access_checker->exists( $post_id ) ) { return Update_Result::for_failure( $post_id, Update_Error::NOT_FOUND ); } if ( ! $this->post_access_checker->is_supported_type( $post_id ) ) { return Update_Result::for_failure( $post_id, Update_Error::INVALID_POST_TYPE ); } if ( ! $this->post_access_checker->can_edit( $post_id ) ) { return Update_Result::for_failure( $post_id, Update_Error::FORBIDDEN ); } try { if ( $update->has_seo_title_score() ) { $this->meta_writer->write_score( $post_id, self::SEO_TITLE_SCORE_KEY, $update->get_seo_title_score() ); } if ( $update->has_meta_description_score() ) { $this->meta_writer->write_score( $post_id, self::META_DESCRIPTION_SCORE_KEY, $update->get_meta_description_score() ); } } catch ( Exception $exception ) { $this->logger->warning( 'Bulk score update failed to save post {post_id}: {error}', [ 'post_id' => $post_id, 'error' => $exception->getMessage(), ], ); return Update_Result::for_failure( $post_id, Update_Error::SAVE_FAILED ); } return Update_Result::for_success( $post_id ); } }