|
Решил развить тему предыдущего поста, раз уж она вызвала интерес.
Идея переписать представление архива для 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.
|