Jeden z czytelników WPNinja zadał pytanie:
Mam na portalu kilku autorów. Chciałbym wstawić do sidebara link do profilu danego autora na forum (które jest w subdomenie, oparte na SMF). Np autor
X
ma profilforum.domena.pl/X
; autorY
, ma profilforum.domena.pl/Y
itd. Jak mogę to zrobić?
Stwierdziłem, iż najłatwiej będzie stworzyć pole użytkownika – jednak nie takie przy wpisie, a takie przy profilu.
Załóżmy więc, iż każdemu z naszych autorów chcemy dać możliwość odpowiedzi na pytanie „jaki jest Twój ulubiony kolor”, chcąc przedstawić tę odpowiedź pod wpisem danego autora.
Trzeba nam będzie więc podjąć dwa kroki:
- stworzyć własną wtyczkę z rzędem odpowiednich funkcji,
- wstawić mały kod do pliku
single.php
.
Zaczynajmy więc!
Tworzymy wtyczkę
Pisanie wtyczki zaczyna się od stworzenia odpowiedniego pliku w folderze wp-content/plugins
– plik nazwijmy „kolory.php
”. Otwieramy go edytorem PHP i wstawiamy kod:
<?php
/*
Plugin Name: Kolory autora
Plugin URI: https://wpninja.pl
Description: Aby inwigilować autorów...
Author: Nathan
Version: 0.0.1
Author URI: http://usarzewicz.org
*/
Tak oto stworzyliśmy swoją własną wtyczkę do WordPressa – wtyczka działa, wyświetlana jest w panelu zarządzania wtyczkami, póki co jeszcze jednak nic nie robi. Aby zaczęła coś robić, musimy wstawić trzy funkcje.
Wstawiamy formularz do profilu użytkownika
Oto kolejne linijki kodu.
// Wstawiamy formularz
function kolory_formularz() // otwieramy funkcję
{
global $wpdb, $user_ID; // przypisujemy zmienne globalne
$kolory_odpowiedz = get_usermeta($user_ID,'kolory_odpowiedz',TRUE); // wyciągamy z bazy odpowiedź, jeśli użytkownik wcześniej jej udzielił
?>
<h3>Odpowiedz na poniższe pytanie</h3>
<table>
<tr>
<th><label for="kolory_odpowiedz">Jaki jest Twój ulubiony kolor</label></th>
<td><input type="text" name="kolory_odpowiedz" id="kolory_odpowiedz" value="<?php echo $kolory_odpowiedz; ?>" /></td>
</tr>
</table>
<?php
}
Powyższy kod wstawi nam do profilu użytkownika WordPressa dodatkowe pole tekstowe na samym dole, w którym będzie można udzielić odpowiedzi. Formularz ten jednak jeszcze się nie pokaże, bowiem brakuje ważnego fragmentu kodu, toteż nie odświeżajcie jeszcze strony ;).
Zapisujemy formularz
Teraz musimy zapisać odpowiedź, której udzielimy w nowym polu. Dane z profilu są już zapisywane przez gotowy skrypt wbudowany w WordPressa, który zapisuje standardowe pola użytkownika, naszym zadaniem jest się pod ten skrypt podpiąć poprzez akcję. Dokonamy tego już za chwilę, najpierw jednak utworzymy nową funkcję:
// Zapisujemy ustawienia
function kolory_formularz_zapisz()
{
global $wpdb, $user_ID; // ponownie wyciągamy zmienne globalne
if (preg_match('&profile.php&', $_SERVER['REQUEST_URI'])) {
$id = $user_ID;
}
elseif($_GET['user_id']) {
$id = $_GET['user_id'];
} // wyciągamy ID użytkownika
if($_POST['kolory_odpowiedz']) { update_usermeta($id ,'kolory_odpowiedz', $_POST['kolory_odpowiedz']); } else { update_usermeta($id, 'kolory_odpowiedz', ''); } // ta linia zapisuje naszą odpowiedź
}
Ta oto funkcja zapisze odpowiedź na pytanie o kolor.
Wyciągamy odpowiedź z bazy i szlifujemy całość
Potrzebujemy jeszcze jednej funkcji.
// Wyciagamy odpowiedz z bazy
function kolory_odpowiedz($id = "")
{
global $wpdb, $user_ID;
$kolory_odpowiedz = get_usermeta($user_ID,'kolory_odpowiedz',TRUE);
return $kolory_odpowiedz;
}
Funkcja kolory_odpowiedz()
za chwilę zostanie użyta to wyciągnięcia z bazy danych odpowiedzi. Ostatnie dwie linie kodu, które musimy wpisać to:
add_action('show_user_profile', 'kolory_formularz');
add_action('profile_update', 'kolory_formularz_zapisz');
?>
Pierwsza z tych linii wyświetli formularz w panelu użytkownika, druga zaś podepnie funkcję zapisywania odpowiedzi pod wbudowany skrypt WordPressa. Oczywiście na końcu zamykamy tag PHP i tym sposobem napisaliśmy wtyczkę.
Wyświetlamy dane na stronie wpisu
Teraz pozostaje nam otworzyć plik single.php
i w zasięgu pętli (the_loop()
) wyświetlić odpowiedź autora na nasze pytanie. Wybieramy miejsce, które nas interesuje i wstawiamy kod:
<?php if ( kolory_odpowiedz(get_the_author_id()) != null ) : ?>Ulubiony kolor autora to: <strong><?php echo kolory_odpowiedz(get_the_author_id()); ?></strong><?php endif; ?>
I tym sposobem wszystko działa tak, jak trzeba. Funkcja get_the_author_id()
wyciąga z bazy ID autora, które jest przekazywane do naszych funkcji we wtyczce, które dalej wyciągają odpowiednią wartość z bazy danych, w tym przypadku odpowiedź na pytanie o kolor ;). Jeśli zaś autor odpowiedzi nie podał i pole jest puste, nic nie zostanie wyświetlone.
Podsumowanie
Dzięki powyższej wiedzy bez problemu będziecie mogli stworzyć własne pola użytkownika, dzięki którym wyświetlicie np. linki do Blipa, Flakera czy Twittera, czy całej masy innych serwisów, a przecież nie muszą to być koniecznie linki.
Jeśli poradnik wam się spodobał, wesprzyjcie studenta dotacją, bo Wrocław drogie miasto, a studia jeszcze droższe :).
Komentarze
No, nareszcie prawdziwy artykuł – oby takich więcej. :)
odpowiedzJak napisać swoją wtyczkę – tego jeszcze nie było, do tego napisane w prosty sposób… Tak trzymać, chlopaki…! ;)
Widzę, że Nat powoli zaczyna dominować na WPNinja ;) Artykuł przydatny, dzięki ;)
odpowiedzKawał mięsiwa! Więcej proszę!
odpowiedzsłuchajcie a może wiecie jak podziałać żeby zwykły użytkownik nie mógł włączyć niczego w stylu „inne wiadomości wordpress” czy „właśnie teraz”?
odpowiedzDzięki panie i panowie za miłe słowa.
@kicay,
odpowiedzOj nie bardzo. Trzeba by może szukać jakiejś wtyczki w sieci na zapytania np. „dashboard management”, hmm.
Da się zrobić – jeśli dam radę to napiszę o tym następny artykuł :-).
odpowiedzo ile dobrze myśle, funkcja zapisu mogłaby być krótsza, jako że ID obecnie zapisywanego usera jest przekazywane przez parametr
function kolory_formularz_zapisz($id)
{
global $wpdb; // ponownie wyciągamy zmienne globalne
if($_POST[’kolory_odpowiedz’]) { update_usermeta($id ,’kolory_odpowiedz’, $_POST[’kolory_odpowiedz’]); } else { update_usermeta($id, 'kolory_odpowiedz’, ”); } // ta linia zapisuje naszą odpowiedź
odpowiedz}
Witam,
A jak z odpornością bazy danych na różne dziwne rzeczy, które mogą być wprowadzone przez użytkownika do bazy „z ręki”?
odpowiedzBaza jak kazda inna baza. Od tego jest walidacja >> https://codex.wordpress.org/Data_Validation
odpowiedzMam pytanie, bo nie umiem sobie poradzić , jak wyświetlić w czystej formie tekstu, login użytkownika i stronę www którą ma w profilu
odpowiedz>> https://codex.wordpress.org/Function_Reference/get_userdata
>> https://codex.wordpress.org/Function_Reference/get_user_by
chyba ze chodzi o aktualnego, to można użyć:
odpowiedz>> https://codex.wordpress.org/Function_Reference/wp_get_current_user
>> https://codex.wordpress.org/Function_Reference/get_currentuserinfo
Dodaj własny komentarz