Страница со списком тегов (или рубрик) Wordpress
Если перейти в блоге Wordpress по ссылке на любой тег, то попадем на страничку, содержащую анонсы постов по данному тегу, адрес странички будет примерно такой:http://tolik-punkoff.com/tag/manual
Где manuals
- собственно, выбранный тег, а tag
- префикс для URL-адреса меток, который можно настроить в консоли Wordpress в разделе Настройки - Постоянные ссылки.
Идея такого формата адреса достаточно очевидна, убираешь из строки адреса выбранный тег и попадаешь в список всех тегов, как например это сделано в ЖЖ или LJR
Вообще-то в профессиональной теме Wordpress это дело должно бы работать из коробки, потому что вообще-то плохо, если раздел сайта, который логически существовать должен, не существует. И так думаю не я один, а как выяснилось из логов, и роботы. Правда это оказался робот какого-то мелкого поисковика, не Google или Яндекса, но все равно неприятно.
Так вот, если тема не сильно профессиональная, или разработчик забыл о такой мелочи, то посетитель сайта попадет по такой ссылке на страницу 404.
Исправляем досадную неприятность.
Первая и самая простая операция, создадим новую страницу с заголовком, например, "Список тегов" стандартным образом, в консоли Страницы - Добавить новую и перед публикацией изменим ей постоянную ссылку на тот префикс для URL меток, который задан через Настройки - Постоянные ссылки.
Сохраняем страницу, теперь, убрав из адреса
http://tolik-punkoff.com/tag/manual s/
наименование тега, и перейдя по ссылке http://tolik-punkoff.com/tag/
мы попадем на только что созданную пустую страницу.На скриншоте заготовка для списка рубрик, но принцип тот же
Вообще существует минимум три способа выполнять PHP-код на странице Wordpress, первый, самый простой, но при этом самый небезопасный, это поставить плагин, добавляющий такую возможность. Небезопасно это по двум причинам, во-первых, плагин может оказаться уязвимым, вот пример, а во-вторых, пользователь, имеющий права на добавление или редактирование статей может вставить любой PHP-код в страницу. Если авторов или администраторов сайта несколько, то это может быть весьма критичным. Конечно, в хорошем плагине нет уязвимостей и можно настроить права пользователей, но хорошие плагины минимум стоят хороших денег.
Второй способ, обойтись без плагина, добавить специальный обработчик в файл темы
functions.php
, как описано, например, здесь. От первой проблемы это может и избавит, а от второй придется мастерить костыли.Вряд ли в реальной практике встречаются случаи, где произвольный PHP-код надо выполнять на страницах сайта, так что вполне подойдет третий вариант - разрешить выполнять PHP-код на одной определенной странице. Как это сделать, описано здесь, и, надо сказать, сначала этим способом я и воспользовался, нашел в файлах темы
page.php
, попутно выяснил, что в моей теме его не надо редактировать, а редактировать следует другой файл, на который тот ссылался. В нем уже нашел вывод контента функцией the_content();
, после него вставил необходимое условие, и, если оно срабатывало, выводил список тегов встроенной функцией wp_tag_cloud
как-то вот так:<?php the_content();
if (is_page('tag'))
{
wp_tag_cloud('smallest=8&largest=22&number=0&format=list');
}
?>
Пока не подумал, что этот способ тоже не совсем хороший, при обновлении или смене темы придется, как в известном анекдоте, "выливать воду из чайника".
И тут я хлопнул себя копытом по лбу! А ведь действительно, у нас же есть плагины и шорткоды! Но нафиг пользоваться чужим плагином, который добавит нам шорткод, исполняющий любой код PHP, если можно написать свой плагин, который добавит шорткод, исполняющий что нужно! Тем более, что я так уже делал для вставки ссылок на блоги пользователей ЖЖ и ЛЖР, создавая кат для Wordpress в стиле ЖЖ и выводя опросы из LJR в блог на Wordpress. И что мне тут в голову стукнуло какие-то совсем уж огороды городить, сам не пойму.
Заодно пришла мысль наконец-то сделать плагин-библиотеку для различных мелких функций, не требующих сложного кода и дополнительных файлов, как плагины по отображению опросов или выводу ссылок на блоги пользователей, или для которых "не царское дело" создавать отдельный плагин, как для кода ката в стиле ЖЖ.
Создаем "болванку" плагина:
<?php
/**
* Plugin Name: Shortcodes personal library
* Description: Personal Library for site tolik-punkoff.com
* Version: 0.0.1b
* Author: Tolik Punkoff
* Author URI: http://tolik-punkoff.com/
* License: any
**/
//Тут будет код
?>
И "болванку" функции обработчика шорткода:
function taglist_shortcode($atts)
{
extract(shortcode_atts(array(
'type' => '',
), $atts));
$ret="";
//Тут будет код получения
//списка тегов и категорий
return $ret;
}
В принципе, создание простого шорткода описано, например, тут [Копия], так что тут подробно останавливаться не буду, замечу лишь, что не определил в функции обработчика переменную
$content
, по той простой причине, что шорткод планируется простой, без закрывающего тега, и обработка контента им просто не планируется.В переменной
$type
будет храниться одно значение - 'topic'
, указывающее функции, что выводить нужно список категорий блога, любое другое значение указывает на вывод списка тегов.Осуществляется оно с помощью функции Wordpress
wp_tag_cloud($args);
где $args
массив параметров. С подробной справкой о параметрах можно ознакомиться здесь [1] я ниже лишь акцентирую внимание на тех параметрах, которые понадобились мне.Вот код:
if ($type=='topic')
{
$args=array (
'smallest' => '15',
'largest' => '22',
'number' => '0',
'format' => 'list',
'echo' => '0',
'taxonomy' => array('category'),
);
$ret=wp_tag_cloud($args);
}
else
{
$args=array (
'smallest' => '8',
'largest' => '22',
'number' => '0',
'format' => 'list',
'echo' => '0',
'taxonomy' => array('post_tag'),
);
$ret=wp_tag_cloud($args);
}
В зависимости от того, что будем выводить, формируем массив аргументов:
'smallest'
- размер шрифта, для тегов или категорий с наименьшим количеством постов.'largest'
- размер шрифта, для тегов или категорий с наибольшим количеством постов. Размер шрифта для того, что где-то рядом, Wordpress подберет сам.'number'
- Сколько тегов выводить, по умолчанию 45, если поставить 0, то все.'format'
- формат вывода списка 'list'
- список с "пулями", стиль которого определяется CSS темы, у меня в теме он весьма симпатичный, его и оставил. Еще можно установить 'array'
, тогда список будет возвращен в виде массива, и с ним можно будет еще поработать, раскрасив, например, в разные цвета, и 'flat'
- простой список с разделителем. Разделитель можно задать, по умолчанию это перевод строки.'echo'
- куда выводить список. 0 - в переменную, 1 - сразу на вывод. Поскольку выводом результатов работы шорткода занимается Wordpress, лучше установить 0. Как минимум, это несколько ускорит формирование страницы, ну плюс от греха подальше, чтоб не выползло чего лишнего в неожиданном месте.'taxonomy'
- массив таксономий. Можно совместить, таким образом, несколько разных, подробнее см. [1]. Мне экспериментировать было особо не с чем, так что я просто выбрал стандартные 'category'
для рубрик и 'post_tag'
для тегов.Остается лишь зарегистрировать новый шорткод:
add_shortcode ('taglist','taglist_shortcode');
Для вывода списка тегов:
[[taglist]]
Для вывода списка категорий:
[[taglist type='topic']]
Список тегов
Список категорий
Код на PasteBin
1. wp_tag_cloud() [Копия]
Скачать заметку в формате PDF
Это репост заметки из моего блога на сайте http://tolik-punkoff.com
Оригинал заметки находится здесь: http://tolik-punkoff.com/2017/01/20/tagl