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.

Комментарии к заметке «Удобный архив постов для WordPress»

# grossu: (30 апреля, 2008 @ 12:49)

Это, конечно, ближе к умному и правильному архиву, но все равно — смущает монструозное облако тегов. Вроде можно выбрать наиболе популярные? И то же самое про статьи по категориям. Правильно, но, мне кажется, там тоже можно использовать поледние десять постов. Во-всяком случае пост — в закладки. Все думал над правильным архивом.

# admin: (30 апреля, 2008 @ 14:03)

grossu: Облако и количество статей действительно можно ограничивать аргументами wp_tag_cloud() и get_posts(). М.б. я вынесу эти параметры в панель управления, хотя меня пока ничего не смущает (: Для сравнения, в делишезе у меня тагов поболее раза в три.

# Экономист: (1 мая, 2008 @ 02:26)

да действительно удобный архив!

# Проблемка: (2 мая, 2008 @ 13:10)

А почему подгружать полный список архива динамически через ajax, ведь с точки зрения индексации было бы правильнее занести лишнее в невидимый слой, а по мере необходимости его просто показывать?

# Виктор: (26 мая, 2008 @ 15:28)

Полезные скрипты, надо взять на вооружение. Спасибо!

Написать комментарий

Можно использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> .