/**
* GELİŞMİŞ API ÜRÜN TESPİT SİSTEMİ
* Bu dosya API'den gelen ürünleri daha kesin olarak belirler
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* API'den gelen ürünü işaretle (aktarım sırasında çağrılacak)
*/
function wc_api_mark_product_as_api($product_id, $api_source = 'birikimpromosyon') {
update_post_meta($product_id, '_wc_api_source', $api_source);
update_post_meta($product_id, '_wc_api_import_date', current_time('mysql'));
update_post_meta($product_id, '_wc_api_imported', 'yes');
error_log("API Ürün İşaretlendi: ID=$product_id, Kaynak=$api_source");
}
/**
* Daha kesin API ürün tespiti - YÜKSEK GÜVENİLİRLİK
*/
function wc_api_find_api_products_precise($limit = 20) {
global $wpdb;
$product_ids = array();
// Öncelik 1: Meta key ile işaretlenmiş ürünler (en güvenilir)
$sql = "
SELECT DISTINCT p.ID
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_type IN ('product', 'product_variation')
AND p.post_status IN ('publish', 'private', 'draft')
AND pm.meta_key = '_wc_api_source'
AND pm.meta_value = 'birikimpromosyon'
ORDER BY p.ID ASC
LIMIT %d
";
$results = $wpdb->get_col($wpdb->prepare($sql, $limit));
if (!empty($results)) {
error_log("API Ürün Tespiti: " . count($results) . " kesin API ürünü bulundu (meta ile işaretli)");
return $results;
}
// Öncelik 2: Specific kombinasyon - pa_marka + belirli SKU pattern
$sql = "
SELECT DISTINCT p.ID
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_type IN ('product', 'product_variation')
AND p.post_status IN ('publish', 'private', 'draft')
AND tt.taxonomy = 'pa_marka'
AND pm.meta_key = '_sku'
AND (
pm.meta_value REGEXP '^[A-Z]{2,4}[0-9]{2,6}(-[A-Z]+)?$' -- API pattern: ABC123-RED
OR pm.meta_value LIKE '%-%-%' -- Çoklu tire pattern
)
ORDER BY p.ID ASC
LIMIT %d
";
$results = $wpdb->get_col($wpdb->prepare($sql, $limit));
if (!empty($results)) {
error_log("API Ürün Tespiti: " . count($results) . " olası API ürünü bulundu (pattern ile)");
return $results;
}
// Öncelik 3: Son 7 gün + pa_marka (daha muhafazakar)
$sql = "
SELECT DISTINCT p.ID
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE p.post_type IN ('product', 'product_variation')
AND p.post_status IN ('publish', 'private', 'draft')
AND tt.taxonomy = 'pa_marka'
AND p.post_date >= DATE_SUB(NOW(), INTERVAL 7 DAY) -- Sadece 7 gün
ORDER BY p.ID ASC
LIMIT %d
";
$results = $wpdb->get_col($wpdb->prepare($sql, $limit));
if (!empty($results)) {
error_log("API Ürün Tespiti: " . count($results) . " yeni API ürünü bulundu (7 gün + marka)");
return $results;
}
error_log("API Ürün Tespiti: Kesin API ürünü bulunamadı");
return array();
}
/**
* API ürün sayısını kesin olarak say
*/
function wc_api_count_api_products_precise() {
global $wpdb;
$count = 0;
// Öncelik 1: Meta ile işaretli ürünler
$sql = "
SELECT COUNT(DISTINCT p.ID) as count
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_type IN ('product', 'product_variation')
AND p.post_status IN ('publish', 'private', 'draft')
AND pm.meta_key = '_wc_api_source'
AND pm.meta_value = 'birikimpromosyon'
";
$result = $wpdb->get_var($sql);
$count += $result ? $result : 0;
if ($count > 0) {
error_log("Kesin API ürün sayısı: $count (meta ile işaretli)");
return $count;
}
// Öncelik 2: Pattern ile tespit
$sql = "
SELECT COUNT(DISTINCT p.ID) as count
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_type IN ('product', 'product_variation')
AND p.post_status IN ('publish', 'private', 'draft')
AND tt.taxonomy = 'pa_marka'
AND pm.meta_key = '_sku'
AND (
pm.meta_value REGEXP '^[A-Z]{2,4}[0-9]{2,6}(-[A-Z]+)?$'
OR pm.meta_value LIKE '%-%-%'
)
";
$result = $wpdb->get_var($sql);
$count += $result ? $result : 0;
if ($count > 0) {
error_log("Olası API ürün sayısı: $count (pattern ile)");
return $count;
}
// Öncelik 3: Son 7 gün + marka
$sql = "
SELECT COUNT(DISTINCT p.ID) as count
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE p.post_type IN ('product', 'product_variation')
AND p.post_status IN ('publish', 'private', 'draft')
AND tt.taxonomy = 'pa_marka'
AND p.post_date >= DATE_SUB(NOW(), INTERVAL 7 DAY)
";
$result = $wpdb->get_var($sql);
$count = $result ? $result : 0;
error_log("Yeni API ürün sayısı: $count (7 gün + marka)");
return $count;
}
/**
* Ürünün API'den gelip gelmediğini kontrol et
*/
function wc_api_is_product_from_api($product_id) {
// Meta kontrolü
$api_source = get_post_meta($product_id, '_wc_api_source', true);
if ($api_source === 'birikimpromosyon') {
return true;
}
// SKU pattern kontrolü
$product = wc_get_product($product_id);
if (!$product) return false;
$sku = $product->get_sku();
if (empty($sku)) return false;
// API SKU pattern'leri
if (preg_match('/^[A-Z]{2,4}[0-9]{2,6}(-[A-Z]+)?$/', $sku)) {
return true; // ABC123-RED pattern
}
if (substr_count($sku, '-') >= 2) {
return true; // Çoklu tire pattern
}
// Marka taxonomy kontrolü + yeni ürün
$post_date = get_post_field('post_date', $product_id);
$days_old = (time() - strtotime($post_date)) / (24 * 3600);
if ($days_old <= 7) { // Son 7 gün içinde
$terms = wp_get_post_terms($product_id, 'pa_marka');
if (!empty($terms) && !is_wp_error($terms)) {
return true;
}
}
return false;
}
/**
* Manuel API ürün işaretleme (admin için)
*/
function wc_api_manual_mark_products() {
global $wpdb;
// Son 30 gün içinde oluşturulan + pa_marka olan ürünleri işaretle
$sql = "
SELECT DISTINCT p.ID
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE p.post_type IN ('product', 'product_variation')
AND p.post_status IN ('publish', 'private', 'draft')
AND tt.taxonomy = 'pa_marka'
AND p.post_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)
";
$product_ids = $wpdb->get_col($sql);
$marked_count = 0;
foreach ($product_ids as $product_id) {
// Zaten işaretli değilse işaretle
$existing = get_post_meta($product_id, '_wc_api_source', true);
if (empty($existing)) {
wc_api_mark_product_as_api($product_id);
$marked_count++;
}
}
error_log("Manuel işaretleme: $marked_count ürün API olarak işaretlendi");
return $marked_count;
}