Страница со списком тегов (или рубрик) WordPress

Если перейти в блоге 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-код на странице 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*