fbpx

Wprowadzenie

Stworzyłem funkcjonalność, która dodaje nagrania do profilu użytkownika i informuje go o tym przez e-mail.
Zrobiłem to, ponieważ chciałem ułatwić przekazywanie wideo kursantom, klientom lub członkom zamkniętej platformy.
Całość opiera się na kodzie PHP i działa wewnątrz WordPressa bez dodatkowych wtyczek – wszystko z poziomu funkcji motywu.
Kod realizuje pełną obsługę danych: ich dodawanie, edycję i automatyczne powiadamianie odbiorcy – bez wysiłku.

Co robi ten kod?

Funkcja wstawia nową sekcję w edycji użytkownika w kokpicie, gdzie można przypisać jedno lub wiele nagrań.
Każde nagranie zawiera nazwę, datę oraz link URL do filmu – np. na YouTube, Vimeo lub innej platformie.
Dzięki temu mogę zarządzać dostępem do nagrań indywidualnie – dla każdego użytkownika osobno, precyzyjnie i skutecznie.
Rozwiązanie przyspiesza proces pracy z klientami i edukacją – oszczędzam czas, działając w znanym środowisku WordPress.

Jak działa dodawanie nagrań WordPress?

Kiedy edytuję użytkownika w WordPressie, widzę dodatkowy formularz – to miejsce na wpisanie nowych nagrań.
Dodaję dane, klikam „Zapisz”, a system analizuje różnice pomiędzy nowym a poprzednim zestawem nagrań.
Jeśli znajdzie nowe pozycje – rozpoznaje je jako świeżo dodane i wysyła e-mail z informacją do właściciela konta.
Dzięki temu dodawanie nagrań WordPress staje się funkcją automatyczną i natychmiastową, bez ręcznego informowania użytkownika.

Komu to się przyda?

Z tej funkcji skorzystają edukatorzy, terapeuci online, konsultanci, szkoły językowe i autorzy zamkniętych kursów wideo.
Każdy, kto publikuje nagrania powiązane z użytkownikami – znajdzie tu gotowe, sprawdzone i bardzo wygodne rozwiązanie.
Nie trzeba instalować żadnych pluginów – wystarczy wkleić kod do functions.php lub stworzyć prostą własną wtyczkę.
Dodawanie nagrań WordPress jest przydatne również w firmach wewnętrznych – np. do przekazywania nagrań onboardingu lub szkoleń.

Jak zmienić treść wiadomości e-mail?

W pliku kodu znajdziesz funkcję zapisz_linki_do_nagran, gdzie znajdują się zmienne $subject i $message.
Tam możesz wpisać dowolną treść – zmienić nagłówek, powitanie, dodawać lub usuwać sekcje wiadomości, spersonalizować ją.
Możesz nawet dołączyć przyciski, podpis graficzny, a także warunkowo pokazywać inne dane – to elastyczny system.
Dzięki temu dodawanie nagrań WordPress daje pełną kontrolę nad formą komunikacji z użytkownikiem końcowym.

Widok dla użytkownika

Gdy użytkownik się zaloguje, może użyć shortcode [moje_filmy] na dowolnej stronie WordPressa.
Po wstawieniu tego shortcode, użytkownik zobaczy listę swoich nagrań: nazwę, datę i przycisk do obejrzenia nagrania.
Jeśli nie ma jeszcze żadnych nagrań przypisanych do jego konta – pojawi się jasna informacja o ich braku.
Całość wygląda przejrzyście i nowocześnie – użytkownik nie potrzebuje żadnych dodatkowych szkoleń, by z tego korzystać.

Podsumowanie

Dzięki tej funkcji wprowadzam porządek, wygodę i automatyzację w przekazywaniu treści multimedialnych użytkownikom.
Mam możliwość pełnej kontroli nad zawartością, sposobem prezentacji i komunikacji mailowej.
Dodawanie nagrań WordPress nie wymaga żadnych dodatkowych zależności – wszystko oparte jest na czystym kodzie PHP.
To gotowe rozwiązanie, które mogę wdrożyć w kilka minut – a zyskać na tym może każdy system edukacyjny czy platforma członkowska.

<?php
// 1. Dodawanie pól do edycji profilu użytkownika
add_action('show_user_profile', 'dodaj_linki_do_nagran');
add_action('edit_user_profile', 'dodaj_linki_do_nagran');

function dodaj_linki_do_nagran($user) {
    $nagrania = get_user_meta($user->ID, 'linki_do_nagran', true);
    if (!is_array($nagrania)) $nagrania = [];
    ?>
    <h3>Linki do nagrań</h3>
    <div id="nagrania-wrapper">
        <?php foreach ($nagrania as $index => $n): ?>
            <div class="nagranie-blok" style="border:1px solid #ccc; padding:10px; margin-bottom:10px;">
                <p>
                    <label for="nazwa_<?php echo $index; ?>"><strong>Nazwa spotkania:</strong></label><br>
                    <input type="text" name="linki_do_nagran[<?php echo $index; ?>][nazwa]" id="nazwa_<?php echo $index; ?>" value="<?php echo esc_attr($n['nazwa'] ?? ''); ?>" style="width:100%;">
                </p>
                <p>
                    <label for="data_<?php echo $index; ?>"><strong>Data spotkania:</strong></label><br>
                    <input type="date" name="linki_do_nagran[<?php echo $index; ?>][data]" id="data_<?php echo $index; ?>" value="<?php echo esc_attr($n['data'] ?? ''); ?>">
                </p>
                <p>
                    <label for="link_<?php echo $index; ?>"><strong>Link do nagrania:</strong></label><br>
                    <input type="url" name="linki_do_nagran[<?php echo $index; ?>][link]" id="link_<?php echo $index; ?>" value="<?php echo esc_url($n['link'] ?? ''); ?>" style="width:100%;">
                </p>
                <button type="button" class="usun-nagranie button">- Usuń</button>
            </div>
        <?php endforeach; ?>
    </div>

    <p><button type="button" class="button" id="dodaj-nagranie">+ Dodaj nowe nagranie</button></p>

    <script>
        document.addEventListener('DOMContentLoaded', function () {
            const wrapper = document.getElementById('nagrania-wrapper');
            const button = document.getElementById('dodaj-nagranie');
            let index = <?php echo count($nagrania); ?>;

            button.addEventListener('click', function () {
                const div = document.createElement('div');
                div.classList.add('nagranie-blok');
                div.style.border = "1px solid #ccc";
                div.style.padding = "10px";
                div.style.marginBottom = "10px";

                div.innerHTML = `
                    <p>
                        <label><strong>Nazwa spotkania:</strong></label><br>
                        <input type="text" name="linki_do_nagran[\${index}][nazwa]" style="width:100%;">
                    </p>
                    <p>
                        <label><strong>Data spotkania:</strong></label><br>
                        <input type="date" name="linki_do_nagran[\${index}][data]">
                    </p>
                    <p>
                        <label><strong>Link do nagrania:</strong></label><br>
                        <input type="url" name="linki_do_nagran[\${index}][link]" style="width:100%;">
                    </p>
                    <button type="button" class="usun-nagranie button">- Usuń</button>
                `;

                wrapper.appendChild(div);
                index++;
            });

            wrapper.addEventListener('click', function (e) {
                if (e.target.classList.contains('usun-nagranie')) {
                    e.target.closest('.nagranie-blok').remove();
                }
            });
        });
    </script>
    <?php
}

// 2. Zapisywanie danych po edycji profilu + wysyłka e-maila przy nowym nagraniu
add_action('personal_options_update', 'zapisz_linki_do_nagran');
add_action('edit_user_profile_update', 'zapisz_linki_do_nagran');

function zapisz_linki_do_nagran($user_id) {
    if (!current_user_can('edit_user', $user_id)) return;

    $stare = get_user_meta($user_id, 'linki_do_nagran', true);
    if (!is_array($stare)) $stare = [];

    if (isset($_POST['linki_do_nagran']) && is_array($_POST['linki_do_nagran'])) {
        $czyste = [];
        $nowe = [];

        foreach ($_POST['linki_do_nagran'] as $item) {
            $nazwa = sanitize_text_field($item['nazwa'] ?? '');
            $data = sanitize_text_field($item['data'] ?? '');
            $link = esc_url_raw(trim($item['link'] ?? ''));

            if ($link || $nazwa || $data) {
                $nowe_element = [
                    'nazwa' => $nazwa,
                    'data' => $data,
                    'link' => $link
                ];
                $czyste[] = $nowe_element;

                if (!in_array($nowe_element, $stare)) {
                    $nowe[] = $nowe_element;
                }
            }
        }

        update_user_meta($user_id, 'linki_do_nagran', $czyste);

        // Wysyłka e-maila jeśli są nowe nagrania
        if (!empty($nowe)) {
            $user = get_user_by('ID', $user_id);
            $email = $user->user_email;
            $imie = get_user_meta($user_id, 'first_name', true);
            if (!$imie) $imie = $user->display_name;

            $subject = 'Nowe nagranie na Twoim koncie';
            $message = "Cześć $imie,\n\nNa Twoim koncie zostało dodane nowe nagranie.\n\n";
            foreach ($nowe as $n) {
                $message .= "- " . ($n['nazwa'] ?: 'Bez nazwy') . " (" . ($n['data'] ?: 'brak daty') . ")\n" . $n['link'] . "\n\n";
            }
            $message .= "Tutaj wpisz treść swojej wiadomości email";

            wp_mail($email, $subject, $message);
        }
    }
}

// 3. Shortcode do wyświetlania nagrań użytkownika
add_shortcode('moje_filmy', 'wyswietl_nagrania_uzytkownika');

function wyswietl_nagrania_uzytkownika() {
    if (!is_user_logged_in()) {
        return '<p>Musisz być zalogowany, aby zobaczyć swoje nagrania.</p>';
    }

    $user_id = get_current_user_id();
    $nagrania = get_user_meta($user_id, 'linki_do_nagran', true);

    if (!is_array($nagrania) || empty($nagrania)) {
        return '<p>Brak nagrań do wyświetlenia.</p>';
    }

    $output = '<div class="moje-filmy">';
    foreach ($nagrania as $n) {
        $nazwa = esc_html($n['nazwa'] ?? 'Bez nazwy');
        $data = esc_html($n['data'] ?? '');
        $link = esc_url($n['link'] ?? '#');

        $output .= '<div class="nagranie-item" style="margin-bottom:20px;">';
        $output .= '<div class="nazwa-spotkania">';
        $output .= '<span class="nazwa-spotkania" style="display:block; font-weight:bold;">' . $nazwa . '</span>';
        if ($data) {
            $output .= '<span class="data-spotkania" style="display:block; color:#555;">' . $data . '</span>';
        }
        $output .= '</div>';
        $output .= '<div class="guzik-do-nagrania">';
        $output .= '<a href="' . $link . '" class="button" target="_blank" rel="noopener noreferrer">Idź do nagrania</a>';
        $output .= '</div>';
        $output .= '</div>';
    }
    $output .= '</div>';

    return $output;
}
?>
Zdjęcie profilowe autora

Bartosz Świnicki

Jeśli podobają Ci się moje treści i chcesz docenić moją pracę, możesz mnie symbolicznie wesprzeć.

Imię:


Nazwisko:


Adres email:


Nazwa Twojej firmy:


NIP Twojej firmy

REGON Twojej firmy



Adres Twojej firmy

Ulica

Kod pocztowy

Miasto

Wybierz bramkę płatniczą na Twojej stronie