|
30 апреля 2008
|
Решил развить тему предыдущего поста, раз уж она вызвала интерес.
Идея переписать представление архива для 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.
|
|
17 апреля 2008
|
Последние изменения в конфигурации WordPress на этом сайте были связаны с устранением необходимости в некоторых второстепенных плагинах. В первую очередь это относилось к различным расширениям функциональности темы. Например, ради того, чтобы заменить URL стандартных RSS-фидов на линки Фидбёрнера или вставить в страницы код Google Analytics, вовсе не обязательно ставить специальный плагин.
Конечно, управление через административную панель более удобно, чем правка кода вручную, но каждый такой плагин увеличивает объем исполняемого PHP кода при любом обращении к сайту. Поэтому было принято стратегическое решение — если плагин можно не ставить, обойдясь функциональностью стандартного API WordPress, такой плагин лучше не ставить.
Последним из устраненных плагинов был Easy Gravatar, добавляющий к комментариям аватары с одноименного сервиса. В этой заметке расскажу, в двух словах, как добавить в тему для WordPress 2.5 такие аватары самостоятельно.
/2008/04/comments.png)
Я не случайно упомянул номер версии. До выхода последнего на сегодняшний день релиза, стандартных функций для работы с Gravatar не было. А само их появление совсем не удивительно, учитывая, что WordPress и Gravatar принадлежат одному и тому же Automattic.
Принцип действия Gravatar очень прост. Для того, чтобы получить с их сервера юзерпик комментатора, необходимо разместить в коде страницы обычный элемент <img>, указав в нем стандартный URL с набором GET-параметров. В общем виде URL граватара выглядит так:
http://www.gravatar.com/avatar.php?gravatar_id=...&rating=R
&size=40&default=...&border=FF0000
Значение параметров:
gravatar_id — единственный параметр, являющийся обязательным. Это идентификатор пользователя в базе данных Gravatar, основанный на адресе электронной почты. Учитывая, что при комментировании, указание email как правило является обязательным, адрес становится доступным в ходе генерирования страницы. А для того, чтобы его не светить в открытом доступе, в списке параметров указывается не сам email, а его MD5-хэш.
rating — ESRB-рейтинг, дань политкорректности. Значение этого параметра определит «рамки приличия» для аватаров, которые можно демонстрировать на страницах вашего сайта (возможные варианты — G/PG/R/X; регистр не имеет значения).
Скажем, если указать G, никто из комментаторов теоретически не сможет раскрыть таким странным образом тему сисек использовать юзерпики нецензурного содержания. Но в полной мере полагаться на этот параметр не стоит, т.к. никакой модерации, на сколько мне известно, на Gravatar нет и пользователи сами выставляют своим аватарам рейтинг.
border — если этому параметру задать цветовой код в формате RGB (без решетки), аватары будут обрамлены однопиксельной рамкой соответствующего цвета. Неплохо, что эта возможность присутствует, но она опять же не особенно полезна, т.к. примерно того же эффекта можно добиться с помощью CSS.
size — а вот это уже более нужный параметр, хотя тоже необязательный для указания в URL. Он определяет размер стороны юзерпика в пикселях (картинки всегда квадратные, поэтому достаточно одной величины). Возможные значение — от 1 (что забавно), до 80. Если размер не указать вообще, он останется оригинальным. Т.е. тем, в котором пользователь загрузил свой аватар на сервер. В противном случае, юзерпик будет масштабирован.
Кстати, для масштабирования графики Gravatar использует биквадратичный алгоритм, благодаря чему уменьшенные копии выглядят достаточно «гладко».
default — полный URL картинки, которая будет отображена вместо аватара, если пользователь отсутствует или рейтинг его аватара превышает указанное значение. Если параметр не задать, будет использован стандартный вариант с логотипом Gravatar.
Для упрощения взаимодействия с сервисом, в API WordPress появилась функция get_avatar(), преобразующая набор своих параметров в сформированный элемент <img>.
Параметры следующие:
id_or_email — идентификатор пользователя в базе WP, либо его email. Так же годится итерируемый объект из цикла, выводящего на страницу комментарии, что весьма удобно, хотя, вероятно, немного менее эффективно прямого указания email.
size — размер аватара.
default — полный URL аватара, используемого по-умолчанию.
В официальной документации на Кодексе рекомендуют использовать такую конструкцию для обеспечения обратной совместимости:
if (function_exists('get_avatar')) {
echo get_avatar($email);
} else {
//alternate gravatar code for < 2.5
$grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=
".md5($email)."&default=".urlencode($default).
"&size=".$size;
echo "<img src='$grav_url'/>";
}
На мой взгляд, это оправдано только при создании темы для общего использования. Когда есть вероятность применения на старых версиях WP. Если же даунгрейда с 2.5 не предполагается, вполне можно ограничиться прямым вызовом get_avatar(). Чем меньше исполняемого PHP кода — тем лучше.
Ссылки по теме
|