Посты с тегом wppl
30
апреля
2008

Удобный архив постов для WordPress

Решил развить тему предыдущего поста, раз уж она вызвала интерес.

Идея переписать представление архива для WordPress пришла потому, что стандартные средства меня не устраивали. В понимании WP, архивом называется обычная лента постов, дефрагментированная по месяцам. Искать по ней довольно неудобно, потому что на одной странице помещается только небольшой фрагмент хронологии и требуется много листать. Да и само использование даты публикации для организации архива может быть полезно разве что автору, который помнит, когда и что писал, но никак не посетителю.

Изначально я написал специальный шаблон страницы, который вместо контента выводил разделенный по категориям список постов. Подумав, добавил внутристраничную навигацию с красивым скроллингом и полное облако тагов в начало страницы. Ну а в итоге оформил код в виде плагина.

Кстати, плагин для WordPress писал в первый раз, используя в качестве примера похожий по функциональности WP Simple Sitemap (тоже генерирует список постов, но более простой, хотя и с разбиением на страницы).

Учитывая тематическую ориентацию блога, приведу сначала фрагмент кода, генерирующий список с «якорями» и датами:

$cats = get_categories();
$uncategorized = array_shift($cats);
array_push($cats, $uncategorized);

$contents = array();
$catList = array();

foreach($cats as $cat) { 
    $posts = get_posts('numberposts=0&orderby=post_date&'.
        'order =ASC&category='.$cat->cat_ID);
    $postList = array();
    foreach($posts as $post) {
        $postList[] = date('(Y/m/d) ', strtotime($post->post_date)).
            '<a href="'.$post->guid.'">'.$post->post_title.'</a>';
    }
    
    $catId = 'cat_'.($cat->cat_ID);
    $cnt = ' ('.$cat->count.')';
    $contents[] = '<a href="#'.$catId.'">'.$cat->name.'</a>'.$cnt;
    $catList[] = '<h3><a href="" id="'.$catId.'"></a>'.
        $cat->name.$cnt.' <a href="#postlist_top">↑</a></h3>'.
        '<ul><li>'.implode('</li><li>', $postList).'</li></ul>';
}

echo '<p><a href="" id="postlist_top"></a>'.
    implode(', ', $contents).'</p>'.implode("\n", $catList);

В программе используются функции WP API get_categories() и get_posts(), извлекающие из базы списки категрий и постов соответственно. Далее на их основе генерируется HTML.

Вывод облака тегов выполняется вообще в три строчки:

$settings = get_option('wp_postlist_array');
$tags = wp_tag_cloud('number=0&format=array'); // WP 2.5+
echo '<p class="pl_cloud">'.implode(' ', $tags).'</p>';

Функция wp_tag_cloud() выдает список линкованных тагов для облака. До версии 2.5, она сразу выводила свой результат в stdout, что на мой взгляд неправильный подход (то же относится ко многим другим функциям WP). Но с недавних пор появилось новое значение параметра format — array, благодаря которому результат может быть возвращен обычным образом.

Непосредственная вставка кода в нужный шаблон страницы может привести к неудобствам при модификации темы или переносе блога. Поэтому я и сделал в итоге плагин.

Этот плагин ищет в тексте страниц два предопределенных ключевых слова и вставляет на их место список постов и облако тагов соответственно. Благодаря такому подходу обеспечивается полная независимость от темы и гибкость в отношении оформления. Сгенерированный плагином список может получиться довольно длинным, поэтому я бы рекомендовал размещать его на специально-предназначенной странице, не заполненной другим контентом.

Пример использования: http://paradigm.ru/archive. Страница плагина: http://paradigm.ru/wp-postlist. Архив для скачивания: http://things.paradigm.ru/wp-postlist.zip.