Merhaba
WooCommerce siteniz ile Trendyol mağazanız arasındaki bağı koparmayacak, sunucunuzu yormayan ve tamamen akıllı algoritmalarla çalışan yeni nesil Trendyol senkronizasyon eklentisini (v10.2) paylaşıyorum.
Artık manuel ürün girmekle uğraşmanıza gerek yok; eklentiyi kurun, API bilgilerinizi girin ve arkanıza yaslanın!

✨ Öne Çıkan Özellikler

  • 📦 Akıllı Manuel İçeri Aktarma: Tek tıkla Trendyol mağazanızdaki ilk 50 ürünü kontrol eder, sitenizde olmayanları otomatik olarak "Taslak" olarak içeri aktarır.
  • ⏰ 2 Saatte Bir Otomatik Kontrol: WordPress Cron altyapısını kullanarak her 2 saatte bir Trendyol'daki son 5 ürünü kontrol eder. Yeni ürün varsa otomatik çeker.
  • 🖼️ Gelişmiş Galeri Motoru: Sadece ana resmi değil, tüm ürün görsellerini Trendyol'dan çeker ve WordPress ortam kütüphanesine kaydeder.
  • 🔄 Çift Yönlü Stok & Fiyat Senkronu: WooCommerce üzerinde bir ürünün fiyatını veya stoğunu güncellediğiniz anda, eklenti bu bilgiyi anında Trendyol mağazanıza iletir.
  • 📁 Otomatik Kategori Yönetimi: Trendyol'daki kategori isimlerini okur, sitenizde varsa eşleştirir, yoksa otomatik olarak oluşturur.
  • 🛡️ Sunucu Dostu (Anti-Ban): Görsel çekimlerinde ve ürün aktarımlarında sleep ve usleep fonksiyonları kullanarak sunucunuzun ve API'nin darboğaza girmesini engeller.

🛠 Teknik Detaylar

  • Sürüm: 10.2 (Smart Auto)
  • Altyapı: WooCommerce + Trendyol REST API
  • Güvenlik: API anahtarları wp_options tablosunda güvenle saklanır, dış erişime kapalıdır.
  • Kontrol Paneli: Sade ve anlaşılır yönetim arayüzü.

💡 Kurulum ve Kullanım

  1. Eklenti dosyasını wp-content/plugins/ dizinine atın veya panelden yükleyin.
  2. Trendyol Partner panelinden aldığınız Satıcı ID, API Key ve API Secret bilgilerini "Trendyol Sync" menüsüne girin.
  3. Ayarları kaydedin.
  4. İsterseniz "50 Ürünü Getir" butonuyla ilk toplu aktarımı başlatın, isterseniz sistemin 2 saatlik periyotlarla otomatik çalışmasını bekleyin.
📌 Not: Ürünler sitenize "Taslak" olarak eklenir. Bu sayede son kontrollerinizi yapıp (SEO açıklaması, yerel kategori düzenlemesi vb.) yayına alabilirsiniz.




<?php
/**
 * Plugin Name: My Trendyol Sync (v10.2 - Smart Auto)
 * Description: 50'li paket çekme, 2 saatte bir otomatik yeni ürün kontrolü ve tam galeri desteği.
 * Version: 10.2
 * Author: Caner G
 */

if ( ! defined( 'ABSPATH' ) ) exit;

// --- 1. GÜVENLİ RESİM MOTORU ---
function tr_v102_safe_gallery($images, $post_id) {
    if (empty($images) || !is_array($images)) return;
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');

    $gallery_ids = array();
    foreach ($images as $index => $img_data) {
        sleep(1); // Sunucu nefes alma payı
        $tmp = download_url($img_data['url']);
        if (is_wp_error($tmp)) continue;

        $file_array = array('name' => sanitize_file_name(basename($img_data['url'])) . '.jpg', 'tmp_name' => $tmp);
        $attachment_id = media_handle_sideload($file_array, $post_id);

        if (!is_wp_error($attachment_id)) {
            if ($index === 0) set_post_thumbnail($post_id, $attachment_id);
            else $gallery_ids[] = $attachment_id;
        }
        @unlink($tmp);
    }
    if (!empty($gallery_ids)) update_post_meta($post_id, '_product_image_gallery', implode(',', $gallery_ids));
}

// --- 2. ÜRÜN ÇEKME ÇEKİRDEĞİ (50 ÜRÜN LİMİTLİ) ---
function tr_v102_core_import($limit = 50) {
    @set_time_limit(600);
    $sid = get_option('tr_seller_id'); $akey = get_option('tr_api_key'); $asec = get_option('tr_api_secret');
    if(!$sid || !$akey || !$asec) return 0;
    
    $auth = base64_encode( $akey . ":" . $asec );
    $url = "https://apigw.trendyol.com/integration/product/sellers/$sid/products?size=" . $limit;
    
    $response = wp_remote_get($url, array('headers' => array('Authorization' => 'Basic ' . $auth), 'timeout' => 60));
    if (is_wp_error($response)) return 0;

    $data = json_decode(wp_remote_retrieve_body($response), true);
    if (!isset($data['content'])) return 0;

    $count = 0;
    foreach ($data['content'] as $tr_item) {
        $exists = wc_get_product_id_by_sku($tr_item['barcode']);
        if (!$exists) {
            $pid = wp_insert_post(array(
                'post_title'   => $tr_item['title'],
                'post_content' => $tr_item['description'] ?? '',
                'post_status'  => 'draft',
                'post_type'    => 'product'
            ));
            
            $wc_prod = wc_get_product($pid);
            $wc_prod->set_sku($tr_item['barcode']);
            $wc_prod->set_regular_price($tr_item['salePrice']);
            $wc_prod->set_manage_stock(true);
            $wc_prod->set_stock_quantity($tr_item['quantity']);
            
            // Otomatik Kategori
            if (!empty($tr_item['categoryName'])) {
                $term = get_term_by('name', $tr_item['categoryName'], 'product_cat');
                $cat_id = $term ? $term->term_id : wp_insert_term($tr_item['categoryName'], 'product_cat')['term_id'];
                if ($cat_id) $wc_prod->set_category_ids(array($cat_id));
            }
            
            $wc_prod->save();
            if (!empty($tr_item['images'])) tr_v102_safe_gallery($tr_item['images'], $pid);
            $count++;
            usleep(500000);
        }
    }
    return $count;
}

// --- 3. 2 SAATTE BİR OTOMATİK KONTROL ---
// WordPress standart olarak 2 saatlik periyot sunmaz, kendimiz tanımlıyoruz:
add_filter( 'cron_schedules', 'tr_v102_add_two_hours' );
function tr_v102_add_two_hours( $schedules ) {
    $schedules['two_hours'] = array('interval' => 7200, 'display' => 'Her 2 Saatte Bir');
    return $schedules;
}

if ( ! wp_next_scheduled( 'tr_v102_auto_check' ) ) wp_schedule_event( time(), 'two_hours', 'tr_v102_auto_check' );
add_action( 'tr_v102_auto_check', 'tr_v102_auto_task' );

function tr_v102_auto_task() {
    // Otomatik görevde sadece en yeni 5 ürünü kontrol et (Sunucuyu yormaz)
    tr_v102_core_import(5);
}

// --- 4. STOK & FİYAT SENKRONU ---
add_action( 'woocommerce_update_product', 'tr_v102_sync_out', 10, 1 );
function tr_v102_sync_out($product_id) {
    $product = wc_get_product($product_id);
    if(!$product || !$product->get_sku()) return;
    $sid = get_option('tr_seller_id'); $auth = base64_encode(get_option('tr_api_key').":".get_option('tr_api_secret'));
    $payload = array("items" => array(array("barcode"=>$product->get_sku(), "quantity"=>(int)$product->get_stock_quantity(), "salePrice"=>(float)$product->get_price(), "listPrice"=>(float)$product->get_price())));
    wp_remote_post("https://api.trendyol.com/sapigw/suppliers/$sid/products/price-and-inventory", array('headers'=>array('Authorization'=>'Basic '.$auth,'Content-Type'=>'application/json'),'body'=>json_encode($payload)));
}

// --- 5. PANEL ---
add_action('admin_menu', 'tr_v102_menu');
function tr_v102_menu(){
    add_menu_page('Trendyol Smart', 'Trendyol Sync', 'manage_options', 'tr-sync', 'tr_v102_page', 'dashicons-update-alt', 56);
}

function tr_v102_page(){
    if(isset($_POST['tr_save'])){
        update_option('tr_seller_id', $_POST['tr_seller_id']);
        update_option('tr_api_key', $_POST['tr_api_key']);
        update_option('tr_api_secret', $_POST['tr_api_secret']);
        echo '<div class="updated"><p>Ayarlar Kaydedildi.</p></div>';
    }
    if(isset($_POST['tr_import_now'])){
        $count = tr_v102_core_import(50);
        echo '<div class="notice notice-success"><p>✅ Manuel Tarama Bitti: '.$count.' yeni ürün Taslak olarak eklendi.</p></div>';
    }

    echo '<div class="wrap"><h1>🚀 Trendyol Smart Sync v10.2</h1>';
    echo '<div style="background:#e3f2fd; padding:15px; border-left:5px solid #2196f3; margin-bottom:20px;">
            <b>Otomasyon Durumu:</b> Sistem her 2 saatte bir Trendyol\'daki son 5 ürünü otomatik kontrol eder ve sitende yoksa ekler.
          </div>';
    echo '<form method="post">
            <div style="background:#fff; padding:20px; border:1px solid #ccc; margin-bottom:20px;">
                <h3>📦 Manuel Toplu Çekme (İlk 50)</h3>
                <input type="submit" name="tr_import_now" class="button button-primary" value="50 Ürünü Kontrol Et ve Getir">
            </div>
            <div style="background:#fff; padding:20px; border:1px solid #ccc;">
                <table class="form-table">
                    <tr><th>Satıcı ID:</th><td><input type="text" name="tr_seller_id" value="'.get_option('tr_seller_id').'" class="regular-text"></td></tr>
                    <tr><th>API Key:</th><td><input type="text" name="tr_api_key" value="'.get_option('tr_api_key').'" class="regular-text"></td></tr>
                    <tr><th>API Secret:</th><td><input type="password" name="tr_api_secret" value="'.get_option('tr_api_secret').'" class="regular-text"></td></tr>
                </table>
                <input type="submit" name="tr_save" class="button button-secondary" value="Ayarları Kaydet">
            </div>
          </form></div>';
}
Bu sayede trendyol üzerinden girdiğiniz ürünleri tek tek sitenize gerek kalmayacaktır, fiyat veya stok güncellemenizde iki taraflı otomatik güncelleme yapmaktadır.
Herkese hayırlı forumlar, iyi bayramlar dilerim.