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;
}
?>
