Strasznie mnie wkurza nabyta niedawno maniera Akismet-a na stronicowanie listy spamerskich komentarzy dodanych na WordPressie. Nie wiem też czy poprawili to co było na początku po tej zmianie, czyli jeśli w międzyczasie, gdy byłeś na stronie 4 spamów, sprawdzając czy coś się nie nawinęło, a w międzyczasie doszły nowe komentarze, to wyświetlane były na stronie 1, która była już przez Ciebie sprawdzana… I tak oto można było wywalić w kosmos kilka, kilkanaście pozytywnych komentarzy.

Poprawienie tego “błędu” (mówię ogólnie o stronicowaniu spamów) jest dość proste - w obecnej, 2.1.2, wersji Wordpressa, w pliku /wp-content/plugins/akismet/akismet.php wywalamy linie 365 do 372 włącznie, wstawiając zamiast nich:

$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC");

Wywalamy także linie: 379 do 410 włącznie, i 449 do 479 włącznie. Od tej chwili Akismet nie będzie już stronicował wyników :)

Można też ściągnąć gotowego patcha (akismet.wordpress.212.patch) do Wordpress-a, do głównego katalogu Wordpressa w Twojej instalacji i go zaaplikować:

patch -p0 < akismet.wordpress.212.patch

co powinno być nieco prostsze ;) o ile masz dostęp do jakiegoś shella :) Jako bonus, patch spowoduje także numerowanie wszystkich spamów na liście :)


Jakiś czas temu, gdy spam w akismecie przekroczył barierę krytyczną (na tą chwilę mam odfiltrowane poprzez Akismet ponad 30k sztuk spamu), zrobiłem sobie mały, prosty skrypt który odwiedza mi stronę w adminie WordPressa, zbiera odfiltrowane IP postów, i zapisuje mi je, odfiltrowując klasy adresowe z Polski. Skrypcik nazwałem asipht. Dzięki niemu mam mniej więcej podgląd na to, z jakiego IP najczęściej spam dostaję, i najbardziej wybitne persony dodaję bezwarunkowo do .htaccess, w którym mam też kilka klas adresowych zerżniętych chamsko od Mikołaja :)

Skrypt nie jest doskonały, powiedziałbym wręcz że dużo mu brakuje, ale nie chce mi się dodawać więcej funkcjonalności, starcza mi to co jest. Najbardziej przydałaby się opcja porządnego logowania do serwisu, ale w zamian tego podałem mu cookiesy uwierzytelniające z WP :)

Jak ja tego używam: raz dziennie sprawdzam sobie w akismet czy coś się nie zaplątało, jeśli nie to odpalam asipht, a następnie usuwam wszystkie spamowe komentarze (circa 200 dziennie, choć zdarzało się i 1.5k). Za pomoca drugiego skryptu, asiphtstats, podglądam jakie adresy IP “wygrywają” w konkurencji najwięcej spamu z jednego adresu IP, a później ręcznie dodaję sobie zwycięzców do .htaccess, zapewniając sobie tym święty spokój od tego pismaka :)

Gdyby ktoś był zainteresowany takim skrypcikiem, to używane przeze mnie pliki można sobie pobrać z adresu urzenia.net/wp-content/asipht/.

Acha, odnośnie konfiguracji (znajdującej się pod koniec pliku asipht):

c_user_n
nazwa cookie z nazwą użytkownika (coś w stylu: wordpressuser_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
c_user_v
zawartość tegoż cookie
c_pass_n
nazwa cookie z hasłem (np. ‘wordpresspass_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’)
c_pass_v
zawartość tegoż cookie
c_domain
nazwa domeny dla jakiej przeznaczone jest cookie
c_path
ścieżka dla cookie
url
pełen URL do strony z Akismet w naszym WP
savepath
określa ścieżkę zapisu pliku z zebranymi spamerskimi IP
whitelist
ścieżka do pliku z zakresami IP które nie będą dodawane do bazy, np: 217.119.64.0 217.119.79.255
pages
boolean, określa czy nasz Akismet stronicuje wyniki zebranego spamu (tak jak w nowej wersji), czy też nie (jak w starszej, lub zmodyfikowanej mojej :) )

Uznałem za potrzebne usunięcie niektórych stron z listingu w sidebarze. Jako, że jestem leniwy, to nie chciało mi się poszukać, czy ktoś już nie zrobił plugina do tego… wymagałoby to myślenia, a dziś wybitnie nie mam do tego głowy ;) Więc jako że PHP w którym jest napisane WP, które znam dosć dobrze, i zazwyczaj nie muszę zbyt dużo przy nim myśleć (odnośnie takich drobiazgów), to sobie poprawiłem WordPressa ;)

Włączanie i wyłączanie tego fiuczera jest dość proste - zmiana wywołania funkcji wp_list_pages(). Jej argumentem jest string w formacie takim jak URLe (a=1&b=2&c=3) więc teraz wywołanie wp_list_pages() wygląda tak:

wp_list_pages('hidden=0')

(no, ciut inaczej w moim wypadku, ale to nie ma znaczenia…).

Zmodyfikowałem zatem funkcję get_pages() (pośrednio wywoływaną przez wp_list_pages()), a diff tej zmiany wygląda tak:

--- template-functions-post.php.org     2005-12-06 19:32:17.837970264 +0100
+++ template-functions-post.php 2005-12-06 19:32:53.698518632 +0100
@@ -277,6 +277,7 @@
        if (!isset($r['child_of'])) $r['child_of'] = 0;
        if (!isset($r['sort_column'])) $r['sort_column'] = 'post_title';
        if (!isset($r['sort_order'])) $r['sort_order'] = 'ASC';
+       if (!isset($r['hidden'])) $r['hidden'] = 1;

        $exclusions = '';
        if (!empty($r['exclude'])) {
@@ -297,6 +298,19 @@
        if ( empty($pages) )
                return array();

+       if (!$r['hidden'])
+       {
+         while (list($key,$val)=each($pages))
+         {
+           $id = $val->ID;
+           $hide = get_post_meta($id, 'hide', true);
+           if ('' != $hide)
+           {
+             unset($pages[$key]);
+           }
+         }
+       }
+
        // Update cache.
        update_page_cache($pages);

Teraz wystarczy jako Custom Field wstawić pole hide o wartości 1 (czy jakiejkolwiek innej), żeby dana strona nie była listowana w sidebarze ;)

Teoretycznie dobrze by było to zrobic jako plugin WP, ale już wspominałem, że nie chce mi się dziś myśleć. Poza tym łatwo to wyłączyć. I mam w planach rezygnację z WP ;) I jeszcze trochę wymówek bym znalazł jak by trzeba było ;)


Nie chce wnikać w szczegóły, ale cosik nowy WP nie bardzo chce śmigać. Jakiś czas temu zrobiłem svn up w katalogu z betą WP, i przestałem mieć możliwość wchodzenia do admina (Your database is out-of-date. Please upgrade.), a na stronie głównej biała plama… Oczywiście próby ugrade’u bazy nic nie dały. Nie dość tego, zmęczony oczekiwaniem i szukaniem, wywaliłem dziś WP i zainstalowalem go od nowa. Dalej to samo. Dziwne ;) Mam dość bawienia się tak nieco, może za jakiś czasu uaktualnie wpbeta.


Jako, że zachciałem sobie dodać pixelarta z PageRank-iem, to moj RandomPixelart musiał zyskać zdolność rozpoznawania zdalnych adresow w bazie. No i zyskał ;)

Przeróbka dotyczy linii 87, gdzie zamiast:

$pixelart_home,

pojawił się posty regex, sprawdzający czy czasem URL obrazka nie zaczyna się od ‘http | https | ftp’:

preg_match(’#^(https?|ftp)://#i’, $pixelart_position[0]) ? ” : $pixelart_home,

dzięki czemu do adresów tych nie jest dodawany URL samego WP.

UWAGA: w regexpie powyżej WP automatycznie zamienił znaki ftp na pisane wielką literą - w źródłach samego pluginu te trzy znaczki są wpisane małymi literami (choć, uwzględniając fakt literki i w regexpie, nie ma to większego znaczenia…).


Jednak mi się dziś chciało. Zrobiłem skrypta do konwersji całości Wordpressa z ISO-8859-2 na UTF-8. Oczywiście może też posłużyc do konwersji całkiem innych kodowań, wystarczy zmienić argumenty w wywołaniu funkcji iconv(). Skrypt znajduje się pod adresem: urzenia.net/wp-content/iso2utf/. Można go dowolnie zmieniać i wykorzystywać do własnych potrzeb, zgodnie z zasadami GPLv2.

Skrypt zmienia tylko zawartość bazy, te tabele i pola które uznałem że trzeba zmienić, reszta (przynajmniej w wersji WP 1.5.1.2 nie musi być konwertowana.

Skrypt nie zmienia za to collation w wersjach MySQL wyższych niż 4.0, więc do tego potrzeba ręcznie pogrzebać w bazie danych. Mi zajęło to jakieś 30 minut, ale nie chciałem tego robić automatem. Poza tym wszystko działa :)

Po zakończeniu działania skryptu, w katalogu w którym on się znajduje będzie utworzony plik converted.sql, który trzeba ręcznie wrzucić do bazy - również tego nie chciałem żeby robić automatem - nigdy nie miałem do nich zaufania ;)

Oczywiście nie biorę odpowiedzialności za złe działanie skryptu (za dobre zresztą też nie), etc etc. Używasz go na własną odpowiedzialność :)

Jeśli gdzieś ktoś dojrzy na diary jakieś problemy z pl-znaczkami, to proszę o info.


zrobilem cos a’la maly plugin do wp. nazwalem to to ‘random pixelart’, bo generuje liste, za kazdy razem z inna kolejnoscia, obrazkow (w moim zamierzeniu - pixelartow, 80×15), i wyswietla na stronie. ‘plugin’ znajduje sie pod adresem: http://urzenia.net/proj/wp/randompixelart.php http://urzenia.net/proj/wp/randompixelart.phps, wystarczy sciagnac go do katalogu WP_HOME/wp-content/plugins, wlaczyc w adminie, a pozniej w sidebarze (czy gdzies gdzie sie chce miec liste) wystarczy dac:

<?php wp_pixelart([options]); ?>

i poszczegolne opcje:

$pixelart_db_add
tablica tablic (o strukturze takiej jak $pixelart_db - opis nizej). zostaje na koncu scalona z cala baza pixelartow
$pixelart_home
sciezka do obrazkow. jesli null, to ustalana na jako:$pixelart_home = get_settings('url_site') . '/wp-content/';. w wiekszosci wypadkow nie ma potrzeby ruszania tego.
$pixelart_tags
czteroelementowa tablica, domyslnie: array('<ul>', '<li>', </li>', '</ul>'). jak latwo sie domyslic, pierwszy element to tag pojawiajacy sie przed cala lista elementow, drugi - tag przed kazdym z elementow, trzeci - za kazdym z elementow, i czwarty - tag ktory ma sie pojawic za caloscia
$pixelart_tpl
szablon tworzaych sie linijek z pixelartami. domyslnie: %s<a href="%s"><img src="%s%s" alt="%s" title="%s" /></a>%s. mysle, z enie bede tlumaczyl znaczenia calosci - co najwyzej podpowiem, ze jest to wstawiane do phpowej funkcji sprintf.

w pliku plugina utworzona jest moja baza pixelartow, przechowywana w zmiennej $pixelart_db. jej struktura:

$pixelart_db = array(
  array(
    'nazwa_obrazka.png',
    'tekst pojawiajacy sie w alt i title',
    'link do jakiego ma prowadzic pixelart'),
  array(
    'nazwa_obrazka.gif',
    'inny tekst pojawiajacy sie w alt i title',
    'inny link do jakiego ma prowadzic pixelart')
);

update:
zmienilem link do skryptu z blednego http://urzenia.net/proj/wp/randompixelart.php na wlasciwe http://urzenia.net/proj/wp/randompixelart.phps


dorzucilem wczesniej tez plugina do wp, o nazwie countdown (lub dates to remember) link. pozwala na wstawienie w spechjalnym formacie listy dat, i wydarzen jakie sie wtedy pojawia. dzieki temu po prawej mam od kiedy jestem bezrobotny, czy kiedy konczy mi sie sad. taki gadzet.

plugin ma fajne mozliwosci - mozna nawet ustawic, ze jakies wydarzenie jest w ostatnia srode miesiaca czy rozne takie - czyli nice. brakowalo mi tylko jednej rzeczy. jako, ze plugin ma cos a’la tagi, jak np %nocountdown%, wykorzystalem to i dodalem tag %sticky%. normalnie, sa pokazywane wszystkie daty, lub okreslona ilosc najswiezszych (inne wariacje sa wymienione w dokumentacji). dodanie gdzies w opisie wydarzenia mojego tagu powoduje, ze dana data jest wyswietlana _zawsze_, niezaleznie od tego, czy dane wydarzenie bedzie nedlugo czy tez za 10 lat. wszystkie daty z tagiem %sticky% beda zawsze na gorze wszystkich dat. etc. jesli ktos chce przetetsowac, to moja wersja znajduje sie pod adresem: urzenia.net/wp-content/countdown.tar.bz2


Strona 1 z 2