then( [ self::class, 'getNew' ] ) ->then( [ self::class, 'notify' ] ) ->then( [ self::class, 'updatePrevious' ] ); } public static function getNew() { if ( is_null( OptionManager::getOr( null, 'TM', self::PREVIOUS_SETTING ) ) ) { self::updatePrevious(); } return Lst::diff( Repository::getCustomFieldsToTranslate() ?: [], OptionManager::getOr( [], 'TM', self::PREVIOUS_SETTING ) ); } public static function notify( array $newFields ) { if ( count( $newFields ) ) { OptionManager::update( 'TM', self::DETECTED_SETTING, Lst::concat( self::getDetected(), $newFields ) ); } } public static function remove( array $fields ) { if ( count( $fields ) ) { OptionManager::update( 'TM', self::DETECTED_SETTING, Lst::diff( self::getDetected(), $fields ) ); } } public static function updatePrevious() { OptionManager::update( 'TM', self::PREVIOUS_SETTING, Repository::getCustomFieldsToTranslate() ); } public static function getDetected() { return OptionManager::getOr( [], 'TM', self::DETECTED_SETTING ); } public static function processNewFields() { $newFields = self::getDetected(); if ( count( $newFields ) ) { /** * Create a lock to make sure only one background task will run at a time. * We wont release the lock so it wont be able to run again until the time out is complete. */ $lock = make( 'WPML\Utilities\Lock', [ ':name' => self::class ] ); if ( $lock->create( self::LOCK_TIME ) ) { BackgroundTask::add( ProcessNewTranslatableFields::class, [ 'newFields' => $newFields ] ); } } } }