prefix . 'aieo_customer_intelligence'; $tbl_sub = $wpdb->prefix . 'aieo_push_subscriptions'; $tbl_p = $wpdb->posts; $limit = max(1, (int) $limit); $score_min = (int) AIEO_DMM::REACTIVATION_SCORE_MIN; $rows = $wpdb->get_results( "SELECT sub.subscription_id, sub.user_id, ci.top_first_product_id AS target_product_id, ci.recency_days, ci.reactivation_score, ci.ltv_total FROM {$tbl_sub} sub JOIN {$tbl_ci} ci ON ci.wp_user_id = sub.user_id WHERE sub.status = 'active' AND sub.user_id > 0 AND ci.dormancy_cohort IN ('lapsed', 'long_dormant') AND ci.reactivation_score >= {$score_min} AND ci.top_first_product_id > 0 AND ci.last_reactivation_attempt_at IS NULL LIMIT 5000", ARRAY_A ); if (empty($rows)) { return array(); } $pids = array_values(array_unique(array_map( static function ($r) { return (int) $r['target_product_id']; }, $rows ))); if (empty($pids)) { return array(); } $in = implode(',', $pids); $titles = $wpdb->get_results( "SELECT ID, post_title FROM {$tbl_p} WHERE post_status = 'publish' AND post_type IN ('product', 'product_variation') AND ID IN ({$in})", ARRAY_A ); $title_by_pid = array(); foreach ($titles as $t) { $title_by_pid[(int) $t['ID']] = (string) $t['post_title']; } $out = array(); foreach ($rows as $r) { $pid = (int) $r['target_product_id']; if (!isset($title_by_pid[$pid])) { continue; } $url = (string) get_permalink($pid); $out[] = array( 'subscription_id' => (int) $r['subscription_id'], 'user_id' => (int) $r['user_id'], 'target_product_id' => $pid, 'target_url' => $url ?: home_url('/'), 'payload_data' => array( 'product_name' => (string) $title_by_pid[$pid], 'days_since_last' => (int) $r['recency_days'], 'reactivation_score' => (int) $r['reactivation_score'], ), '_score' => (int) $r['reactivation_score'], '_ltv' => (float) $r['ltv_total'], ); } usort($out, static function ($a, $b) { if ($a['_score'] !== $b['_score']) { return $b['_score'] <=> $a['_score']; } return $b['_ltv'] <=> $a['_ltv']; }); if (count($out) > $limit) { $out = array_slice($out, 0, $limit); } foreach ($out as &$o) { unset($o['_score'], $o['_ltv']); } unset($o); return $out; } }