Kategoria: Snippet Strona 2 z 4

WordPress: omiń 3 wpisy na stronie głównej

Na forum WordPressa mateoo88 zapytał(a):

Potrzebuję tak przerobić kod odpowiedzialny za wyświetlanie wpisów aby wyświetlały mi się one np od 4 (aby 4 wpis był wyświetlany jako pierwszy a 1,2 i 3 wpis był ignorowany).

I moja pierwsza myśl była następująca:

add_filter( 'posts_request', 'a' );
 
function a( $query )
{
    if ( is_home() ) {
        if ( preg_match( '/LIMIT (\d+), (\d+)/', $query, $matches ) ) {
            $offset = 3;
            $target = sprintf(
                'LIMIT %d, %d',
                $matches[1] + $offset,
                $matches[2] + $offset
            );
            $query = preg_replace( '/LIMIT \d+, \d+/', $target, $query );
        }
    }
    return $query;
}

Co oczywiście zadziała, ale nie jest to rozwiązanie eleganckie i pół dnia męczyło mnie, że powinno się to zrobić inaczej, jakoś tak bardziej „poprawnie”.

Po przejrzeniu w codex dostępnych filtrów, uznałem że dużo lepsze jest skorzystanie z filtra pre_get_posts, co dało efekt w postaci takiego kodu:

add_filter( 'pre_get_posts', 'iworks_skip_3_posts' );
 
function iworks_skip_3_posts( $query )
{
    if ( is_home() ) {
        $query->set( 'offset', 3 );
    }
    return $query;
}

Moim zdaniem, takie rozwiązanie jest zdecydowanie bardziej eleganckie.

Standardowo kod do pobrania:

[zip href='http://iworks.pl/wp-content/uploads/2012/10/iworks-skip-3-posts.php-.zip']iworks_skip_3_posts.php.zip[/zip]

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

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.

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.

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); ?>>

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 );
Robot Embroidery Pattern by jo^4, on Flickr

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;
    }
}

[zip href="http://iworks.pl/wp-content/uploads/2012/01/iworks_add_to_robots_txt.php_.zip"]iworks_add_to_robots_txt.php[/zip]

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

WordPress: jak zmodyfikować atrybuty ikony wpisu?

Za pomocą funkcji get_the_post_thumbnailfunkcja get_the_post_thumbnail() 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

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 );
    }
}

[zip href="http://iworks.pl/wp-content/uploads/2012/01/iworks_delete_post_short_that_800.php.zip"]iworks_delete_post_short_that_800.php[/zip]

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…

[blo-link-inner href="http://iworks.pl/2011/01/06/wordpress-usun-zbedne-wersje/"]WordPress: usuń zbędne kopie wpisów[/blo-link-inner]

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.

[zip href="http://iworks.pl/wp-content/uploads/2012/iworks_delete_revision_older_than_month.php.zip"]iworks_delete_revision_older_than_month.php[/zip]

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;
}

Strona 2 z 4

Oparte na WordPress & Theme by Anders Norén