Aşağıdaki kodlar ile Wordpress sitenize canlı tv izleme hizmeti ekleyebilirsiniz. Admin panelinden kanal ekleyip silebilirsiniz. Sistem yalnızca canlı tv kanalı eklemenin yanında Youtube video ve Youtube canlı yayın linklerini eklediğinizde otomatik olarak tanır ve tv kanalıymış gibi ekleme yapar. Eklediğiniz kanallar wp-content/uploads/kanallar.json dosyası üzerine yazılır. Kanalları kategoriye ayırma ve arama kısmı mevcut. Kodlar veritabanında herhangi bir veri girdisi yapmaz. Veriyi kanallar.json dosyasına yazar. Böylelikle veritanabı sorgusu oluşmaz ve siteniz yorulmaz. Sistem ekstra olarak mobil uyumludur.

Ö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.