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
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
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…! ;)
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Widzę, że Nat powoli zaczyna dominować na WPNinja ;) Artykuł przydatny, dzięki ;)
odpowiedzWarning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Kawał mięsiwa! Więcej proszę!
odpowiedzWarning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
sł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”?
odpowiedzWarning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Dzię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.
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Da się zrobić – jeśli dam radę to napiszę o tym następny artykuł :-).
odpowiedzWarning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
o 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}
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
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”?
odpowiedzWarning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 60
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 60
Baza jak kazda inna baza. Od tego jest walidacja >> https://codex.wordpress.org/Data_Validation
odpowiedzWarning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 43
Mam pytanie, bo nie umiem sobie poradzić , jak wyświetlić w czystej formie tekstu, login użytkownika i stronę www którą ma w profilu
odpowiedzWarning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 60
Warning: Undefined variable $user_ID in /home/klient.dhosting.pl/wpn/wpninja.pl/public_html/wp-content/themes/wpninja/comments.php on line 60
>> 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