Örnek tv kanal linki: https://tv-trtbelgesel.medya.trt.com.tr/master.m3u8
DEMO:https://www.softindir.tr/canli-tv-iz...rini-izle.html
1. Aşağıdaki kanallar.json dosyasını wp-content/uploads/ klasörüne upload edin.
https://softupload.tr/rE/kanallar.json
2. Aşağıdaki kodları functions.php dosyasının en altına ekleyin. Dosya düzenleme gibi işlemlerle uğraşmak istemiyorsanız Code Snippets gibi bir eklenti aracılığı ile de ekleyebilirsiniz.
/* Plugin Name: Softindir TR Canli TV Sistemi - Gelişmiş Description: Admin panelden kanal ekle/düzenle/sil + YouTube + HLS desteği + JSON liste. Shortcode: [softindir_tv_liste*] */ function softindir_get_json_path() { return WP_CONTENT_DIR . '/uploads/kanallar.json'; } add_action('admin_menu', function() { add_menu_page('Canlı TV Kanalları', 'TV Kanalları', 'manage_options', 'tv-kanallari', 'softindir_tv_admin_panel'); }); function softindir_tv_admin_panel() { $json_file = softindir_get_json_path(); $kanallar = file_exists($json_file) ? json_decode(file_get_contents($json_file), true) : []; if (isset($_POST['tv_add'])) { $kanallar[] = [ 'softindir_kanal_name' => sanitize_text_field($_POST['tv_name']), 'softindir_kanal_url' => trim($_POST['tv_url']), 'softindir_kanal_kategori' => sanitize_text_field($_POST['tv_kategori']) ]; file_put_contents($json_file, json_encode($kanallar, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); echo '<div class="updated"><p>Kanal eklendi!</p></div>'; } if (isset($_POST['tv_delete'])) { $index = intval($_POST['tv_index']); if (isset($kanallar[$index])) { unset($kanallar[$index]); $kanallar = array_values($kanallar); file_put_contents($json_file, json_encode($kanallar, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); echo '<div class="updated"><p>Kanal silindi!</p></div>'; } } if (isset($_POST['tv_update'])) { $index = intval($_POST['tv_index']); if (isset($kanallar[$index])) { $kanallar[$index]['softindir_kanal_name'] = sanitize_text_field($_POST['tv_name']); $kanallar[$index]['softindir_kanal_url'] = trim($_POST['tv_url']); $kanallar[$index]['softindir_kanal_kategori'] = sanitize_text_field($_POST['tv_kategori']); file_put_contents($json_file, json_encode($kanallar, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); echo '<div class="updated"><p>Kanal güncellendi!</p></div>'; } } ?> <div class="wrap"> <h1>Canlı TV Kanalları</h1> <form method="post"> <h3>Yeni Kanal Ekle</h3> <input type="text" name="tv_name" placeholder="Kanal Adı" required style="width:300px;" /> <br><br> <input type="url" name="tv_url" placeholder=".m3u8 veya YouTube canlı yayını" required style="width:600px;" /><br><br> <input type="text" name="tv_kategori" placeholder="Kategori (Genel, Spor...)" required style="width:300px;" /> <br><br> <button type="submit" name="tv_add" class="button button-primary">Kanalı Ekle</button> </form> <hr> <h3>Mevcut Kanallar</h3> <table class="widefat"> <thead><tr><th>#</th><th>Ad</th><th>Yayın</th><th>Kategori</th><th>İşlem</th></tr></thead> <tbody> <?php foreach ($kanallar as $i => $k): ?> <tr> <form method="post"> <td><?= $i + 1 ?></td> <td><input type="text" name="tv_name" value="<?= esc_attr($k['softindir_kanal_name']) ?>" style="width:150px;" /></td> <td><input type="url" name="tv_url" value="<?= esc_url($k['softindir_kanal_url']) ?>" style="width:300px;" /></td> <td><input type="text" name="tv_kategori" value="<?= esc_attr($k['softindir_kanal_kategori']) ?>" style="width:100px;" /></td> <td> <input type="hidden" name="tv_index" value="<?= $i ?>"> <button type="submit" name="tv_update" class="button button-primary">Güncelle</button> <button type="submit" name="tv_delete" class="button" onclick="return confirm('Silinsin mi?')">Sil</button> </td> </form> </tr> <?php endforeach; ?> </tbody> </table> </div> <?php } function softindir_tv_liste_shortcode() { $json_file = softindir_get_json_path(); if (!file_exists($json_file)) return '<p style="color:red;">Kanal listesi yok.</p>'; $kanallar = json_decode(file_get_contents($json_file), true); ob_start(); ?> <style> .tv-wrap { display: flex; gap: 20px; flex-wrap: wrap; align-items: flex-start; } .tv-list { flex: 1; max-width: 300px; background: #f1f1f1; padding: 15px; border-radius: 10px; max-height: 600px; overflow-y: auto; } .tv-player { flex: 3; min-width: 300px; background: #000; border-radius: 10px; padding: 10px; color: white; text-align: center; font-size: 22px; display: flex; align-items: center; justify-content: center; height: 500px; } .tv-player img { max-width: 100%; max-height: 100%; object-fit: contain; border-radius: 10px; } .tv-list input, .tv-list select { width: 100%; margin-bottom: 10px; padding: 10px; border-radius: 5px; border: 1px solid #ccc; } .tv-channel { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; padding: 8px; background: #fff; border-radius: 5px; cursor: pointer; } .tv-channel:hover { background: #e0e0e0; } .tv-channel button { background: #0073aa; color: #fff; border: none; padding: 5px 10px; border-radius: 5px; cursor: pointer; } iframe.youtube-player { width: 100%; height: 500px; border: none; border-radius: 8px; } @media (max-width: 768px) { .tv-wrap { flex-direction: column-reverse; } .tv-list, .tv-player { max-width: 100%; width: 100%; } .tv-player { height: auto; } } .tv-list, .tv-player { max-width: 100%; width: 100%; } .tv-player { height: auto; } } </style> <div class="tv-wrap"> <div class="tv-list"> <input type="text" id="tvSearch" placeholder="Kanal ara..." onkeyup="tvFilterList()"> <select id="tvCategory" onchange="tvFilterList()"> <option value="">Tüm Kategoriler</option> <?php foreach (array_unique(array_column($kanallar, 'softindir_kanal_kategori')) as $kategori): ?> <option value="<?= esc_attr($kategori) ?>"><?= esc_html($kategori) ?></option> <?php endforeach; ?> </select> <div id="tvChannels"> <?php foreach ($kanallar as $i => $kanal): ?> <div class="tv-channel" data-kanal="<?= strtolower($kanal['softindir_kanal_name']) ?>" data-kategori="<?= $kanal['softindir_kanal_kategori'] ?>" onclick="playChannel_<?= $i ?>()"> <span><?= esc_html($kanal['softindir_kanal_name']) ?></span> <button>İzle</button> </div> <?php endforeach; ?> </div> </div> <div class="tv-player" id="tvContainer"> <img src="https://www.softindir.tr/wp-content/uploads/2025/05/softindir-tv.webp" alt="Softindir TV"> </div> </div> <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script> <script> const playerDiv = document.getElementById("tvContainer"); <?php foreach ($kanallar as $i => $kanal): ?> function playChannel_<?= $i ?>() { const source = <?= json_encode($kanal['softindir_kanal_url']) ?>.trim(); if (source.includes("youtube.com") || source.includes("youtu.be")) { let youtubeId = ""; if (source.includes("youtu.be")) { youtubeId = source.split("youtu.be/")[1]; } else { youtubeId = new URL(source).searchParams.get("v"); } playerDiv.innerHTML = <iframe class='youtube-player' src='https://www.youtube.com/embed/${youtubeId}?autoplay=1&mute=1' allow='autoplay; encrypted-media' allowfullscreen></iframe>; } else { playerDiv.innerHTML = <video id='mainTVPlayer' controls autoplay width='100%' height='500' style='background:#000;'></video>; const player = document.getElementById("mainTVPlayer"); if (Hls.isSupported()) { const hls = new Hls(); hls.loadSource(source); hls.attachMedia(player); } else if (player.canPlayType('application/vnd.apple.mpegurl')) { player.src = source; } } } <?php endforeach; ?> function tvFilterList() { const query = document.getElementById("tvSearch").value.toLowerCase(); const category = document.getElementById("tvCategory").value; document.querySelectorAll(".tv-channel").forEach(el => { const kanal = el.dataset.kanal; const kategori = el.dataset.kategori; el.style.display = kanal.includes(query) && (!category || kategori === category) ? 'flex' : 'none'; }); } </script> <?php return ob_get_clean(); } add_shortcode('softindir_tv_liste', 'softindir_tv_liste_shortcode');3. Herhangi bir yazı ya da sayfanın içerisine aşağıdaki kısa kodu ekleyip yayınlayabilirsiniz.
[softindir_tv_liste]Soft İndir TV İzle görselini değiştirmek için kodlarda bulunan "https://www.softindir.tr/wp-content/uploads/2025/05/softindir-tv.webp" görsel adresini kendinize göre değiştirebilirsiniz.
Admin Paneli Ekran Görüntüsü (Admin panelinde sol alt tarafta TV Kanalları isimli butona tıkladığınızda aşağıdaki ekrana yönlenir.
