products->findPaginated( new ProductListQuery( page: $page, perPage: $scanPageSize, lifecycleState: ProductListQuery::LIFECYCLE_STATE_ACTIVE ) ); $urls = array(); $contexts = array(); foreach ( $result->items() as $record ) { $productId = $record->id(); if ( $productId === null || $productId <= 0 ) { continue; } if ( $this->statusStore->isFresh( $productId, $now, $freshTtlSeconds ) ) { continue; } $url = self::urlForProductRecord( $record ); if ( $url === '' || array_key_exists( $url, $contexts ) ) { continue; } $urls[] = $url; $contexts[ $url ] = array( 'product_id' => $productId, 'provider' => $record->provider(), 'provider_item_id' => $record->providerItemId(), 'label' => self::labelForProductRecord( $record ), ); if ( count( $urls ) >= $submitLimit ) { break; } } $nextPage = $page + 1; if ( $result->totalPages() === 0 || $page >= $result->totalPages() ) { $nextPage = 1; } return new ScheduledLinkHealthCandidateBatch( $urls, $contexts, count( $result->items() ), $nextPage ); } /** * Pick the URL to check for one saved product. * * @param ProductRecord $record Product record. */ private static function urlForProductRecord( ProductRecord $record ): string { $affiliateUrl = $record->affiliateUrl(); if ( is_string( $affiliateUrl ) && $affiliateUrl !== '' ) { return $affiliateUrl; } return $record->detailUrl(); } /** * Build a compact label for one saved product. * * @param ProductRecord $record Product record. */ private static function labelForProductRecord( ProductRecord $record ): string { $id = $record->id(); return sprintf( '#%s %s / %s', $id === null ? '-' : (string) $id, $record->provider(), $record->title() ); } }