Nawiązując do ostatnio zorganizowanego konkursu na wpadmin.pl, chciałbym podrzucić wszystkim dość ciekawy sposób na losowanie listy zwycięzców. Do samego końca zastanawiałem się, w jaki sposób najlepiej będzie zrobić to losowanie w uczciwy, rzetelny sposób, tak aby było widać, że jakieś losowanie jednak się odbyło. Postawiłem na prostotę i się nie zawiodłem, dlatego mogę szczerze polecić! 🙂

Zaprezentowane tutaj rozwiązanie jest proste, jednocześnie bardzo elastyczne, a co najważniejsze nie wymaga dużo czasu i pracy na jego realizację.

 

Losowanie listy zwycięzców

Zanim przejdę do konkretów, wyjaśnię jeszcze, co można osiągnąć dzięki temu rozwiązaniu i dlaczego warto…

Specyfikacja konkursu

Ostatnim razem, aby wziąć udział w konkursie i późniejszym losowaniu nagród należało napisać komentarz pod artykułem konkursowym. Na tej podstawie z listy wszystkich zgłoszeń wylosowane zostały 3 zwycięskie osoby. Teraz pytanie, jak w WordPressie, na podstawie dodanych pod wpisem komentarzy losowo wybrać 3 osoby, które zostaną nagrodzone?

 

Wymagane narzędzia

Losowanie zwycięzców phpmyadmin

Na liście wymaganych narzędzi znajduje się tylko dostęp do phpMyAdmin. Narzędzie jest na tyle popularne i łatwe w obsłudze, że nie powinno być z nim większych problemów.

Zamiast phpMyAdmin można również użyć innego narzędzia, w którym możliwe jest wykonywanie zapytań do bazy danych MySQL. Jeżeli nie wiesz jak uzyskać dostęp do phpMyAdmin napisz w komentarzu.

 

Zapytania MySQL na bazie WordPress

Teraz przejdźmy do konkretów. Odpalamy w przeglądarce PHPMyAdmin i logujemy się do swojej bazy WordPress. Z lewej kolumny wybieramy naszą bazę, po rozwinięciu drzewka szukamy pozycji wp_comments (prefix może się różnić) – jest to tabela w której przechowywane są komentarze. Całego języka SQL nie będę tłumaczył, ale pokażę podstawowe zapytania, które można skopiować i po lekkiej modyfikacji wywołać na swojej bazie.

PHPMyAdmin tablea wp_comments

 

Wyświetlenie komentarzy dodanych tylko do wybranego wpisu

Pierwszy problem jest taki, że w tabeli wp_comments dodawane są komentarze ze wszystkich wpisów, również te znajdujące się w koszu, czy oznaczone jako spam. Aby sobie z tym poradzić potrzebna nam będzie informacja o identyfikatorze przypisanym do konkretnego wpisu tzw. ID. Aby to ustalić wystarczy przejść do kokpitu WordPress, wyświetlić listę wpisów i wybrany wpis otworzyć do edycji. W adresie URL, po fragmencie post=, powinna znaleźć się liczba, która będzie poszukiwanym przez nas ID.

Przykład URL z ID równym 1691:

https://wpadmin.pl/wp-admin/post.php?post=1691&action=edit

Mamy już wszystkie potrzebne informacje do pierwszego zapytania. Z górnego, poziomego menu wybieramy opcję SQL lub W linii, otworzy nam się prosty edytor, który pozwala na wpisanie i wywołanie kwerendy SQL. Obie opcje zaznaczyłem na czerwono na poprzednim screenie.

Pierwsze zapytanie SQL będzie następujące:

SELECT * FROM `wp_comments` 
WHERE `comment_post_ID`=1691;

I oznacza tyle, co: Pokaż wszystkie rekordy znajdujące się w tabeli wp_comments, które są przypisane do wpisu o ID 1691.

Po jego wykonaniu powinniśmy zobaczyć coś takiego:

Losowanie listy zwycięzców

Zamiast gwiazdki można wypisać tylko te kolumny, które będą nam potrzebne, dzięki temu kolejne wyniki zapytań będzie łatwiej przeglądać:

  • comment_author – podpis autora komentarza,
  • comment_author_email – e-mail autora komentarza,
  • comment_author_IP – IP autora komentarza, dzięki niemu będziemy mogli sprawdzić, czy ktoś nie dodał dwóch zgłoszeń z tego samego IP,
  • comment_content – treść komentarza.
SELECT `comment_author`, `comment_author_email`, `comment_author_IP`, `comment_content` 
FROM `wp_comments` 
WHERE `comment_post_ID`=1691;

To zapytanie jest równoważne do poprzedniego z tym, że wyświetlamy tylko wybrane kolumny.

phpMyAdmin losowanie wygranych

 

Odsiewanie wielokrotnych zgłoszeń

Zróbmy użytek z pola comment_author_IP i sprawdźmy, czy ktoś nie dodał wielu zgłoszeń do naszego konkursu z jednego IP. Najprościej jest to zrobić stosując ORDER BY. Niestety ORDER BY nie sprawdzi się w przypadku większej ilości zgłoszeń.

SELECT `comment_author`, `comment_author_email`, `comment_author_IP`, `comment_content` 
FROM `wp_comments` 
WHERE `comment_post_ID`=1691 
ORDER BY `comment_author_IP`;

 

Lepsze, ale bardziej skomplikowane zapytanie, będzie korzystało z funkcji COUNT. Użyjemy go w kwerendzie wraz z funkcją agregującą GROUP BY, która zliczy a następnie wyświetli ilości rekordów posiadających ten sam adres IP:

SELECT COUNT(*) AS `Liczba_zgloszen`, `comment_author`, `comment_author_email`, `comment_author_IP`, `comment_content` 
FROM `wp_comments` 
WHERE `comment_post_ID`=1691 
GROUP BY `comment_author_IP` 
ORDER BY `Liczba_zgloszen` DESC;

DESC posortuje wyniki – od najwyższej do najmniejszej liczby zgłoszeń.

phpMyAdmin wielokrotne zgłoszenia

Typowanie listy zwycięzców

I na koniec zapytanie, które:

  • wybierze 5 kolumn (4 poprzednie + obliczoną liczbę zgłoszeń),
  • wylosuje dokładnie 10 komentarzy – 10 na wypadek podanego błędnego maila, lub niepoprawnej treści zgłoszenia,
  • odrzuci wszystkie wielokrotne zgłoszenia.
SELECT COUNT(*) AS `Liczba_zgloszen`, `comment_author`, `comment_author_email`, `comment_author_IP`, `comment_content` 
FROM `wp_comments` WHERE `comment_post_ID`=1691 
GROUP BY `comment_author_IP` 
HAVING `Liczba_zgloszen`=1 
ORDER BY RAND() 
LIMIT 10;

Losowanie listy zwycięzców

Przypominam, że aby podane zapytanie uruchomić poprawnie na swojej bazie, należy najpierw upewnić się, czy przedrostek tabeli z komentarzami to dokładnie wp_, oraz że podaliśmy prawidłowy identyfikator wpisu w tym fragmencie:

WHERE `comment_post_ID`=1691

Podsumowanie

W moim konkursie było około 20 zgłoszeń, jednakże sposób sprawdzi się dobrze również na 20 tysiącach. Dodatkowo warto podkreślić, że nasz nakład pracy do wygenerowania gotowej lsty zwycięzców będzie dokładnie taki sam. Brak potrzeby eksportu, czy przepisywania jakichkolwiek danych zdecydowania ułatwia i przyspiesza cały proces. Dodatkowo, jak już wcześniej wspominałem sposób jest bardzo elastyczny. Oznacza to, że przykładowo możliwe jest określenie ram czasowych w których konkurs się odbywał, czy też dodanie kolejnych warunków specjalnych.

 

Wpis otagowano:

Komentarze do wpisu 2 komentarze

Pomogłem? Dodaj coś od siebie! Skomentuj ten wpis:

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *