// ===== PHASE 3 BLOCKING RULES ===== /** * Get ad category blocking rules by topic */ function hnf_get_ad_category_rules() { return array( 'health' => array( 'allowed' => array('health-news', 'medical-advice', 'wellness'), 'blocked' => array('unsafe-remedies', 'unproven-treatments', 'medical-scams'), 'explanation' => 'Health articles - block unproven medical claims' ), 'finance' => array( 'allowed' => array('financial-services', 'news', 'investment-advice'), 'blocked' => array('penny-stocks', 'day-trading', 'forex-scams', 'get-rich-quick'), 'explanation' => 'Financial articles - block risky schemes' ), 'politics' => array( 'allowed' => array('political-news', 'government', 'policy'), 'blocked' => array('political-betting', 'controversial-campaigns'), 'explanation' => 'Political content - block betting/propaganda' ), 'sports' => array( 'allowed' => array('sports-news', 'game-results', 'athlete-profiles'), 'blocked' => array('sports-betting', 'gambling'), 'explanation' => 'Sports articles - block betting ads' ), 'dating' => array( 'allowed' => array('relationship-advice', 'dating-tips'), 'blocked' => array('dating-scams', 'romance-fraud'), 'explanation' => 'Dating content - block romance scams' ), 'crypto' => array( 'allowed' => array('blockchain-news', 'crypto-education'), 'blocked' => array('pump-and-dump', 'rug-pulls', 'crypto-scams'), 'explanation' => 'Crypto articles - block fraud schemes' ), 'abortion' => array( 'allowed' => array('healthcare', 'legal-news'), 'blocked' => array('abortion-pills-illegal', 'unregulated-procedures'), 'explanation' => 'Abortion-related - block unsafe/illegal services' ), 'pregnancy' => array( 'allowed' => array('prenatal-care', 'pregnancy-health', 'maternity'), 'blocked' => array('unsafe-pregnancy-treatments', 'fetal-scams'), 'explanation' => 'Pregnancy content - block unsafe remedies' ) ); } /** * Check if ad is safe for topic */ function hnf_is_ad_safe_for_topic( $topic, $ad_category ) { $rules = hnf_get_ad_category_rules(); $topic_rules = $rules[ $topic ]; if ( ! $topic_rules ) { return true; // No rules = allow } // Check if ad is in blocked list if ( in_array( $ad_category, $topic_rules['blocked'] ) ) { error_log( "[HNF Phase 3] BLOCKED ad category '$ad_category' for topic '$topic': " . $topic_rules['explanation'] ); return false; } return true; } // ===== END PHASE 3 BLOCKING ===== // ===== PHASE 2: ANALYTICS DASHBOARD ===== function hnf_get_dashboard_data( $days = 30 ) { global $wpdb; $table = $wpdb->prefix . 'hnf_ad_impressions'; $start_date = date( 'Y-m-d H:i:s', strtotime( "-$days days" ) ); $data = array( 'total_impressions' => 0, 'total_revenue' => 0.00, 'rpm' => 0.00, 'daily_data' => array(), 'network_breakdown' => array(), 'placement_breakdown' => array(), 'top_placements' => array(), 'top_networks' => array() ); $totals = $wpdb->get_row( $wpdb->prepare( "SELECT COUNT(*) as impressions, SUM(revenue) as revenue FROM $table WHERE timestamp >= %s", $start_date )); $data['total_impressions'] = absint( $totals->impressions ); $data['total_revenue'] = floatval( $totals->revenue ?? 0 ); $data['rpm'] = $data['total_impressions'] > 0 ? round( ( $data['total_revenue'] / $data['total_impressions'] ) * 1000, 2 ) : 0; $daily = $wpdb->get_results( $wpdb->prepare( "SELECT DATE(timestamp) as date, COUNT(*) as impressions, SUM(revenue) as revenue FROM $table WHERE timestamp >= %s GROUP BY DATE(timestamp) ORDER BY date ASC", $start_date )); foreach ( $daily as $day ) { $data['daily_data'][] = array( 'date' => $day->date, 'impressions' => absint( $day->impressions ), 'revenue' => floatval( $day->revenue ?? 0 ) ); } $networks = $wpdb->get_results( $wpdb->prepare( "SELECT provider, COUNT(*) as impressions, SUM(revenue) as revenue FROM $table WHERE timestamp >= %s GROUP BY provider ORDER BY revenue DESC", $start_date )); foreach ( $networks as $net ) { $data['network_breakdown'][ $net->provider ] = array( 'impressions' => absint( $net->impressions ), 'revenue' => floatval( $net->revenue ?? 0 ) ); $data['top_networks'][] = array( 'name' => $net->provider, 'revenue' => floatval( $net->revenue ?? 0 ) ); } $placements = $wpdb->get_results( $wpdb->prepare( "SELECT placement, COUNT(*) as impressions, SUM(revenue) as revenue FROM $table WHERE timestamp >= %s GROUP BY placement ORDER BY revenue DESC", $start_date )); foreach ( $placements as $place ) { $data['placement_breakdown'][ $place->placement ] = array( 'impressions' => absint( $place->impressions ), 'revenue' => floatval( $place->revenue ?? 0 ) ); $data['top_placements'][] = array( 'name' => $place->placement, 'revenue' => floatval( $place->revenue ?? 0 ) ); } usort( $data['top_networks'], function( $a, $b ) { return $b['revenue'] <=> $a['revenue']; }); usort( $data['top_placements'], function( $a, $b ) { return $b['revenue'] <=> $a['revenue']; }); $data['top_networks'] = array_slice( $data['top_networks'], 0, 5 ); $data['top_placements'] = array_slice( $data['top_placements'], 0, 5 ); return $data; } add_action( 'admin_menu', 'hnf_register_analytics_page' ); function hnf_register_analytics_page() { add_submenu_page( 'hnf-ad-slots', 'Analytics Dashboard', 'Analytics', 'manage_options', 'hnf-analytics-dashboard', 'hnf_analytics_dashboard_callback' ); } function hnf_analytics_dashboard_callback() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( 'Unauthorized' ); } $days = isset( $_GET['days'] ) ? absint( $_GET['days'] ) : 30; $data = hnf_get_dashboard_data( $days ); ?>

HNF Analytics Dashboard

Total Impressions

0

Total Revenue

$0.00

RPM

$0.00

Avg Daily Revenue

$