Kategorie
Snippet WordPress

WordPress: jak zrobić stronę archiwum?

Na mojej stronie jakiś czas temu pojawił się odnośnik do strony zbiorczej archiwum, prezentującej listę lat i miesiącami wraz liczbą wpisów. Dostałem kilka pytań jak to jest zrobione, ponieważ standardowa funkcja wp_get_archives, nie ma podziału pozwalającego pogrupować wpisy jeszcze względem roku.

Kategorie
Snippet WordPress

WordPress – jak stworzyć stronę z autorami

Lista autorów może przydać się na tych wszystkich serwisach, na które nie są prowadzone przez jedną osobę, a chcielibyśmy wyświetlić listę wszystkich piszących na danym blogu.

Sposobów na utworzenie strony zawierającej listę autorów jest co najmniej kilka, choć wszystkie mniej lub bardziej sprowadzą się do wykorzystania funkcji get_users, która pozwala na pobranie listy użytkowników.

Kategorie
Snippet WordPress

WordPress: klasa css dla tagu body

Jak jest jest budowana klasa dla tagu body? Jak to wykorzystać i jak zmienić? Co można na tym zyskać, a co stracić i właściwie do czego jest to potrzebne?

Skąd się właściwie bierze atrybut class w tagu body?

Prawidłowo skonstruowany szablon WordPressa, oprócz kilku innych elementów, zawiera też w otwierający tagu body poniższy kod, który to odpowiedzialny jest za atrybut class tegoż tagu.

<body <?php body_class($class); ?>>
Kategorie
Snippet WordPress

WordPress: jak odpytać inną bazę?

Trafił mi się przypadek, w którym WordPress miał odpytywać inną bazę, zawierającej wyniki cząstkowe pewnego konkursu. Pierwszą myślą było skorzystanie z funkcji PHP, ale skoro WordPress ma wbudowaną obsługę baz danych, to powinno być oczywistą oczywistością, żeby z tego skorzystać.

Kod jest króciutki, bo chodzi o ideę, a nie rozwiązanie:

global $wpdb;
$db2 = new $wpdb( 'db_user', 'db_pass', 'db_name', 'db_host' );
$q = $db2->get_results( 'SELECT code, value FROM competition' );
var_dump( $q );
Kategorie
Snippet WordPress

WordPress: blokowanie w robots.txt kilku rzeczy

W wielu miejscach i przez wiele osób poruszana jest kwestia bezpieczeństwa WordPressa, ale bardzo mało uwagi poświęcone jest niepozornemu zaganieniu, jakim jest plik robots.txt, który sam z siebie nie poprawia bezpieczeństwa, ale wpływa na to co z naszego serwisu skopiują sobie wyszukiwarki.

Zdaję sobie sprawę, że wyszukiwarki tak naprawdę i tak chodzą po tych miejscach, ale przynajmniej nie prezentują na cały świat zawartości. Zaprezentowany kawałek kodu dodaje do pliku robots.txt wpisy, informujące roboty, której treści serwisu nie publikować.

add_filter( 'robots_txt', 'iworks_filter_robots_txt' );
if ( !function_exists( 'iworks_filter_robots_txt' ) ) {
    function iworks_filter_robots_txt( $robots )
    {
        $entries = array(
            '/.htaccess',
            '/license.txt',
            '/readme.html',
            '*/trackback/',
            '/wp-admin/',
            '/wp-content/languages/',
            '/wp-content/mu-plugins/',
            '/wp-content/plugins/',
            '/wp-content/themes/',
            '/wp-includes/',
            '/wp-*.php',
            '/xmlrpc.php',
        );
        $robots .= "\n";
        foreach ( $entries as $one ) {
            $robots .= sprintf( 'Disallow: %s%s', $one, "\n" );
        }
        return $robots;
    }
}

pobierz plik: iworks_add_to_robots_txt.php

Jak użyć podany kod?

Masz 3 rozwiązania:

  1. wrzuć załączony plik do folderu wp-content/plugins, a potem włącz wtyczkę
  2. wrzuć załączony plik do folderu wp-content/mu-plugins
  3. dołącz kod do pliku functions.php aktualnie używanego motywu
Kategorie
Snippet

WordPress: jak zmodyfikować atrybuty ikony wpisu?

Za pomocą funkcji get_the_post_thumbnail1 można w szablonie wstawić miniaturki wpisu, zwane „ikoną wpisu”. Czasem przydałoby się zmodyfikować to co dostajemy na wyjściu i poniżej zaprezentowane są trzy różne sposoby wykorzystania filtra post_thumbnail_html, dzięki któremu można usunąć, zmienić bądź dodać atrybuty obrazka.

Żeby usunąć atrybuty „width” oraz „height” z tego co WordPress produkuje jako ikonę wpisu użyj takiego kodu:

add_filter(
    'post_thumbnail_html',
    create_function(
        '$html',
        'return preg_replace( \'/ (width|height)="\d+"/\', \'\', $html );'
    )
);

Można oczywiście wyczyścić inne parametry, poniżej ich lista, choć czyszczenie parametru src, byłoby „lekko” bezsensu:

  • alt
  • class
  • height
  • src
  • title
  • width

Wykorzystując ten kod może tez zmienić zawartość jakiegoś elementu, np. ustawić na stałe klasę „foo-bar”:

add_filter(
    'post_thumbnail_html',
    create_function(
        '$html',
        'return preg_replace( \'/ class="[^"]+"/\', \'class="foo-bar"\', $html );'
    )
);

Czy też dodać sobie jakiś parametr:

add_filter(
    'post_thumbnail_html',
    create_function(
        '$html',
        'return preg_replace( \'/&lt;img/\', \'&lt;img foo="bar"\', $html );'
    )
);

Jak użyć podany kod?

Masz 3 rozwiązania:

  1. wrzuć załączony plik do folderu wp-content/plugins, a potem włącz wtyczkę
  2. wrzuć załączony plik do folderu wp-content/mu-plugins
  3. dołącz kod do pliku functions.php aktualnie używanego motywu
  1. funkcja get_the_post_thumbnail() []
Kategorie
Snippet

WordPress: jak skasować wpisy krótsze niż…

Dzisiejszy snippet powstał „na zamówienie” jednego z użytkowników kanału #wordpress na IRCu, i służy do kasowania wpisów krótszych niż 800 znaków. Cel właściwie jeden, nadchodząca panda może spamiarakom z krótką treścią zrobić kuku. A temat był fajny, użytkownik za mało łapał sql’a żeby zrobił to z wykorzystaniem kilku poleceń, więc powstała wtyczunia:

add_action( 'admin_init', 'iworks_dtl' );
function iworks_dtl()
{
    global $wpdb;
    $query = 'SELECT ID FROM '.$wpdb->posts.' WHERE LENGTH(post_content) < 800 AND post_type = "post" AND post_status = "publish"';
    $data = $wpdb->get_results( $query );
    foreach( $data as $one ) {
        wp_delete_post( $one->ID, true );
    }
}

pobierz plik: iworks_delete_post_short_that_800.php

Kategorie
Snippet

WordPress: Jak skasować starsze niż miesiąc wersje wpisów?

Zastanawialiście się może kiedyś jak przyrasta baza danych waszego serwisu opartego o WordPress? Jeżeli nie publikujecie kilku wpisów dziennie, to może nie jest to jakaś niesamowita wielkość ale coś tam się dzieje. Każde zapisanie przygotowywanego wpisu tworzy w bazie danych jego wersję i o ile macie ustawioną stałą WP_POST_REVISIONS na wartość większą od zera, to system nie stworzy więcej niż zdefiniowana wartość i tu mógłbym skończyć moje rozważania. Ale…

zobacz też
WordPress: usuń zbędne kopie wpisów

No właśnie jest jedno ale, najstarszy wpis tutaj pochodzi z 2003 roku i nawet jezeli mój  serwis trzyma tylko 3 ostatnie wersje wpisów, to posiadając kilkaset wpisów oznacza to kilkaset do kilkutysięcy rekordów w bazie w dwóch tabelach. W tabelach posts oraz postmeta (nie zapomnijcie o prefiksie).

Poniższy kod, umieszczony w katalogu wp-content/mu-plugins pozwala na czyszczenie bazy ze starszych niż miesiąc wersji wpisów.

add_action( 'admin_init', 'iworks_delete_older_revisions' );
function iworks_delete_older_revisions()
{
    global $wpdb;
    $query = 'delete from '.$wpdb->posts.' where post_type = \'revision\' and post_date < now() - interval 1 month';
    $wpdb->query( $query );
    $query = 'delete a from '.$wpdb->postmeta.' a left join '.$wpdb->posts.' b on b.ID = a.post_id where b.ID is null';
    $wpdb->query( $query );
}

Uznałem, że miesiąc to dobry czas, po którym można usunąć zalegające wpisy. Oczywiście każdy kto zechce może ten okres zwiększyć. Wystarczy zmienić „interval 1 month” na „interval 3 month”, żeby usuwać wersje starsze niż 3 miesiące.

pobierz plik: iworks_delete_revision_older_than_month.php

Kategorie
Snippet WordPress

WordPress: losowa kolejność postów

Jak losowo wyświetlać posty? Nic prostszego, wystarczy jedna linijka kodu (tu rozbite, żeby dobrze się wyświetlało:

add_filter(
    'posts_orderby',
    create_function( '$a', 'return "rand()";' )
);

Jak wykorzystać ten kod?

Należy go wstawić w function.php uzywanego motywu, oczywiście nie w takiej formie, bo nie wyświetlimi pojedynczego wpisu nawet, bo będzie losowy, ale z odpowiednimi warunkami.

Przykład losujący tylko na stronie kategorii:

add_filter( 'posts_orderby', 'iworks_random_order' );
function iworks_random_order( $order ) {
    if ( is_category() ) {
        return "rand()";
    }
    return $order;
}
Kategorie
Snippet WordPress

WordPress: jak zmienić tło w co drugim wpisie

Na polskim forum WordPressa użytkownik kujdak zadał pytanie

Mam skórkę Twenty Eleven ten. chciałem wyróżnić posty – co drugi o np. szarym tle. porsze o pomoc jak to zrobic?

Odpowiedź dotyczy dowolne skórki i jest przewrotna. Wystarczy dodać odpowiednią klasę i ją wyróżnić.

A więc jak dodać klasę?

add_filter( 'post_class', 'iworks_even_odd_post_class_filter' );
 
$post_count = 1;
 
function iworks_even_odd_post_class_filter( $class )
{
    global $post_count;
    $class[] = $post_count++ % 2? 'odd':'even';
    return $class;
}

Oraz dodać odpowiedni wygląd w pliku style.css:

.hentry.odd
{
    background-color:red;
}