30, 'avg_impressions_per_day' => 1000, 'avg_ctr_percent' => 2.5, 'include_active_view' => true, 'avg_viewability_percent' => 70.0, ] ); $combinations = []; $placement_repo = adpresso_get_placement_repository(); $all_placements = $placement_repo->get_all(); if ( empty( $all_placements ) ) { return new WP_Error( 'no_placements', 'Keine Placements gefunden, für die Daten generiert werden könnten.' ); } foreach ( $all_placements as $placement ) { $item = $placement->get_item(); if ( $item instanceof Ad ) { $combinations[] = [ 'placement_id' => $placement->get_id(), 'group_id' => 0, 'ad_id' => $item->get_id(), ]; } elseif ( $item instanceof Group ) { $ad_data = $item->get_raw_ad_data(); // [ ad_id => weight ] foreach ( array_keys( $ad_data ) as $ad_id ) { $combinations[] = [ 'placement_id' => $placement->get_id(), 'group_id' => $item->get_id(), 'ad_id' => $ad_id, ]; } } } if ( empty( $combinations ) ) { return new WP_Error( 'no_combinations', 'Keine gültigen Anzeigen-Zuweisungen gefunden.' ); } $stats_table = $wpdb->prefix . 'adpresso_stats'; $sql_values = []; $date_format = 'Y-m-d'; // Site-local days, like the tracking writes. $today = new \DateTimeImmutable( current_time( 'Y-m-d' ), new \DateTimeZone( 'UTC' ) ); $variation_impressions = (int) $config['avg_impressions_per_day'] * 0.05; for ( $i = 0; $i < $config['days_back']; $i++ ) { $stat_date = $today->modify( "-$i days" )->format( $date_format ); foreach ( $combinations as $combo ) { $impressions = max( 0, (int) $config['avg_impressions_per_day'] + wp_rand( $variation_impressions * -1, $variation_impressions ) ); // A low CTR plus negative jitter must not produce negative clicks. $clicks = max( 0, (int) ( $impressions * ( ( $config['avg_ctr_percent'] + wp_rand( -100, 100 ) / 100 ) / 100 ) ) ); $impressions_av = 0; if ( $config['include_active_view'] ) { $impressions_av = max( 0, (int) ( $impressions * ( ( $config['avg_viewability_percent'] + wp_rand( -10, 10 ) ) / 100 ) ) ); } $sql_values[] = $wpdb->prepare( '(%s, %d, %d, %d, %d, %d, %d)', $stat_date, $combo['placement_id'], $combo['group_id'], $combo['ad_id'], $impressions, $clicks, $impressions_av ); } } if ( empty( $sql_values ) ) { return true; } // Adds to rows that already exist for a day. $query = "INSERT INTO {$stats_table} (stat_date, placement_id, group_id, ad_id, impressions, clicks, impressions_av) VALUES " . implode( ',', $sql_values ) . " ON DUPLICATE KEY UPDATE impressions = impressions + VALUES(impressions), clicks = clicks + VALUES(clicks), impressions_av = impressions_av + VALUES(impressions_av)"; // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- values prepared individually above. $result = $wpdb->query( $query ); return $result !== false; } }