С помощью плагина tru_tags создается облако тегов в системе управления сайтом Textpattern. Облако тегов - модная такая штука, которую можно встретить на многих сайтах. Иногда облако тегов удобно и гармонично вливается в дизайн сайта, иногда не очень. По мнению экспертов в продвижении сайтов, облако тегов дает какие-то ощутимые результаты в продвижении сайта. Посему я использую этот плагин и советую своим клиентам.
Есть еще один плагин, который специалисты по продвижению рекомендуют к использованию. Это плагин ob1_pagination, плагин, который улучшает навигацию по сайту. Точнее, он делает навигацию по статьям как у гугла, в нижней части страницы (как правило) появляются номера страниц, по которым можно переходить.
Когда на сайте, построенном на TEXTPATTERN, появляется много страниц с ключевыми словами то просмотр страниц по ключевым словам не очень удобен. Неудобен он, потому как не разбит на порции. А у плагина tru_tags по умолчанию стоит лимит, равный тысяче. Тысяча заголовков на одной странице не сильно-то удобно для просмотра, даже если выводится только заголовок статьи в одну строку. Конечно, можно уменьшить размер лимита у плагина tru_tags, но это полумера, так как не будут видны более поздние страницы. А вот когда подключаешь плагин ob1_pagination к оформлению секции, которая отвечает за вывод страниц по тегам, этот самый плагин ob1_pagination не работает. И я решил разобраться и попробовать исправить. Благо коды все доступны.
Система Textpattern написана на PHP, и соответственно плагины для нее пишутся тоже на языке программирования PHP. И хотя много ругают язык программирования PHP за постоянные ошибки в нем, все-таки PHP один из самых распространенных языков для написания разного рода сайтов и систем управления сайтами. Связано это в первую очередь с простотой изучения этого языка программирования. Возможно, это и не так, но, читая различные форумы, я пришел к такому выводу. Итак, я решил взяться за более детальное изучения PHP и потренироваться с пользой для дела.
Что бы решить проблему работы плагинов ob1_pagination и tru_tags в связке, я подправил код плагина tru_tags. В этом плагине есть функция function tru_tags_handler($atts), которая отвечает за вывод списка статей. Вот её код в первоначальном виде:
function tru_tags_handler($atts) {
$tag_parameter = tru_tags_tag_parameter(array(), false);
if (!empty($tag_parameter)) {
if (tru_tags_redirect_if_needed($tag_parameter)) {
return '';
}
$clean_atts = tru_tags_fixup_query_atts($atts, $tag_parameter);
$result = doArticles($clean_atts, true); #function in TXP code
if (trim($result) == '') {
if (isset($atts['noarticles'])) {
tru_tags_redirect($atts['noarticles'], true);
} else if (isset($atts['404redirect']) && !$atts['404redirect']) {
return $result;
} else {
txp_die(gTxt('404_not_found'), '404');
}
} else {
return $result;
}
} else {
return tru_tags_cloud($atts);
}
}
В этой функции все просто, и из кода видно, что за формирование списка статей, который необходимо вывести, отвечает функция doArticles из самой системы Textpattern. Просмотрел код функции в textpattern/publish.php. И решил посмотреть код плагина ob1_pagination и найти зависимости от функции doArticles. В плагине ob1_pagination номера страниц выводятся при условии, если страниц больше, чем одна.if($numberOfTabs>1) или, по другому, статей больше, чем лимит вывода на одну страницу. Немного выше видно, как формируется $numberOfTabs ($numberOfTabs = (empty($thispage)) ? 1: $numPages;). Ну а если $numberOfTabs меньше или равен единице, ничего не выводится. В случае, когда выводится список статей по тегам с помощью плагина tru_tags, $numberOfTabs всегда равен 1. Немного поэкспериментировав, я выяснил, что срабатывает правило empty($thispage). Что значит переменная $thispage не установлена. А устанавливается эта переменная как раз в функции doArticles.
Функцию doArticles менять не стоит, так как это функция самой системы, и при её изменении возможно (а скорей всего точно) поломается сама система Textpattern. Решил тогда попробовать заполнить переменную $thispage самостоятельно в плагине tru_tags. В конечном итоге получил следующий код:
function tru_tags_handler($atts) {
$pg = urldecode(strip_tags(gps('pg')));
$pg = (!empty($pg)) ? $pg : 1;
$tag_parameter = tru_tags_tag_parameter(array(), false);
if (!empty($tag_parameter)) {
if (tru_tags_redirect_if_needed($tag_parameter)) {
return '';
}
$clean_atts = tru_tags_fixup_query_atts($atts, $tag_parameter);
$pageby = (empty($clean_atts['pageby']) ? $clean_atts['limit'] : $clean_atts['pageby']);
$offset = ($pg - 1) * $pageby;
$clean_atts['pageby'] = $pageby;
$clean_atts['offset'] = $offset;
if ($clean_atts['keywords']) {
$keys = doSlash(do_list($clean_atts['keywords']));
foreach ($keys as $key) {
$keyparts[] = "FIND_IN_SET('".$key."',Keywords)";
}
$keywords = " and (" . join(' or ',$keyparts) . ")";
}
else {$keywords = "";}
$where = "1=1" . $keywords;
$grand_total = safe_count('textpattern',$where);
$total = $grand_total - $offset;
$numPages = ceil($grand_total/$pageby);
$pageout['pg'] = $pg;
$pageout['numPages'] = $numPages;
$pageout['s'] = 'tag';
$pageout['c'] = '';
$pageout['grand_total'] = $grand_total;
$pageout['total'] = $total;
global $thispage;
if (empty($thispage)) $thispage = $pageout;
$result = doArticles($clean_atts, true); #function in TXP code
if (trim($result) == '') {
if (isset($atts['noarticles'])) {
tru_tags_redirect($atts['noarticles'], true);
} else if (isset($atts['404redirect']) && !$atts['404redirect']) {
return $result;
} else {
txp_die(gTxt('404_not_found'), '404');
}
} else {
return $result;
}
} else {
return tru_tags_cloud($atts);
}
}
Красным выделен добавленный мною код. И связка плагинов ob1_pagination и tru_tags заработала. В продолжении я подробно расскажу, что я добавил и зачем.