İçindekiler
İlginizi çekebilir 👉 ChatGPT ile Görsel Nasıl Oluşturulur? Adım Adım Rehber
Günümüzde kullanıcıların canlı TV yayınlarına olan ilgisi hızla artıyor. Özellikle haber, spor, müzik ve eğlence içeriklerinin anlık olarak izlenebilmesi için web sitelerine entegre edilen canlı TV eklentileri, ziyaretçi etkileşimini büyük ölçüde artırıyor. Eğer siz de WordPress tabanlı web sitenize HLS veya YouTube canlı yayınlarını kolayca eklemek istiyorsanız, bu makalede tanıtacağımız özel plugin tam size göre. WordPress Canlı TV İzleme Eklentisi / Kodları.
Bu yazıda, tamamen size özel geliştirilen ve JSON dosyası ile kanal listelemesi yapan, aynı zamanda admin panelinden kanal ekleyip düzenleyebileceğiniz, mobil uyumlu bir Canlı TV Sistemi eklentisini tüm detaylarıyla anlatacağız. Bu eklenti ile aynı zamanda Youtube linklerini de tanımakta. Youtube video veya canlı yayınların linklerini ektediğinizde otomatik tanır ve listede yayınlar.
Sitenize canlı tv hizmeti ekleyerek trafik çekebilir ve kullanıcının uzun süre boyunca sitede kalmasını sağlayarak seo açısından olumlu sonuçlar alabilirsiniz.
DEMO: https://www.softindir.tr/canli-tv-izle-tv-kanallarini-izle.html
Bu gelişmiş canlı TV eklentisi, WordPress sitenize aşağıdaki olanakları sunar:
🎥 HLS (.m3u8) ve YouTube canlı yayınlarını destekler.
🧩 Kategori filtresi ve arama kutusu ile ziyaretçiler kanal bulmakta zorlanmaz.
🧠 Admin panelinden kanal ekleme, silme ve güncelleme özellikleriyle tamamen özelleştirilebilir.
📄 Yayınlar kanallar.json
dosyasında saklanır, dışa aktarması ve taşınması oldukça kolaydır.
🧾 [softindir_tv_liste*]
(* karakterini silin) shortcode’u sayesinde her sayfada anında çalıştırabilirsiniz.
Bu sistem, soft indir siteleri, medya portalları, radyo/TV istasyonları, dernek ya da haber portalları için harika bir çözüm sunar.
Hem .m3u8
uzantılı HLS yayınlarını hem de YouTube canlı linklerini otomatik analiz ederek doğru oynatıcıda çalıştırır. Bu sayede kullanıcılar herhangi bir oynatma problemi yaşamaz.
WordPress admin menüsüne eklenen özel bir sayfada;
Yeni kanal ekleyebilir,
Mevcut kanalları düzenleyebilir,
İstenmeyen kanalları silebilirsiniz.
Tüm kanal verileri kanallar.json
dosyasında saklanır. Böylece veri kaybı riskiniz azalır ve yedekleme işlemleri kolaylaşır.
Responsive yapı sayesinde ister masaüstü, ister mobil cihazlardan gelen ziyaretçiler kolayca yayınları izleyebilir.
Kullanıcılar arama kutusu ile kanal adı yazıp filtreleyebilir. Ayrıca kategoriye göre listeleme özelliği sayesinde büyük listeler içinde kaybolmazlar.
Sistemi WordPress sayfa veya yazılarınıza entegre etmek çok kolay. Tek yapmanız gereken:
[softindir_tv_liste*]
(* karakterini silin)
Bu kodu herhangi bir yazı veya sayfaya yapıştırdığınızda, otomatik olarak aşağıdaki modüller görüntülenir:
🔎 Arama kutusu
🧾 Kategori seçici
📺 Kanal listesi
🎬 Canlı yayın oynatıcı (otomatik olarak HLS ya da YouTube şeklinde ayarlanır)
kanallar.json dosyasını wp-content/uploads/
klasörüne upload edin. https://softupload.tr/rE/kanallar.json
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. Ya da aşağıdaki adımları uygulayabilirsiniz. Takıldığınız yerde lütfen yorum olarak yazın, anında cevaplayalım.
<?php
/*
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');
?>
Bu özel eklentiyi sitenize kurmak için aşağıdaki adımları izleyebilirsiniz:
Verilen kodu bir .php
dosyası olarak oluşturun. Örneğin: softindir-tv.php
Bu dosyayı wp-content/plugins/
dizinine yükleyin.
WordPress admin paneline gidin.
Eklentiler → Yüklü Eklentiler bölümünden Softindir TR Canlı TV Sistemi – Gelişmiş
eklentisini etkinleştirin.
wp-content/uploads/
klasörü altında kanallar.json
adında boş bir dosya oluşturun. (İzinler 755/644 olmalı)
Kanal Ekle:
Kanal adı, yayın adresi ve kategori girerek yeni bir kanal kolayca eklenebilir.
Kanal Güncelle:
Mevcut kanallar listelenir, her biri düzenlenebilir form alanlarına sahiptir.
Kanal Sil:
Her kanalın yanında silme butonu yer alır. Silme işlemi öncesi onay alınır (emin misiniz? şeklinde).
Kullanıcı Dostu Arayüz:
WordPress’in varsayılan admin panel yapısıyla uyumlu, sade ve erişilebilir bir yönetim ekranı sağlar.
Tüm kanallar aşağıdaki yapı ile saklanır:
[
{
"softindir_kanal_name": "TRT Haber",
"softindir_kanal_url": "https://....m3u8",
"softindir_kanal_kategori": "Haber"
}
]
Eğer URL içinde youtube.com
ya da youtu.be
varsa: iframe ile YouTube embed edilir.
Eğer URL .m3u8
içeriyorsa: Hls.js
kütüphanesi ile HLS yayını HTML5 <video>
ile oynatılır.
Eklenti, ekran boyutuna duyarlıdır. Mobil cihazlarda:
Yayın oynatıcı en üstte yer alır,
Kanal listesi altında görünür,
Arayüz, dokunmatik desteklidir.
Bu da kullanıcılar için sorunsuz bir deneyim sunar.
sanitize_text_field
ve esc_attr
fonksiyonları ile XSS güvenliği sağlanmıştır.
file_put_contents()
ile veri yazma işlemleri yapılırken önce içerik doğrulaması yapılır.
JSON dosyası dışında ek bir veritabanı ihtiyacı doğmaz, böylece WordPress performansına yük bindirmez.
Eklenti temel haliyle işlevseldir ancak şu iyileştirmeler yapılabilir:
📊 Yayınların anlık çevrimdışı kontrolü (ping kontrolü)
⭐ Favori kanal özelliği
🌙 Koyu tema/dark mode desteği
🗂️ Kategorileri otomatik sıralama
🧠 Yapay zekâ önerisi (en popüler kanal gösterimi)
Eğer WordPress sitenize canlı TV sistemi entegre etmek istiyorsanız, bu eklenti tam size göre. Hem geliştirici dostu hem de kullanıcı odaklı tasarımıyla öne çıkan bu yapı sayesinde kendi yayın portalınızı dakikalar içinde kurabilirsiniz.
✅ Eklentiyi indirip kurun
✅ JSON dosyanızı oluşturun
✅ [softindir_tv_liste*]
(* karakterini silin) shortcode’unu ekleyin
✅ Ziyaretçilerinize keyifli bir izleme deneyimi sunun!
Takıldığınız bir yer olur ise lütfen yorum olarak yazın yardımcı olalım.
Admin Panel Kanal Ekleme Ekranı