Если перейти в блоге WordPress по ссылке на любой тег, то попадем на страничку, содержащую анонсы постов по данному тегу, адрес странички будет примерно такой:
http://tolik-punkoff.com/tag/manuals/
Где manuals
— собственно, выбранный тег, а tag
— префикс для URL-адреса меток, который можно настроить в консоли WordPress в разделе Настройки — Постоянные ссылки.
Идея такого формата адреса достаточно очевидна, убираешь из строки адреса выбранный тег и попадаешь в список всех тегов, как например это сделано в ЖЖ или LJR
Вообще-то в профессиональной теме WordPress это дело должно бы работать из коробки, потому что вообще-то плохо, если раздел сайта, который логически существовать должен, не существует. И так думаю не я один, а как выяснилось из логов, и роботы. Правда это оказался робот какого-то мелкого поисковика, не Google или Яндекса, но все равно неприятно.
Так вот, если тема не сильно профессиональная, или разработчик забыл о такой мелочи, то посетитель сайта попадет по такой ссылке на страницу 404.
Исправляем досадную неприятность.
Первая и самая простая операция, создадим новую страницу с заголовком, например, «Список тегов» стандартным образом, в консоли Страницы — Добавить новую и перед публикацией изменим ей постоянную ссылку на тот префикс для URL меток, который задан через Настройки — Постоянные ссылки.
Сохраняем страницу, теперь, убрав из адреса http://tolik-punkoff.com/tag/manuals/
наименование тега, и перейдя по ссылке 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']]
Список тегов
Список категорий
1. wp_tag_cloud() [Копия]
5 Responses to Страница со списком тегов (или рубрик) WordPress