[WordPress] Pobieranie ilości i treści zapytań oraz czasu generowania strony

Często zachodzi potrzeba sprawdzenia tego, jak wygląda czas generowania naszej strony lub ile generuje ona zapytań do bazy danych. Pomijając tutaj użycie profilerów (choćby ze względu na brak dostępności na większości hostingów) pokażę jak uzyskać takie informacje w skrypcie Wordpress.

Pobieranie ilości zapytań
Aby uzyskać ilość zapytań wykonanych do bazy przez Wordpressa należy skorzystać z funkcji get_num_queries() - zwraca ona liczbę tylko liczbę wykonanych zapytań. Przykład użycia pokażę na końcu wpisu.

Pobieranie listy zapytań
Pobranie samej treści wykonanych zapytań jest już lekko trudniejsze. Należy zacząć od zdefiniowania jednej stałej w pliku wp-config.php. Gdzieś w nim (można to zrobić np. po stałej WP_DEBUG) należy umieścić następujący zapis.

define('SAVEQUERIES', true);

W tym momencie Wordpress zacznie logować informacje na temat wszystkich wykonanych przez siebie zapytań. Aby je wyświetlić możemy użyć kodu oferowanego przez oficjalną dokumentację WP:

<?php
if (current_user_can('administrator')){
  global $wpdb;
  echo "<pre>";
  print_r($wpdb->queries);
  echo "</pre>";
}
?>

Zasada działania jest prosta: jeżeli dany użytkownik ma uprawnienia administratora, to pokaże się dump tablicy wielowymiarowej zawierającej informację o zapytaniu. Na każde zapytanie składają się trzy klucze. Pierwszy określa treść zapytania, drugi: czas jego wykonania, a trzeci mówi o tym jak po kolei wyglądała droga do wykonania tego zapytania (dołączane pliki i wywoływane funkcji).

Jeżeli jednak, tak jak ja, nie potrzebujecie aż tak szczegółowych informacji o każdym zapytaniu, możecie użyć takiego kodu:

<?php
global $wpdb;
foreach ($wpdb->queries as $query) 
  echo $query[0]."\n";
?>

Ten kod pokazuje jedynie treść wykonanych zapytań. Uwaga: ja używam tego kodu do wsadzenia tej informacji w HTML-owy komentarz. Jeżeli chcecie wyświetlić to na stronie, to pamiętajcie o zamianie nowej linii na br. Oczywiście można dodać sprawdzanie uprawień użytkownika, aby takie informacje udostępnić tylko dla administratorów (to wskazane posunięcie!).

Pobieranie czasu generowania strony
Do pobrania czasu generowania strony opartej na WP służy funkcja timer_stop(). Przyjmuje ona dwa parametry, pierwszy określa czy wartość ma być wyświetlona (1), czy zwrócona (0; ustawienie domyślne). Drugi określa zaś precyzję, czyli ilość cyfr po przecinku w czasie generowania (domyślnie 3). Przykład użycia za chwilkę.

Sprawdzanie ilości użytej pamięci
Tutaj skorzystamy już z wbudowanej w PHP funkcji memory_get_usage(). Zwraca ona wynik w bajtach, tak więc dla lepszej czytelności zatroszczymy się o przeliczenie na megabajty.

<?php echo number_format(memory_get_usage()/1024/1024, 2); ?>

Drugi parametr funkcji number_format() także określa liczbę miejsc po przecinku.

Kompletny przykład
Oto przykładowa implementacja powyżej pokazanych rozwiązań.

<!--
Zapytania: <?php echo get_num_queries();
global $wpdb;
foreach ($wpdb->queries as $query) 
  echo $query[0]."\n";  ?>
Czas generowania: <?php timer_stop(1, 2); ?>s
Użyta pamięć: <?php  echo number_format(memory_get_usage()/1024/1024, 2); ?>MB
-->

I to by było na tyle. Mam nadzieję, że przedstawione rozwiązanie do czegoś się Wam przydało. Pamiętajcie też, że po skończonym debugu lepiej jest usunąć stałą SAVEQUERIES z konfiguracji lub przestawić ją na false, gdyż włączenie opcji logowania zapytań zwiększa zużycie zasobów.

[SQL] Wordpress - statystyka komentarzy, najczęściej komentujący

Wpis opisuje akcję dosłownie sprzed chwili. Napisał do mnie m4tx z prośbą o napisanie zapytania SQL, które pobierało by komentarze z Wordpressa, każdemu użytkownikowi przypisując ilość napisanych przez niego komentarzy. Jestem zdziwiony, gdyż udało mi się to zrobić za pierwszym razem (potem musiałem jedynie dodać DISTINCT-a, o którym zapomniałem).

Jak pewnie wie, każdy kto programuje, w tej dziedzinie mało co wychodzi za pierwszym razem :D Tak czy siak postanowiłem podzielić się swoim dziełem:

SELECT DISTINCT comment_author AS author, (SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_author = author) AS amount FROM wp_comments WHERE comment_approved = 1 ORDER BY amount DESC

Takie oto zagnieżdżone zapytanie doskonale rozwiązuje nasz problem :) Poniżej demonstruję wynik działania zapytania na danych z mojego bloga (to nie jest pełny wynik rzecz jasna :) nie ma sensu wkładać do screena całych danych)

Wynik zapytania

[SQL] Wordpress - pobieranie najdłuższych wpisów

Witam, dziś bez zbędnego gadania, będzie bardzo krótko.

Przedstawiam to proste zapytanie SQL, które pobierze tytuły wpisów i ilość słów w nich zawartych oraz posortuje po ich ilości.

SELECT
  post_title, 
  (LENGTH(post_content) - LENGTH(REPLACE(post_content, ' ', ''))) AS words
FROM 
  wp_posts
WHERE
  post_status = 'publish' AND post_type = 'post'
ORDER BY
  words DESC

Tak, to tyle. Na koniec screen z fragmentem wyniku działania na przykładzie mojego bloga:

Wynik zapytania

Amen, dobranoc państwu :)

Uwaga! To SĄ ćwiczenia!

Przedwczoraj (wtorek) na lekcji matematyki wychowawczyni wspomniała o tym, że następnego dnia ma się odbyć… próbny alarm przeciwpożarowy.

Cóż za cudowna niespodzianka, nieprawdaż? Według mnie powód podania tej informacji był bardzo prosty i nie chodziło tu o popsucie surprajsu czy uniknięcie paniki. Jak stwierdziła sama wychowawczyni – czas ewakuacji będzie zestawiany z innymi szkołami. Czyli ponownie – Statystyki Są Najważniejsze.

Dlatego wczoraj gdy dzwonek zadzwonił 15 minut wcześniej niż powinien – zdziwienia nie było. Bo przecież podano nam dzień wcześniej nawet lekcję na której cały event miał się odbyć – uroczo :).

Pani spokojnie wstała z krzesła, podniosła kartkę z biurka i przeczytała z niej – „Proszę nie panikować…” Oczywiście całą klasową lożą szyderców zaczęliśmy się wydzierać tak głośno jak to tylko możliwe, że „wszyscy zginiemy!”, „Już po nas!” i tak dalej…

Potem nauczycielka spokojnie wyrecytowała drogę do najbliższego wyjścia ewakuacyjnego. Bez pośpiechu spakowaliśmy swoje rzeczy, zdążyłem nawet wytrzeć tablicę i napisać na niej wielkie „SOS” – dla potomnych :)

Potem udaliśmy się do wyjścia ewakuacyjnego. Cóż za szczęście że akurat wtedy było ono otwarte. Drugi raz podczas trzech ostatnich lat, jak dobrze pamiętam. Los nam sprzyjał :P Udaliśmy się na boisko szkolne i usiedliśmy klasami.

Potem ktoś wyznaczony sprawdził czy dotarli wszyscy nauczyciele – no tak… Nauczyciele. O nas, uczniów, nikt się nie martwił. Posiedzieliśmy tam około 15 minut integrując się podczas rzucania żołędziami w kogo popadnie. Potem Ktoś Kogo Nie Widziałem, powiedział przez megafon Coś Czego Nie Słyszałem.

Po owym zaklęciu, bo tym musiało to być, niepaląca szkoła przestała się palić, nieistniejący strażacy stali się jeszcze bardziej nieistniejącymi, a my wróciliśmy do naszej ukochanej szkoły…

Trafić z tematem…

Pisząc swojego bloga nigdy nie starałem się trafić w jakiś temat po to aby nabić sobie odwiedzin. Pisałem po prostu tylko o tym, czym chciałem podzielić się z innymi.

Tymczasem okazało się, że niechcący trafiłem w naprawdę mocną tematykę. W ostatni czwartek napisałem wpis o łańcuszkach w Orange. Miał być to krótki wpis na temat denerwującego mnie spamu.

Dziś, około pół godziny temu, jak od czasu do czasu, postanowiłem sprawdzić moje statystyki w Google Analytics.

Peak statystyk

Pierwszą rzeczą o której pomyślałem było to, że G Analytics skasowało mi poprzednie odwiedziny, ale po najechaniu na ową wybitą do góry kropę ujrzałem liczbę… 297. Być może na niektórych z Was ta liczba nie robi wrażenia, ale w przypadku gdzie mój blog ma ok. 20 odwiedzin dziennie, a dotychczasowy rekord wynosił 49, to powyższa sytuacja była dla mnie szokiem.

Postanowiłem zbadać tą sytuację. Moją pierwszą myślą było to, że boty spammerskie w jakiś sposób zaczęły wykonywać JS od G Analytics, jednak sprawdzenie z jakiej lokalizacji pochodzą odwiedziny tego dnia. Okazało się, że ok 98% było z Polski. To dość mocno zbiło mnie z tropu.

Postanowiłem sprawdzić po jakich słowach znaleziono moją stronę.

Słowa kluczowe

Wtedy wszystko stało się jasne. Po prostu… trafiłem z tematem :)

Rok i jeden dzień Sobak's Bloga

W tym momencie powinienem napisać, że dzisiaj nadeszła długo oczekiwana data - pierwsza rocznica powstania mojego bloga. Niestety nastąpił pewien wypadek. Pamiętałem miesiąc temu, pamiętałem pół miesiąca temu, pamiętałem 2 tygodnie temu… a wczoraj zapomniałem. :P

Ale teraz nadszedł czas na podsumowanie tego co udało się dokonać przez te 366 dni. No to lecimy.

  • Napisałem 68 wpisów - około miesiąca przed rocznicą założyłem sobie, że dociągnę do 60 wpisów, więc plan zrealizowałem ze sporą nawiązką.
  • Zostawiliście u mnie 207 komentarzy. Dziękuję za wszystkie razem i każdy z osobna :)
  • Licząc tylko od 30. listopada (moment założenia konta na Google Analytics dla sobak.pl) wyświetlaliście podstrony mojego bloga prawie siedem tysięcy razy.
  • Spamboty zostawiły około dwustu "komentarzy". Tutaj wyjątkowo powstrzymam się od podziękowań. Wypadałoby natomiast podziękować Askimetowi.

Najczęściej komentujący:

Im oraz wielu innych, którym też bardzo dziękuję! W końcu liczy się nie tylko ilość, ale jakość.

Ilość wpisów w danych miesiącach (kliknij aby powiększyć) Podsumowanie ilości wpisów

Cele na przyszły rok

  • nie zapomnieć o drugiej rocznicy :D
  • dociągnąć co najmniej do 130 wpisów
  • doprowadzić IronCMS-a do bezproblemowej używalności
  • zrobić podstronę informacyjną dla IronCMS-a
  • ustabilizować ilość unikalnych odwiedzin w Analytics (na razie wygląda to jak zapis sejsmografu po trzęsieniu)

I to by było na tyle. Nie będę zanudzać więcej :)

Koniec świata w 2012?

Wpis tym razem o tematyce czysto życiowej. Już chyba każdy słyszał o rzekomo przepowiedzianym przez majów końcu świata mającym nastąpić w 2012 roku.

Nie mam się za osobę szczególnie przesądną, ale obserwując ostatnie wydarzenia dochodzę do pewnych przemyśleń. Dla mnie zaczyna to wyglądać tak jakby ktoś uparcie tworzył atmosferę nadchodzącej apokalipsy. Zacznę może od początku:

  • 11 stycznia – powodzie i lawiny błotne w Brazylii
  • 12 stycznia - obalono rząd w Libanie
  • 13 stycznia - fala kulminacyjna powodzi stulecia w Australii
  • 14 stycznia - Ben Ali, prezydent Tunezji zostaje obalony
  • 24 stycznia - zamach na lotnisku w Moskwie - ginie kilkadziesiąt osób
  • 25 stycznia - początek protestów w Egipcie
  • 3 lutego - przydzielenie ostatniej puli adresów IPv4 (taki internetowy akcent w apokalipsie :D)
  • 11 lutego - Hosni Mubarak obalony - kolejny bastion dyktatury padł
  • środek lutego - rozkręcają się inne protesty, m. in. w Algierii, Libii, Jemenie itd.
  • 8 marca – co najmniej 25 osób zginęło w zamachu bombowym w Fajsalabadzie
  • 11 marca - koszmarne trzęsienie Ziemi w Japonii. 2 pociągi znikają z powierzchni Ziemi, zaginął także statek, a w wyniku tsunami domy spływają do rzek. Zagrożenie skażeniem radioaktywnym po wybuchu w elektrowni.

Wnioski do wyciągnięcia pozostawiam Wam. Szykujecie już zapasy na dwudziesty pierwszy grudnia 2012, czy traktujecie to jako zbieg okoliczności? :P

Cztery miesiące istnienia bloga

Dokładnie cztery miesiące temu, tj. 10 maja 2010 powstał blog który właśnie czytasz. W zamierzeniu miał być on miejscem gdzie będę wyrażał swoje myśli związane ze szkołą. Szczerze mówiąc obawiałem się że blog okaże się kolejnym pomysłem, który upadnie po tygodniu…

Na szczęście tak się nie stało. :)

Trochę nudnych statystyk…
Liczba wpisów: 18
Liczba autorów: 2
Dni istnienia: 133 (chyba że się pomyliłem :P)
Wpisów dziennie: 0.1…

Odnośnie ostatniej liczby. Ilość wpisów powinna niedługo się zwiększyć, ponieważ minęły wakacje i zwiększyła się liczba tematów do opisania.

So… May this Blog be with you!