<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SimpleCoding.org &#187; WordPress</title>
	<atom:link href="http://www.simplecoding.org/category/wp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.simplecoding.org</link>
	<description>Блог о программировании</description>
	<lastBuildDate>Fri, 27 Jan 2012 18:27:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>WordPress: простой способ отлючить трекбеки для части постов (без плагинов)</title>
		<link>http://www.simplecoding.org/wordpress-prostoj-sposob-otlyuchit-trekbeki-dlya-chasti-postov-bez-plaginov.html</link>
		<comments>http://www.simplecoding.org/wordpress-prostoj-sposob-otlyuchit-trekbeki-dlya-chasti-postov-bez-plaginov.html#comments</comments>
		<pubDate>Sat, 21 Jan 2012 14:46:53 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1259</guid>
		<description><![CDATA[С недавних пор этот блог опять стали одолевать спамеры. Не знаю с чем это связано, больше года всё было относительно спокойно. Проскакивало по несколько спамерских комментариев в неделю, явно написанных людьми, а не ботами, и всё. А тут по 10-20 требкеков в день. Удалить их, конечно, не сложно, но надоедает и раздражает, к тому же [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1260" class="wp-caption alignnone" style="width: 275px"><img src="http://www.simplecoding.org/wp-content/uploads/2012/01/wordpress_block_trackback.png" alt="wordpress block trackback" title="wordpress block trackback" width="265" height="229" class="size-full wp-image-1260" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>С недавних пор этот блог опять стали одолевать спамеры. Не знаю с чем это связано, больше года всё было относительно спокойно. Проскакивало по несколько спамерских комментариев в неделю, явно написанных людьми, а не ботами, и всё. А тут по 10-20 требкеков в день. Удалить их, конечно, не сложно, но надоедает и раздражает, к тому же трекбеки явно ставились автоматически, т.е. спамер своё время на них не тратил.</p>
<p>Вообще я не сторонник отключения каких-либо каналов общения. В теории трекбеки сильно упрощают создание связей между блогами. Но на практике получается, что нормальные требкеки приходят к более-менее новым постам, а спамерские – обычно ко всем подряд.</p>
<p>Поэтому я решил закрыть трекбеки для всех постов старше 2-х месяцев. Ставить специальный плагин для решения этой задачи нет никакой необходимости, всё можно сделать с помощью несложного <strong>SQL запроса и cron&#039;а</strong>.<br />
<span id="more-1259"></span></p>
<h2>Теория</h2>
<p>В WordPress все посты хранятся в таблице <code>wp_posts</code> (префикс <code>wp_</code> может быть другим). В этой таблице есть поле <code>ping_status</code>, которому можно присвоить одно из двух значений: «open» или «closed». Как несложно догадаться по названию, значение «closed» отключает трекбеки к данном посту.</p>
<p>Теперь нужно определиться с датами. MySQL поддерживает довольно много <a href="http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html">функций для работы со временем и датами</a>. Нам потребуются:<br />
1) <code>CURDATE</code> – возвращает текущую дату;<br />
2) <code>DATE_SUB</code> – вычитает даты;<br />
и выражение <code>INTERVAL ... DAY</code> – позволяет указать интервал с заданным количеством дней.</p>
<p>Дата последнего изменения поста хранится в поле <code>post_modified</code> (таблицы <code>wp_posts</code>).</p>
<h2>Формируем запрос</h2>
<pre class="brush: sql; gutter: true; first-line: 1; highlight: []; html-script: false">UPDATE wp_posts SET ping_status=&quot;closed&quot; WHERE post_modified &lt; DATE_SUB(CURDATE(), INTERVAL 60 DAY)</pre>
<p>Как видите, это обычный UPDATE запрос, который установит полю <code>ping_status</code> значение «closed» для всех записей у которые последний раз обновлялись более 60-ти дней назад.</p>
<p>Кстати, аналогичным способом можно закрыть и комментарии. Для этого нужно установить значение «closed» для поля «comment_status».</p>
<h2>Остаётся настроить периодический запуск этого запроса</h2>
<p>Удобнее всего для этого использовать cron. Тут потребуются хотя бы базовые навыки работы с панелью управления хостингом. В большинстве панелей в меню находится ссылка на страницу cron, а для создания задачи нужно заполнить небольшую форму. При этом необходимо указать два обязательных параметра – команду, которую будет выполнять cron, и периодичность её выполнения.</p>
<p>В данном случае команда может выглядеть следующим образом.</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">mysql --default-character-set=utf8 --user=user_name --password=user_password db_name &lt; path_to/block_trackbacks.sql</pre>
<p>Здесь <code>block_trackbacks.sql</code> – имя файла в котором записан наш запрос.</p>
<p>Периодичность выполнения можно указать – 1 раз в день. Принципиальной роли, в данном случае, она не играет.</p>
<h2>Результаты</h2>
<p>Как и следовало ожидать, работает данный метод очень неплохо. Количество спама в трекбеках снизилось практически до нуля <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  И, обратите внимание, данный способ подходит для любой CMS, главное, найти какое поле отвечает за отключение трекбеков.</p>
<p><strong>Успехов!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-prostoj-sposob-otlyuchit-trekbeki-dlya-chasti-postov-bez-plaginov.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Плагин для WordPress &#8211; Terms Descriptions (версия 1.2.0)</title>
		<link>http://www.simplecoding.org/plagin-dlya-wordpress-terms-descriptions-versiya-1-2-0.html</link>
		<comments>http://www.simplecoding.org/plagin-dlya-wordpress-terms-descriptions-versiya-1-2-0.html#comments</comments>
		<pubDate>Thu, 03 Nov 2011 19:55:24 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Разное]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1233</guid>
		<description><![CDATA[Приветствую всех! На днях доделал очередную версию моего плагина для WordPress &#8211; Terms Descriptions. Скачать вы её можете на отсюда. Либо, если вы уже используете этот плагин, через систему обновлений WP. После выхода предыдущего релиза прошло довольно много времени и накопилось большое количество замечаний и предложений по его доработке. Сразу хочу сказать большое спасибо всем, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Приветствую всех!</strong></p>
<p>На днях доделал очередную версию моего плагина для <strong>WordPress</strong> &#8211; <strong>Terms Descriptions</strong>. Скачать вы её можете на <a href="http://wordpress.org/extend/plugins/terms-descriptions/">отсюда</a>. Либо, если вы уже используете этот плагин, через систему обновлений WP.</p>
<p><a href="http://wordpress.org/extend/plugins/terms-descriptions/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>После выхода предыдущего релиза прошло довольно много времени и накопилось большое количество замечаний и предложений по его доработке. Сразу хочу сказать большое спасибо всем, кто помогал советами и идеями, присылал подробные отчеты об ошибках. Эта информация очень пригодилась!</p>
<p>В этой версии, конечно, реализованы не все пожелания и она не идеальна, но, надеюсь, что работать с ней будет удобнее, чем с предыдущими <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><em>Примечание</em>. Посмотреть описание предыдущих версий плагина можно в статье: <a href="http://www.simplecoding.org/plagin-wordpress-terms-descriptions">Плагин WordPress: Terms Descriptions</a>.</p>
<p>Рассмотрим по порядку все основные изменения.<br />
<span id="more-1233"></span></p>
<h2>Интерфейс</h2>
<p>Переделан практически полностью. Надеюсь, будет удобнее <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>В предыдущих версиях плагин создавал всего одну страницу в админке WP. На которой были расположены форма создания новых терминов, таблица с терминами и форма с настройками. Для первых версий плагина этого было достаточно. Но добавлять новые формы было сложно, т.к. страница получалась очень загроможденной.</p>
<p>Сейчас плагин создаёт три административных страницы, которые находятся в меню «Термины».</p>
<p>На первой странице (рис.1) размещена форма добавления новых терминов и таблица с уже существующими терминами.</p>
<p><a href="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_1.png"><img src="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_1-450x255.png" alt="terms_descriptions_1" title="terms_descriptions_1" width="450" height="255" class="size-medium wp-image-1235" /></a></p>
<p>Рис.1.</p>
<p>Принцип создания термина остался тем же, но форма изменилась. Во-первых, сейчас добавлена нормальная поддержка произвольных типов записей WP (custom post types). Во-вторых, для выбора записи (поста) используется поле с автокомплитом, а не выпадающий список с заголовками постов (рис. 2). Как оказалось, выпадающий список практически бесполезен, если блог содержит несколько сотен записей.</p>
<p><a href="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_2.png"><img src="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_2-450x90.png" alt="" title="terms_descriptions_2" width="450" height="90" class="alignnone size-medium wp-image-1236" /></a></p>
<p>Рис. 2.</p>
<p>Также добавлена пагинация (листалка) для таблицы с терминами и возможность обновления постоянных ссылок (об этом чуть ниже).</p>
<p>На второй странице находится форма со всеми основными настройками блога (рис. 3).</p>
<p><a href="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_3.png"><img src="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_3-450x235.png" alt="" title="terms_descriptions_3" width="450" height="235" class="alignnone size-medium wp-image-1237" /></a></p>
<p>Рис. 3.</p>
<p>На третьей странице (рис. 4) – инструменты для экспорта/импорта данных плагина и для пакетной загрузки терминов.</p>
<p><a href="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_4.png"><img src="http://www.simplecoding.org/wp-content/uploads/2011/11/terms_descriptions_4-450x335.png" alt="" title="terms_descriptions_4" width="450" height="335" class="alignnone size-medium wp-image-1238" /></a></p>
<p>Рис. 4.</p>
<h2>Хранение терминов</h2>
<p>Способ хранения и работы с терминами также был существенно переработан. Поэтому после обновления плагина в админке появится сообщение с кнопкой «Обновить БД». Я настоятельно рекомендую <strong>сделать резервную копию базы</strong> перед выполнением этой операции.</p>
<p>Причин для внесения этих изменений было две.</p>
<p>1) Оказалось, что часть пользователей создаёт большие списки терминов. И для работы с ними целесообразно создать отдельную таблицу.</p>
<p>2) Функция <code>get_permalink</code>, которая используется в WP для формирования ЧПУ, при определённых структурах ссылок оказывается довольно ресурсоемкой. Чтобы исключить её использование при формировании страниц блога, формирование ссылки теперь осуществляется один раз при создании термина. А для того, чтобы плагин правильно работал после изменения структуры URL, добавлена возможность пакетного обновления ссылок из админки. Кнопка «Обновить ссылки» находится справа над таблицей терминов (рис. 1). Т.е. если меняете структуру ЧПУ не забудьте обновить ссылки терминов.</p>
<h2>Парсеры</h2>
<p>Одними из самых неприятных проблем, с которыми я столкнулся при поддержке плагина, были конфликты с другими плагинами.</p>
<p>На сегодняшний день, существует множество плагинов и тем, которые изменяют содержимое постов. Предугадать все последствия таких изменений практически не реально. И хоть я и старался свести такие проблемы к минимуму, избежать их не получилось. Чем сложнее становился анализ текста, тем больше проблем возникало.</p>
<p>Например, количество багрепортов увеличилось в несколько раз после того как я добавил поддержку кавычек.</p>
<p>Повторения этой ситуации с новой версией я не хотел, поэтому принял решение добавить поддержку нескольких алгоритмов установки ссылок для терминов.</p>
<p>Сейчас в дистрибутиве плагина есть два парсера.</p>
<p><strong>1) Простой</strong>. Ставит ссылку на текст, который полностью совпадает с одним из терминов.</p>
<p><strong>2) Простой с поддержкой кавычек</strong>. Работает также как и простой, но дополнительно проверяет символы вокруг найденного термина, и, если они являются кавычками, преобразует термин в ссылку.</p>
<p>Переключение между парсерами осуществляется на странице Термины-&gt;Настройки (рис. 3).</p>
<h2>Пакетная загрузка терминов</h2>
<p>Позволяет загрузить сразу несколько терминов. Удобно, если у вас есть список терминов, сформированный с помощью какой-нибудь программы.</p>
<p>Форма пакетной загрузки находится на странице Термины -&gt; Инструменты.</p>
<p>Формат добавления терминов следующий. Каждый термин должен быть записан в отдельной строке. Можно указать несколько словоформ для терминов. Разделитель словоформ – символ <code>|</code>. Т.е. точно так же, как и при добавлении нового термина. Но есть важное отличие, в качестве последней словоформы нужно указать ссылку. Ссылкой может быть обычный URL (наличие <code>http://</code> обязательно) или <code>id</code> поста (пост нужно создать до добавления терминов).</p>
<p>Например, </p>
<p><code>яблоко|яблоки|яблок|яблочный|http://apples.com<br />
груша|груш|груши|24</code><br />
и т.д.<br />
здесь, 24 – id поста на который нужно поставить ссылку.</p>
<p><em>Хочу предупредить</em>. Добавление терминов занимает некоторое время. И, при попытке загрузить большой список, время выполнения скрипта может превысить лимит, установленный хостером. В таких случаях единственный вариант решения (если не считать вариант переезда на выделенный сервер) – загружать список по частям.</p>
<h2>Заключение</h2>
<p>В общем, надеюсь, новая версия вам понравится и позволит сделать работу более комфортной <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  И, конечно, жду ваших предложений, пожеланий и баг репортов <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Успехов!</strong></p>
<p>Полезные ссылки.</p>
<p><a href="http://cp.inferno.name/cart.php">Закажите VPS</a> Start и выше и получите 30$ + панель ISP в подарок! Отзывы &#8211; <a href="http://zapili.net">zapili.net</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/plagin-dlya-wordpress-terms-descriptions-versiya-1-2-0.html/feed</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>WordPress: публикация постов с помощью XML-RPC с поддержкой таксономий</title>
		<link>http://www.simplecoding.org/wordpress-publikaciya-postov-s-pomoshhyu-xml-rpc-s-podderzhkoj-taksonomij.html</link>
		<comments>http://www.simplecoding.org/wordpress-publikaciya-postov-s-pomoshhyu-xml-rpc-s-podderzhkoj-taksonomij.html#comments</comments>
		<pubDate>Tue, 11 Oct 2011 08:02:30 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1229</guid>
		<description><![CDATA[WordPress на сегодняшний день является одой из самых популярных CMS и последнее время активно развивается. Но, к сожалению, это развитие не всегда получается гармоничным. Одной из возможностей, которая почему-то по возможностям постоянно отстаёт от остальной части движка, является XML-RPC. На сегодняшний день этот протокол является основным средством удалённой публикации постов. И, при этом, он фактически [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1230" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/10/wordpress-xml-rpc-publish.png" alt="wordpress xml-rpc publish" title="wordpress xml-rpc publish" width="300" height="239" class="size-full wp-image-1230" style="float:left" /><p class="wp-caption-text"> </p></div>
<p><strong>WordPress</strong> на сегодняшний день является одой из самых популярных CMS и последнее время активно развивается. Но, к сожалению, это развитие не всегда получается гармоничным.</p>
<p>Одной из возможностей, которая почему-то по возможностям постоянно отстаёт от остальной части движка, является <strong>XML-RPC</strong>. На сегодняшний день этот протокол является основным средством удалённой публикации постов. И, при этом, он фактически бесполезен если вы используете произвольные типы записей (custom post types) и таксономии (custom taxonomies). Ни один XML-RPC метод публикации постов в WP 3.2.1 их не поддерживает.</p>
<p>Конечно, можно надеятся, что в будущих версиях ситуация изменится в лучшую сторону, но ничто не мешает добавить нужные методы прямо сейчас.</p>
<p>Рассмотрим небольшой пример.<br />
<span id="more-1229"></span><br />
Допустим, нам нужно <strong>публиковать посты произвольного типа через XML-RPC и связывать их с таксономиями</strong>. При этом, таксономии могут быть как иерархическими, так и плоскими.</p>
<p><em>Примечание</em>. Подробнее о типах постов и таксономиях рассказано в статьях: <a href="http://www.simplecoding.org/wordpress-vyvod-zapisej-proizvolnyx-tipov-custom-post-types.html">WordPress: вывод записей произвольных типов (Custom Post Types)</a> и <a href="http://www.simplecoding.org/upravlenie-kontentom-v-wordpress-cms-situaciya-na-segodnya-i-blizhajshaya-perspektiva.html">Управление контентом в WordPress CMS: ситуация на сегодня и ближайшая перспектива</a>.</p>
<h2>Немного теории</h2>
<p>В WordPress предусмотрен фильтр (<code>xmlrpc_methods</code>), позволяющий добавлять новые методы во встроенный XML-RPC сервер. Делается это следующим образом:</p>
<pre class="brush: php">add_filter('xmlrpc_methods', 'add_xml_rpc_methods');</pre>
<p>Во втором параметре фильтра указываем имя функции, которая создаст запись в глобальном массиве XML-RPC методов.</p>
<pre class="brush: php">function add_xml_rpc_methods($methods) {
	$methods['my.my_method_name'] = 'my_method_name';
	return $methods;
}

function my_method_name($args) {
//обработка XML-RPC запроса и отправка ответа
}</pre>
<p>Чтобы создать XML-RPC метод нужно добавить новый элемент в массив <code>$methods</code>. Ключ этого элемента является именем метода, а значение – именем функции, которая выполняет обработку XML-RPC запроса и формирует ответ.</p>
<h2>Реализация: XML-RPC клиент</h2>
<p>Начнём с кода, который отправляет XML-RPC запрос. В данном случае будем использовать библиотеку <a href="http://scripts.incutio.com/xmlrpc/">The Incutio XML-RPC Library</a> (она же используется и в WordPress).</p>
<pre class="brush: php">require_once ('IXR_Library.php');

$client = new IXR_Client('http://my_blog.com/xmlrpc.php');
$client-&gt;timeout = 60000;

$requestData[0] = 0; //id блога
$requestData[1] = 'admin'; //имя пользователя
$requestData[2] = 'pass'; //пароль

$post = array();

$post['post_title'] = 'New Post';
$post['post_excerpt'] = 'Short description';
$post['post_content'] = 'This story about ...';
$post['post_status'] = 'draft';
$post['post_type'] = 'my_custom_post_type'; //тип поста
$post['post_date'] = date('Y-m-d H:i:s');
$post['post_modified'] = date('Y-m-d H:i:s');

//формируем массив с терминами таксономий
$terms = array();
$terms['taxonomy_1'][] = (int)$term['term_id_1'];
$terms['taxonomy_1'][] = (int)$term['term_id_2'];
$terms['taxonomy_2'][] = (int)$term['term_id_3'];
$terms['taxonomy_3'][] = (int)$term['term_id_4'];

$post['tax_input'] = $terms;

$requestData[3] = $post;

if (!$client-&gt;query('my.publish_post', $requestData)) {
	echo 'Publish Post error: '.$client-&gt;getErrorMessage();
	return;
}

$publishedPost = $client-&gt;getResponse();</pre>
<p>Прежде всего, создаём объект <code>IXR_Client</code>, конструктору которого передаём адрес скрипт, который выполняет обработку XML-RPC запросов (xmlrpc.php).</p>
<p>Затем формируем массив с данными для публикации поста. В первых трёх элементах указываем: <code>id</code> блога (на данный момент не используется), логин и пароль. В четвертом элементе – массив с данными нового поста.</p>
<p>Чтобы сократить количество кода на стороне XML-RPC сервера, названия полей этого массива должны совпадать с полями массива, который передаётся функции <a href="http://codex.wordpress.org/Function_Reference/wp_insert_post">wp_insert_post</a>. Кстати, большинство ключей элементов этого массива совпадает с именами полей таблицы posts базы данных.</p>
<p>Обратите внимание на параметр</p>
<pre class="brush: php">$post['post_type'] = 'my_custom_post_type'; //тип поста</pre>
<p>В нём указан тип поста, который мы хотим создать. Естественно, этот тип должен быть <a href="http://codex.wordpress.org/Function_Reference/register_post_type">заранее создан</a>.</p>
<p><strong>Отдельно остановимся на таксономиях.</strong></p>
<p>WordPress поддерживает таксономии 2-х типов: иерархические и плоские. Чтобы связать пост с терминами таксономий нужно перечислить их в элементе tax_input массива, который передаётся функции <code>wp_insert_post</code>. Например, так:</p>
<pre class="brush: php">'tax_input' =&gt; array('taxonomy_1' =&gt; array('term', 'term2', 'term3'), 'taxonomy_2' =&gt; array('term1', 'term2'))</pre>
<p>Здесь <code>taxonomy_1</code>, <code>taxonomy_2</code> – имена таксономий, а <code>term</code>, <code>term1</code> и т.д. – имена терминов.</p>
<p>Но здесь есть нюансы. Если публикуется «плоская» таксономия, то можно указать, либо имя термина, либо его <code>id</code>. При этом, <code>id</code> должен иметь тип <code>int</code>, если <code>id</code> сохранён в виде строки, то WordPress просто создаст новый термин. Для иерархических таксономий можно использовать только <code>id</code> термина (при этом нет ограничения на тип значения, оно будет автоматически приведено к типу <code>int</code>).</p>
<p>Т.е. универсальный вариант установки таксономий выглядит так:</p>
<pre class="brush: php">$terms['taxonomy_1'][] = (int)$term['term_id_1'];
$terms['taxonomy_1'][] = (int)$term['term_id_2'];
$terms['taxonomy_2'][] = (int)$term['term_id_3'];
$terms['taxonomy_3'][] = (int)$term['term_id_4'];</pre>
<p>Отправка запроса выполняется с помощью метода query, а прочитать результат можно используя <code>getResponse</code>.</p>
<h2>XML-RPC сервер</h2>
<p>На серверной стороне нужно зарегистрировать новый XML-RPC метод и написать функцию, которая будет обрабатывать запрос, и возвращать результат.</p>
<p><em>Примечание</em>. Следующий код можно добавить в плагин или в файл functions.php темы.</p>
<pre class="brush: php">add_filter('xmlrpc_methods', 'add_xml_rpc_methods' );

function add_xml_rpc_methods($methods) {
	$methods['my.publish_post'] = 'my_publish_post';
	return $methods;
}

function my_publish_post($args) {
	$blog_id = (int) $args[0];
	$username = $args[1];
	$password = $args[2];
	$post_data  = $args[3];

	if ( !get_option( 'enable_xmlrpc' ) ) {
		return new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.  An admin user can enable them at %s'),  admin_url('options-writing.php') ) );
	}

	$user = wp_authenticate($username, $password);

	if (is_wp_error($user)) {
		return new IXR_Error(403, __('Bad login/pass combination.'));
	}

	wp_set_current_user( $user-&gt;ID );

	if ( !current_user_can( 'edit_private_posts' ) ) {
		return new IXR_Error( 401, __( 'Sorry, you cannot edit private posts.' ) );
	}

	if (!is_array($post_data)) {
		return new IXR_Error( 401, __( 'Sorry, no post data not found.' ) );
	}

	$id = wp_insert_post( $post_data );

	if ($id === 0) {
		return new IXR_Error( 401, __( 'Post save error.' ) );
	}

	$post = array();
	$post['id'] = $id;
	$post['permalink'] = get_permalink($id);

	return $post;
}</pre>
<p>Здесь мы регистрируем XML-RPC метод <code>my.publish_post</code> и указываем, что при обращении к нему WordPress должен вызвать функцию <code>my_publish_post</code>.</p>
<p>Большая часть кода в этой функции совпадает с большинством обработчиков стандартных XML-RPC методов WP. Собственно он оттуда и скопирован <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  . Этот код проверяет, разрешен ли XML-RPC для данного блога (строки 14-16, кстати, не забудьте его включить в админке на странице Settings -&gt; Writing), аутентифицирует пользователя и проверяет, достаточно ли у него прав для публикации поста.</p>
<p>Сама публикация выполняется с помощью всего одной функции <code>wp_insert_post</code> (строка 34).</p>
<p>Клиенту возвращаем <code>id</code> созданного поста и постоянную ссылку на него (формируем с помощью функции get_permalink).</p>
<h2>Заключение</h2>
<p>Как видите, принцип достаточно простой. Любую встроенную функцию WP можно вызвать через XML-RPC протокол и использовать все возможности движка при удалённой публикации постов.</p>
<p>Если есть вопросы или замечания, пишите, постараюсь ответить.</p>
<p><strong>Успехов!</strong></p>
<p>Интересные ссылки</p>
<p>Закажите <a href="http://printfotobook.ru">печать фотокниг</a> тремя способами: онлайн, в офисе или вип</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-publikaciya-postov-s-pomoshhyu-xml-rpc-s-podderzhkoj-taksonomij.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>WordPress: вывод записей произвольных типов (Custom Post Types)</title>
		<link>http://www.simplecoding.org/wordpress-vyvod-zapisej-proizvolnyx-tipov-custom-post-types.html</link>
		<comments>http://www.simplecoding.org/wordpress-vyvod-zapisej-proizvolnyx-tipov-custom-post-types.html#comments</comments>
		<pubDate>Sun, 13 Mar 2011 14:56:48 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1192</guid>
		<description><![CDATA[На сегодняшний день движок WordPress довольно интенсивно развивается. Во всяком случае изменения в версиях с 2.8 по 3.1 добавляют WP возможности полноценных CMS. Большинство из этих возможностей должны быть активированы на уровне темы (или плагина), поэтому сразу после установки WP вы работаете с ним как с обычным блоговым движком. Вроде бы все правильно. Если какие-то [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1193" class="wp-caption alignnone" style="width: 295px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/03/wordpress_custom_queries.png" alt="wordpress custom queries" title="wordpress custom queries" width="285" height="221" class="size-full wp-image-1193" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>На сегодняшний день движок <strong>WordPress</strong> довольно интенсивно развивается. Во всяком случае изменения в версиях с 2.8 по 3.1 добавляют WP возможности полноценных CMS. Большинство из этих возможностей должны быть активированы на уровне темы (или плагина), поэтому сразу после установки WP вы работаете с ним как с обычным блоговым движком.</p>
<p>Вроде бы все правильно. Если какие-то возможности вам не нужны, вы их не используете. Но при этом возникает серьёзная проблема с документацией. Дело в том, большинство примеров и в Кодексе, и в других источниках, ориентированы на самый простой случай – дефолтную инсталляцию WP. Как только вы активируете дополнительные возможности ко многим рекомендациям нужно относится очень аккуратно.</p>
<p>Об одном из таких примеров я хочу рассказать в этой статье.<br />
<span id="more-1192"></span><br />
Предположим, вы решили использовать произвольные типы записей (custom post types). Создать их достаточно просто и на эту тему есть масса статей, поэтому подробно останавливаться на этом моменте не будем.</p>
<p>В большинстве случаев достаточно добавить следующий код в файл functions.php вашей темы.</p>
<pre class="brush: php">register_post_type('gadgets',
	array(
		'labels' =&gt; array(
			'name' =&gt; __('Gadgets'),
			'singular_name' =&gt; __('Gadget'),
			//остальные переводы
		),
		'public' =&gt; true,
		'publicly_queryable' =&gt; true,
		'query_var' =&gt; true,
		'taxonomies' =&gt; array('category','post_tag'),
		'supports' =&gt; array('title','editor','author','thumbnail','excerpt','comments'),
		'rewrite' =&gt; array('slug' =&gt; 'gadgets'),
		//другие настройки
	)
);</pre>
<p>После этого вы сможете создавать записи данного типа в админке и WordPress автоматически сформирует страницу с лентой из этих записей. Адрес у этой страницы будет следующим.</p>
<p><code>http://blog.url/gadgets</code></p>
<p>Теперь обратите внимание, что для этого типа записей мы используем такие же категории, как и для типа <code>Post</code> (строка 11).</p>
<p>Очевидно, что на странице категории мы захотим увидеть записи <strong>всех</strong> типов, но WordPress покажет только тип Post.</p>
<p>Происходит это потому что WP при формировании запроса к базе данных явно указывает тип поста. И по-умолчанию этот тип – <code>post</code>.</p>
<p>К сожалению, в подобных случаях не все авторы тем хотят вникать в нюансы работы движка и просто используют функцию <a href="http://codex.wordpress.org/Function_Reference/query_posts">query_posts</a>. Я понимаю, что примеры её использования приведены в статье <a href="http://codex.wordpress.org/The_Loop">The Loop</a>, но там предполагается, что вам нужно создать дополнительный цикл на странице. Т.е., например, вывести основной список записей и ещё какой-нибудь дополнительный список, с фильтрацией по определённым условиям.</p>
<p>В данном случае нужно изменить основной запрос, т.к. мы можем за один раз получить все необходимые данные. И нет никакого смысла выполнять дополнительный запрос к базе.</p>
<p><strong>Решается задача достаточно просто.</strong></p>
<pre class="brush: php">function prefix_pre_get_posts($query) {
     if ($query-&gt;is_category) {
          $query-&gt;set('post_type', 'any');
     }
     return $query;
}

add_action('pre_get_posts', 'prefix_pre_get_posts');</pre>
<p>Здесь мы назначаем собственный обработчик события (action) <code>pre_get_posts</code>. Как следует из названия, это событие возникает непосредственно перед отправкой запроса к БД. В первом параметре обработчик получает объект типа <a href="http://codex.wordpress.org/Function_Reference/WP_Query">WP_Query</a>, который формирует запрос к базе.</p>
<p>Прежде всего, мы проверяем, что в данный момент создаётся страница категории (строка 2). А затем изменяем атрибут <code>post_type</code>. По-умолчанию он равен <code>post</code>. Не забывайте, что обработчик обязательно должен вернуть изменённый (или неизменённый) объект <code>WP_Query</code>.</p>
<p>Вообще, если вы планируете работать с новыми возможностями WP (произвольными типами записей, таксономиями, форматами записей), то научиться работать с <a href="http://codex.wordpress.org/Function_Reference/WP_Query">WP_Query</a> нужно обязательно. <em>Встроенными функциями движка здесь вы не обойдетесь</em>.</p>
<p>В целом, этого и следовало ожидать, чем больше возможностей у движка, тем больше времени придётся потратить на его изучение <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Успехов!</strong></p>
<p><em>Интересно почитать</em></p>
<p>Если самостоятельно учиться тяжело, то <a href="http://it-centre.net">курсы программирования Киев</a> помогут приобрести необходимые знания.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-vyvod-zapisej-proizvolnyx-tipov-custom-post-types.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Управление контентом в WordPress CMS: ситуация на сегодня и ближайшая перспектива</title>
		<link>http://www.simplecoding.org/upravlenie-kontentom-v-wordpress-cms-situaciya-na-segodnya-i-blizhajshaya-perspektiva.html</link>
		<comments>http://www.simplecoding.org/upravlenie-kontentom-v-wordpress-cms-situaciya-na-segodnya-i-blizhajshaya-perspektiva.html#comments</comments>
		<pubDate>Sat, 19 Feb 2011 09:16:38 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1176</guid>
		<description><![CDATA[Приветствую всех! В этот раз поговорим о нынешних и будущих возможностях одного из самых популярных блоговых движков – WordPress. И заодно обсудим, корректно ли вообще называть его «блоговым». Сразу хочу предупредить, что здесь не будет готовых рекомендаций о том «как правильно делать сайты», просто обсуждение основных возможностей движка, позволяющих работать с контентом, их достоинств и [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1177" class="wp-caption alignnone" style="width: 301px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/wp-cms.png" alt="wp cms" title="wp cms" width="291" height="231" class="size-full wp-image-1177" style="float:left" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую всех!</strong> В этот раз поговорим о нынешних и будущих возможностях одного из самых популярных блоговых движков – <strong>WordPress</strong>. И заодно обсудим, корректно ли вообще называть его «блоговым».</p>
<p>Сразу хочу предупредить, что здесь не будет готовых рекомендаций о том «как правильно делать сайты», просто обсуждение основных возможностей движка, позволяющих работать с контентом, их достоинств и недостатков.</p>
<p>И ещё одно замечание. Под «работой с контентом» я имею в виду не работу редактора, который форматирует текст с помощью <em>TinyMCE</em>, а работу web мастера, т.е. группировку записей по определённым признакам, их индивидуальное оформление, создание страниц архивов, навигацию и т.п.</p>
<p>Начнем с возможностей, которые предоставляет последний стабильный релиз WordPress (на данный момент это версия 3.0.5).<br />
<span id="more-1176"></span></p>
<h2>Таксономии (Custom Taxonomies)</h2>
<p>Если верить википедии, <em>таксономия – это учение о принципах и практике классификации и систематизации</em>. В системах управления контентом (CMS), таксономиями называют различные инструменты для группировки информации.</p>
<p>И обычно их используют для группировки записей по каким-нибудь признакам. Если проводить аналогию с русским языком, то таксономии в WP можно считать прилагательными (отвечают на вопрос «какой? какая?»), т.е. они так или иначе характеризуют запись.</p>
<p>По-умолчанию, WordPress предоставляет три таксономии – <em>категории</em>, <em>теги</em> и <em>ссылки</em>. Но, начиная с версии 2.3 появилась возможность создавать собственные таксономии, правда на все 100% она не используется до сих пор (об этом чуть ниже).</p>
<p>Создать новую таксономию можно с помощью функции <code>register_taxonomy</code>. Для её вызова обычно используется событие (action) <code>init</code>.</p>
<p>Например, если вы создаёте группу записей о каких-то товарах и хотите группировать их по цвету, то можно использовать следующий код.</p>
<pre class="brush: php">function color_init() {
	register_taxonomy(
		'color',
		'post',
		array(
			'label' =&gt; __('Color'),
			'labels'=&gt;array(
				'name'=&gt;__('Colors'),
				'singular_name'=&gt;__('Color'),
				...
			),
			'sort' =&gt; true,
			'args' =&gt; array('orderby' =&gt; 'term_order'),
			'public'=&gt;true,
			'show_in_nav_menus'=&gt;true,
			'show_ui'=&gt;true,
			'show_tagcloud'=&gt;true,
			'hierarchical'=&gt;true,
			'rewrite' =&gt; array('slug' =&gt; 'color'),
		)
	);
}
add_action( 'init', 'color_init' );</pre>
<p>Добавить этот код можно в файл <code>functions.php</code> темы или вызвать из плагина.</p>
<p>Как видите, большинство параметров у функции <code>register_taxonomy</code> – это различные настройки. Если хотите, можете почитать их <a href="http://codex.wordpress.org/Function_Reference/register_taxonomy">подробное описание</a>.</p>
<p>Как только вы зарегистрируете таксономию, справа на страницах создания и редактирования записей появится блок новой таксономии.</p>
<p>Если таксономия иерархическая, то выглядеть он будет так:</p>
<div id="attachment_1178" class="wp-caption alignnone" style="width: 303px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/taxonomy_hierarchical.png" alt="taxonomy hierarchical" title="taxonomy hierarchical" width="293" height="405" class="size-full wp-image-1178" /><p class="wp-caption-text"> </p></div>
<p>а если таксономия обычная, то так:</p>
<div id="attachment_1179" class="wp-caption alignnone" style="width: 305px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/taxonomy_simple.png" alt="taxonomy simple" title="taxonomy simple" width="295" height="156" class="size-full wp-image-1179" /><p class="wp-caption-text"> </p></div>
<p>Кроме того, в левом меню в группе <em>Post</em> появится ссылка на страницу редактирования таксономии.</p>
<div id="attachment_1180" class="wp-caption alignnone" style="width: 168px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/taxonomy_menu.png" alt="taxonomy menu" title="taxonomy menu" width="158" height="148" class="size-full wp-image-1180" /><p class="wp-caption-text"> </p></div>
<p>Как видите, возможности у ваших таксономий будут точно такие же как и у стандартных тегов и категорий.</p>
<p>Кроме того, таксономии автоматически поддерживаются на уровне темы. Т.е. если вы хотите чтобы оформление постов, которые относятся к одной из таксономий отличалось от других, вам будет достаточно создать шаблон для неё. Последовательность в которой WordPress ищет шаблоны таксономий показана на следующем рисунке.</p>
<div id="attachment_1181" class="wp-caption alignnone" style="width: 285px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/taxonomy_templates.png" alt="taxonomy templates" title="taxonomy templates" width="275" height="314" class="size-full wp-image-1181" /><p class="wp-caption-text"> </p></div>
<p><em>Примечание</em>. Вместо текста, выделенного красным, нужно подставить название соответствующей таксономии.</p>
<p>Поддержка такой иерархии шаблонов движком позволяет избавиться от длинных оператов <code>switch</code> в теме.</p>
<p>Также существует API для работы с таксономиями. Например, вы можете создать облако тегов с помощью функции <code>wp_tag_cloud</code>, вывести список терминов с помощью <code>the_terms</code> или использовать таксономии для фильтрации записей (функция <code>query_posts</code>).</p>
<p>Я не буду подробно на них останавливаться, т.к. эти же функции используются для работы со стандартными категориями и тегами.</p>
<p>Лучше рассмотрим <strong>ограничения</strong>, которые имеет система таксономий в WordPress.</p>
<p>Предположим, что вы создали таксономию, которая содержит <em>взаимоисключающие</em> значения. Например, название операционной системы для мобильных устройств. Если вы пишите пост о каком-нибудь телефоне, то будет неправильно если вы выберете одновременно термины Android и Simbian. Но WordPress никак не страхует вас от этой ошибки.</p>
<p>Т.е. в этом случае придется отказаться от использования стандартного интерфейса, создать свой <strong>meta-box</strong> (функция <code>add_meta_box</code>) и выводить в нём группу радиокнопок с терминами.</p>
<p>Ещё одна проблема связана с тем, что таксономии не всегда являются <em>очевидным</em> способом группировки контента.</p>
<p>Допустим, вы хотите чтобы оформление записей, содержащих видеоролики, отличалось от всех остальных. Можно просто создать категорию «Видео» и в инструкции пользователю написать, что все записи, содержащие видео, нужно включить в эту категорию.</p>
<p>Тут сразу же возникнет ряд проблем. Во-первых, люди могут ошибаться и не любят читать инструкции. Во-вторых, категорию можно легко удалить прямо из админки, что моментально приведет к изменению дизайна части записей.</p>
<p>Для решения последней проблемы разработчики добавили возможность создавать произвольные типы записей.</p>
<h2>Типы записей (Custom Post Types)</h2>
<p>Эта возможность появилась в версии 3.0. По большому счёту её можно тоже считать таксономией, но и с точки зрения пользователя, и с точки зрения разработчика реализация этой возможности отличается от таксономий, поэтому не будем их путать.</p>
<p>Создать новый тип записи не сложнее чем таксономию. Используется функция <a href="http://codex.wordpress.org/Function_Reference/register_post_type">register_post_type</a>.</p>
<pre class="brush: php">add_action('init', 'create_post_type');

function create_post_type() {
	register_post_type('video',
		array(
			'labels' =&gt; array(
				'name' =&gt; __('Videos'),
				'singular_name' =&gt; __('Videos'),
				...
			),
			'public' =&gt; true,
			'publicly_queryable' =&gt; true,
			'show_ui' =&gt; true,
			'query_var' =&gt; true,
			'capability_type' =&gt; 'post',
			'hierarchical' =&gt; false,
			'menu_position' =&gt; null,
			'taxonomies' =&gt; array('category','post_tag'),
			'supports' =&gt; array('title','editor','author','thumbnail','excerpt','comments'),
		)
	);
}</pre>
<p>Как видите, используется событие (<code>action</code>) <code>init</code>, а в параметрах задаются основные настройки нового типа записей. Например, перечень полей в форме создания записи (<code>supports</code>), список таксономий (<code>taxonomies</code>) и т.д.</p>
<p>После создания нового типа записей в левом меню админки появится новая группа ссылок для управления записями данного типа.</p>
<div id="attachment_1182" class="wp-caption alignnone" style="width: 170px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/custom_post_types.png" alt="custom post types" title="custom post types" width="160" height="124" class="size-full wp-image-1182" /><p class="wp-caption-text"> </p></div>
<p>Обратите внимание, вы можете «привязывать» любые таксономии к любым типам записей.</p>
<p>Точно также как и в случае с таксономиями, WordPress имеет поддержку типов записей как на уровне темы, так и на уровне API.</p>
<p>Порядок использования шаблонов темы выглядит следующим образом.</p>
<div id="attachment_1183" class="wp-caption alignnone" style="width: 220px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/custom_post_types_templates.png" alt="custom post types templates" title="custom post types templates" width="210" height="194" class="size-full wp-image-1183" /><p class="wp-caption-text"> </p></div>
<p>А примеры работы с типов записей и перечень соответствующих функций вы найдете на <a href="http://codex.wordpress.org/Post_Types">этой странице</a>.</p>
<p><strong>В каких случаях лучше использовать типы записей, а не таксономии?</strong></p>
<p>Если вернуться к аналогии с русским языком, то типы записей можно считать существительными. Т.е. это объекты, например, товары, видеоролики, работы в портфолио и т.п.</p>
<p>Как видите, вроде бы всё выглядит очень неплохо. Типы записей и таксономии позволяют довольно гибко управлять контентом и структурой сайта. И несложно догадаться, в основном они используются на сайтах, которые не являются блогами в классическом понимании.</p>
<p>Тем не менее, появление и широкое использование этих возможностей создало <strong>дополнительную проблему</strong>.</p>
<p>Давайте вспомним, почему WordPress пользуется такой популярностью?</p>
<p>Правильно, из-за большого количества практически бесплатных тем и плагинов.</p>
<p>Вы можете скачать новую тему и изменить дизайн блога с помощью пары кликов мышкой… по крайне мере теоретически. Но что новая тема знает о ваших таксономиях и типах постов? Разработчик темы, конечно, может получить их список, но что дальше? Откуда он знает <em>какую смысловую нагрузку они несут и как их нужно выводить</em>?</p>
<p>В результате получается, что если вы пользуетесь таксономиями и типами записей, то переход на новую тему потребует доработки этой темы. Исключение составляют темы от одного и того же разработчика, при условии, что он использовал в них одинаковые таксономии и типы записей.</p>
<p>В общем, в такой ситуации очень логичным выглядит следующий шаг разработчиков WordPress – <em>попытка стандартизации</em>.</p>
<p>Речь, конечно, о форматах записей (Post Formats).</p>
<h2>Форматы записей (Post Formats)</h2>
<p>Эта возможность появится в версии 3.1. На данный момент чтобы её потестировать вам нужно скачать development версию WordPress. Я использовал 3.1-RC4-17441.</p>
<p>Рассмотрим, что они из себя представляют.</p>
<p>Одно из их отличий от таксономий постов и типов записей заключается в том, что форматы не нужно создавать. Нужно просто включить их поддержку (используется функция <code>add_theme_support</code>).</p>
<pre class="brush: php">add_action('after_setup_theme', 'add_post_formats');
function add_post_formats() {
	add_theme_support( 'post-formats', array( 'aside', 'gallery', 'quote' ) );
}</pre>
<p>Во втором параметре этой функции необходимо перечислить форматы, которые вам нужны. При этом, можно использовать только строго определённые названия форматов. Их список вы найдете на <a href="http://codex.wordpress.org/Post_Formats">этой странице</a>.</p>
<p>В результате справа на страницах редактирования и создания записей вы увидите новый блок.</p>
<div id="attachment_1184" class="wp-caption alignnone" style="width: 301px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/02/post_formats.png" alt="post formats" title="post formats" width="291" height="124" class="size-full wp-image-1184" /><p class="wp-caption-text"> </p></div>
<p>Технически форматы постов в WordPress реализованы как таксономии специального вида, т.е. вы, как разработчик темы, можете обеспечить обратную совместимость вашей темы с предыдущими версиями движка.</p>
<p>Для этого нужно будет зарегистрировать таксономию с названием <code>post_format</code> и добавить в неё термины вида <code>post-format-название_формата</code> (например, <code>post-format-aside</code>). Для добавления термина используется функция <code>wp_insert_term</code>.</p>
<p>Естественно, в теме вы сможете определить формат текущей записи и соответствующим образом изменить её вид.</p>
<p>В общем, ничего принципиально сложного в использовании форматов постов нет. Основная проблема заключается в том, будут ли использовать новую возможность разработчики тем?</p>
<p>Ответить на него довольно сложно. Ясно, что разработка тем немного усложнится. К тому же наличие специальных таксономий, типов и форматов постов автоматически предполагает, что темы станут более специализированными, т.е. их взаимозаменяемость в любом случае будет ограничена.</p>
<p>С другой стороны, это логично. Если тема создавалась для корпоративного ресурса, то вряд ли она подойдет для портфолио. Исключить эту проблему можно было оставив WP чисто блоговым движком.</p>
<p>Но практика показала, что разработчики постоянно пытаются выйти за рамки движка. И все перечисленные в этой статье возможности были доступны и раньше, только за счёт использования специальных плагинов.</p>
<p>В заключение хочу сказать, что я не знаю точно насколько популярными окажутся форматы постов. Кстати, взгляды авторов англоязычных блогов по этому вопросу тоже не однозначные. Но, в любом случае, приятно видеть, что движок развивается!</p>
<p>Поэтому, хочу пожелать его авторам удачи! <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Интересно почитать</strong></p>
<p>Хотите научиться делать красивые сайты? <a href="http://it-centre.net/flash.php">Курсы flash</a> дадут знания для начала работы.</p>
<p>Подготовка <a href="http://online-nalogi.ru/3_ndfl_vychet_za_obuchenie"> 3 ндфл за обучение</a> для получения социального вычета в кратчайшие сроки</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/upravlenie-kontentom-v-wordpress-cms-situaciya-na-segodnya-i-blizhajshaya-perspektiva.html/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Индивидуальное оформление виджетов для WordPress</title>
		<link>http://www.simplecoding.org/individualnoe-oformlenie-vidzhetov-dlya-wordpress.html</link>
		<comments>http://www.simplecoding.org/individualnoe-oformlenie-vidzhetov-dlya-wordpress.html#comments</comments>
		<pubDate>Tue, 30 Nov 2010 15:36:22 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1159</guid>
		<description><![CDATA[Последнее время мне довольно часто приходится заниматься разработкой виджетов для WordPress и иногда возникают ситуации, когда стандартных возможностей движка не хватает. Сегодня я хочу показать прием, который позволяет назначить виджетам (которые находятся внутри одного сайдбара) индивидуальные CSS стили. Прежде всего, разберемся, о каких именно стилях идет речь. Вообще содержимое виджета и его разметка определяются разработчиком. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1160" class="wp-caption alignnone" style="width: 280px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/11/wp_widget_styling.png" alt="wordpress widget styling" title="wordpress widget styling" width="270" height="236" class="size-full wp-image-1160" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Последнее время мне довольно часто приходится заниматься разработкой виджетов для <strong>WordPress</strong> и иногда возникают ситуации, когда стандартных возможностей движка не хватает.</p>
<p>Сегодня я хочу показать прием, который позволяет назначить виджетам (которые находятся внутри одного сайдбара) <strong>индивидуальные CSS стили</strong>.</p>
<p>Прежде всего, разберемся, о каких именно стилях идет речь.</p>
<p>Вообще содержимое виджета и его разметка определяются разработчиком. Но для того, чтобы виджеты красиво вписывались в дизайн темы предусмотрены 4 параметра, которые должны использовать разработчики виджетов (по крайней мере в теории <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>Эти параметры задаются разработчиком темы при создании сайдбара. Например, так:<br />
<span id="more-1159"></span></p>
<pre class="brush: php">register_sidebar(array(
	...,
	 'before_widget' =&gt; '&lt;li id="%1$s" class="widget %2$s"&gt;',
	 'after_widget'  =&gt; '&lt;/li&gt;',
	 'before_title'  =&gt; '&lt;h2 class="widgettitle"&gt;',
	 'after_title'   =&gt; '&lt;/h2&gt;'
));</pre>
<p>Разработчики виджетов обычно используют их внутри метода <code>widget</code>. Взгляните на фрагмент <a href="http://codex.wordpress.org/Widgets_API">примера из кодекса</a>.</p>
<pre class="brush: php">class My_Widget extends WP_Widget {
...
	function widget($args, $instance) {
		extract( $args );
		$title = apply_filters('widget_title', $instance['title']);
		?&gt;
		&lt;?php echo $before_widget; ?&gt;
			  &lt;?php if ( $title )
				echo $before_title . $title . $after_title; ?&gt;
			  Hello, World!
		  &lt;?php echo $after_widget; ?&gt;
		&lt;?php
	}
}</pre>
<p>Как видите, в параметре <code>before_widget</code> использованы две переменные: <code>%1$s</code> и <code>%2$s</code> (их значения подставляются с помощью функции <code>sprintf</code>). В результате для текстового виджета получим что-то вроде.</p>
<pre class="brush: html">&lt;li id="text-3" class="widget widget_text"&gt;</pre>
<p>Т.е. мы можем <strong>задать стили отдельно для каждого типа виджетов</strong>. Но представьте, что нам нужно вывести заголовки каждого <em>четного</em> виджета в сайдбаре темно-синим, а каждого <em>нечетного</em> – серым цветом. И при этом цвет не зависит от типа виджета, а определяется исключительно порядком размещения виджетов и если пользователь переставит виджеты местами, то и цвета должны измениться.</p>
<p>Использовать параметр <code>id</code> для этих целей вряд ли получится. Он создается при вставке виджета в сайдбар и не изменяется при перемещении виджета.</p>
<p><strong>Решение</strong> довольно простое.</p>
<p>Добавьте в файл <code>functions.php</code> следующий код.</p>
<pre class="brush: php">function custom_widget_counter($params) {
	global $widget_counter;

	if ($params[0]['id'] == 'my_sidebar') {
		$widget_counter++;
		If ($widget_counter % 2 == 0) {
			$params[0]['before_title'] = '&lt;h2 class="even"&gt;';
		}
		else {
			$params[0]['before_title'] = '&lt;h2 class="odd"&gt;';
		}
	}
	return $params;
}

add_filter('dynamic_sidebar_params','custom_widget_counter');</pre>
<p>«Фокус» заключается в использовании фильтра <code>dynamic_sidebar_params</code>, который позволяет изменять параметры, указанные при создании сайдбара (функция <code>register_sidebar</code>).</p>
<p>Установка атрибута <code>class</code> выполняется функцией <code>custom_widget_counter</code> (её имя мы указываем при добавлении фильтра). В первом параметре эта функция получает массив с текущими настройками.</p>
<p>Затем мы объявляем глобальную переменную <code>$widget_counter</code>, которая используется в качестве счетчика виджетов в сайдбаре.</p>
<p>Учитывая, что сайдбаров может быть несколько, проверяем id сайдбара и если он равен <code>my_sidebar</code>, устанавливаем параметр <code>before_title</code>. Для этого достаточно просто присвоить соответствующему элементу массива новое значение.</p>
<p>Если текущий виджет четный, устанавливаем <code>&lt;h2 class="even"&gt;</code>, в противном случае &#8211; <code>&lt;h2 class="odd"&gt;</code>.</p>
<p>И, самое главное, нужно обязательно вернуть (<code>return</code>) изменённый массив, иначе наши изменения применены не будут.</p>
<p>После этого остаётся только добавить соответствующие CSS правила в таблицу стилей.</p>
<p>И ещё раз хочу обратить ваше внимание. Этот метод будет работать для виджетов, которые разработаны в соответствии с рекомендациями кодекса (используются переменные before_widget, before_title и т.д. в разметке виджета). </p>
<p>Если есть вопросы или замечания пишите, буду рад обсудить <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>До встречи!</p>
<p><strong>Интересно почитать</strong></p>
<p>Нужно <a href="http://nippondom.com/prodvizhenie_restorana_i_kafe">продвижение ресторана</a>? Попробуйте муляжи блюд от японских дизайнеров</p>
<p>Качественные и удобные <a href="http://www.onyx-inter.ru/shvejnyj-cex-proizvodstvo-oniks.html">промо сумки на заказ</a> от швейного цеха</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/individualnoe-oformlenie-vidzhetov-dlya-wordpress.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Обновление WordPress плагина Terms Descriptions</title>
		<link>http://www.simplecoding.org/obnovlenie-wordpress-plagina-terms-descriptions.html</link>
		<comments>http://www.simplecoding.org/obnovlenie-wordpress-plagina-terms-descriptions.html#comments</comments>
		<pubDate>Wed, 24 Nov 2010 17:27:44 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1156</guid>
		<description><![CDATA[Приветствую! Сегодня выложил очередное обновление WordPress плагина Terms Descriptions. Для тех, кто слышит о нём впервые, кратко объясню его назначение. Он позволяет создавать списки терминов, назначать им ссылки, автоматически искать термины и преобразовывать их в ссылки в ваших записях. Подробнее можно почитать здесь. Т.е. принцип довольно простой и поставленная задача решается в полном объеме. Но [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1063" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/wp_terms_descriptions_logo.png" alt="wp terms descriptions logo" title="wp terms descriptions logo" width="300" height="250" class="size-full wp-image-1063" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Приветствую!</p>
<p>Сегодня выложил очередное обновление WordPress плагина Terms Descriptions.</p>
<p>Для тех, кто слышит о нём впервые, кратко объясню его назначение. Он позволяет создавать списки терминов, назначать им ссылки, автоматически искать термины и преобразовывать их в ссылки в ваших записях. Подробнее можно почитать <a href="http://www.simplecoding.org/plagin-wordpress-terms-descriptions">здесь</a>.</p>
<p>Т.е. принцип довольно простой и поставленная задача решается в полном объеме. Но предусмотреть всё практически не возможно, и пользователи постоянно предлагают хорошие идеи.</p>
<p>Последнее усовершенствование предложил <strong>Андрей Х</strong>.</p>
<p><span id="more-1156"></span></p>
<p>Идея заключается в добавлении атрибута <code>class</code> ссылкам, которые создаёт плагин.</p>
<p>Что это даёт?</p>
<p>1) Возможность выделить ссылки с помощью CSS стилей.</p>
<p>2) Возможность обеспечить единый внешний вид ссылок, если для остальных ссылок уже установлен атрибут class.</p>
<p>Добавить атрибут несложно.</p>
<p><a href="http://wordpress.org/extend/plugins/terms-descriptions/">Обновите</a> плагин, в админке появится дополнительное поле.</p>
<div id="attachment_1157" class="wp-caption alignnone" style="width: 385px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/11/wp_terms_descriptions_class.png" alt="wordpress terms descriptions class" title="wordpress terms descriptions class" width="375" height="359" class="size-full wp-image-1157" /><p class="wp-caption-text"> </p></div>
<p>Значение атрибута нужно указать в поле &#034;Атрибут Class для ссылок&#034;.</p>
<p>После этого, ссылки будут выглядеть так.</p>
<pre class="brush: html">&lt;a href="http://site.domain" class="ext_link"&gt;Текст ссылки&lt;/a&gt;</pre>
<p>Не хотите пользоваться этой возможность, просто оставьте поле пустым.</p>
<p>Ещё одно изменение касается <strong>русской локализации</strong>. За это отдельное спасибо <strong>Андрей Х</strong>, который не поленился и исправил мои ошибки.</p>
<p>Кстати, если есть желание и возможность, вы можете перевести этот плагин на свой язык. Много времени это не займет. Плагин содержит менее 40 текстовых фраз. Для перевода удобнее всего использовать программу <a href="http://www.poedit.net/">Poedit</a>. Затем просто пришлите файл переводов мне.</p>
<p>Надеюсь, нововведения будут вам полезны.</p>
<p>Удачи!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/obnovlenie-wordpress-plagina-terms-descriptions.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>WordPress плагин Terms Descriptions. Новая версия.</title>
		<link>http://www.simplecoding.org/wordpress-plagin-terms-descriptions-novaya-versiya.html</link>
		<comments>http://www.simplecoding.org/wordpress-plagin-terms-descriptions-novaya-versiya.html#comments</comments>
		<pubDate>Mon, 08 Nov 2010 07:05:26 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1149</guid>
		<description><![CDATA[Приветствую всех! Я всё-таки собрался и доделал плагин Terms Descriptions Изменений в новой версии не много, но об одном из них меня просили уже несколько раз. Речь о поддержке словоформ, т.е. нескольких вариантов написания одного и того же термина. Например, так яблоко&#124;яблоки&#124;яблок и т.д. Разделять словоформы нужно с помощью символа &#124;. При этом, каждый из [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1063" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/wp_terms_descriptions_logo.png" alt="wp terms descriptions logo" title="wp terms descriptions logo" style="float:left" width="300" height="250" class="size-full wp-image-1063" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую всех!</strong></p>
<p>Я всё-таки собрался и доделал плагин <a href="http://www.simplecoding.org/plagin-wordpress-terms-descriptions">Terms Descriptions</a> <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Изменений в новой версии не много, но об одном из них меня просили уже несколько раз.</p>
<p>Речь о поддержке словоформ, т.е. нескольких вариантов написания одного и того же термина.</p>
<p>Например, так <code>яблоко|яблоки|яблок</code> и т.д.</p>
<p>Разделять словоформы нужно с помощью символа <code>|</code>. При этом, каждый из вариантов написания может состоять из одного или нескольких слов. Например, <code>жесткий диск|винчестер|HDD</code>.<br />
<span id="more-1149"></span><br />
В общем, эта возможность должна понравиться SEO&#039;шникам <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Хотя я не советую черезмерно увлекаться перелинковкой. Страница с большим количеством ссылок выглядит не естественно. Особенно, если ссылки одни и те же.</p>
<p>Поэтому не лишним будет использовать настройку &#034;Преобразовывать первые &#8230; терминов&#034;.</p>
<p>Обратите внимание, что все словоформы считаются одним термином. Т.е. <code>жесткий диск|винчестер|HDD</code> &#8211; один термин. И если в настройках указать &#034;Преобразовывать первые 2 термина&#034;, то плагин поставит только две ссылки (на те словоформы, которые встретятся первыми в тексте поста).</p>
<p><strong>Важно!</strong></p>
<p>Большие списки терминов (100+) могут отрицательно сказаться на скорости формирования страницы. В таких случаях решить проблему можно с помощью кеширования, благо для WordPress недостатка в соответствующих плагинах нет.</p>
<p><img src="http://www.simplecoding.org/wp-content/uploads/2010/11/screenshot-2.png" alt="" title="screenshot-2" width="472" height="658" class="alignnone size-full wp-image-1150" /></p>
<p>Ещё одна новость касается <strong>размещения плагина</strong>.</p>
<p>Я перенёс его на официальный сайт <a href="http://wordpress.org/extend/plugins/terms-descriptions/">WordPress</a>. Так что теперь будут работать автоматические обновления.</p>
<p>В связи с этим, огромная просьба сообщить мне обо всех замеченных недостатках. Как в описании, так и работе плагина. Предложения новых возможностей или усовершенствования существующих также приветствуются.</p>
<p>Кстати, на <a href="http://wordpress.org/extend/plugins/terms-descriptions/">странице плагина</a> есть виджет <strong>Compatibility</strong>. С его помощью можно указать с какими версиями плагин работает, а с какими &#8211; нет. Мне будет приятно, если вы поучаствуете в наполнении этой статистики.</p>
<p><strong>Удачного обновления!</strong></p>
<p><strong>Интересно почитать</strong></p>
<p>Шьем <a href="http://onyx-inter.ru/sumki_iz_pvh_hlopka_brezenta">сумки из хлопка и ПВХ</a>, цены &#8211; фантастика</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-plagin-terms-descriptions-novaya-versiya.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Disqus: очередной холивар</title>
		<link>http://www.simplecoding.org/disqus-ocherednoj-xolivar.html</link>
		<comments>http://www.simplecoding.org/disqus-ocherednoj-xolivar.html#comments</comments>
		<pubDate>Thu, 28 Oct 2010 12:47:49 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Разное]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1133</guid>
		<description><![CDATA[Приветствую всех! Сегодня, просматривая Google Reader, я наткнулся на две статьи о системе комментирования Disqus с диаметрально противоположными мнениями &#8211; For Idiotisqus и Системы комментирования для блогов – плюс и минусы. Что же делать? В принципе, все это смахивает на типичный холивар, в которых я учавствовать не люблю. Но для многих блоггеров вопрос стоит конкретно: [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1134" class="wp-caption alignnone" style="width: 201px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/10/disqus-logo.png" alt="disqus-logo" title="disqus-logo" width="191" height="22" class="size-full wp-image-1134" style="float:left; padding: 0 10px 10px 0" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую всех!</strong></p>
<p>Сегодня, просматривая <strong>Google Reader</strong>, я наткнулся на две статьи о системе комментирования <a href="http://disqus.com/">Disqus</a> с диаметрально противоположными мнениями &#8211; <a href="http://brokenbrake.biz/2010/10/28/idiotisqus">For Idiotisqus</a> и <a href="http://arn.ro/post/426">Системы комментирования для блогов – плюс и минусы. Что же делать?</a></p>
<p>В принципе, все это смахивает на типичный холивар, в которых я учавствовать не люблю. Но для многих блоггеров вопрос стоит конкретно: «<strong>Устанавливать стороннюю систему комментирования или нет?</strong>» И ориентироваться они будут именно на такие статьи. К тому же, потестировать такую систему локально не получится, вы просто не получите достаточно объективных данных. А ставить эксперименты на «живом» блоге никто не любит.</p>
<p>В этой статье я хочу рассказать о своем опыте использования Disqus и, возможно, помочь принять правильное решение <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
<span id="more-1133"></span><br />
Прежде всего, разберемся, <strong>зачем вообще оно надо</strong>.</p>
<p>Стандартная система комментирования <strong>WordPress</strong> (и других движков) предлагает пользователю заполнить форму минимум из трех полей (имя, email и текст комментария). Обычно есть ещё и четвертое поле – ссылка.</p>
<p>Заполнять эти поля нужно каждый раз при отправке комментария. Некоторые блоггеры, правда, предлагают посетителям зарегистрироваться, тогда форму заполнять не нужно. Но, думаю, вы понимаете, что регистрироваться будут только постоянные читатели, которые комментируют часто, да и то, не все.</p>
<p>Очевидно, что если посетитель комментирует часто и не только на вашем блоге, то он захочет ускорить процесс и избежать ошибок при вводе своих данных.</p>
<p>Решать проблему можно по-разному.</p>
<p>Например, <strong>переложить её на читателей</strong>. Пусть устанавливают себе какие-нибудь программы или плагины к браузеру для быстрого заполнения форм.</p>
<p>Или <strong>заняться этой проблемой самому</strong>. Т.е. дать возможность использовать для аутентификации какие-нибудь социальные сервисы. При этом процедура аутентификации заключается в том, что посетитель подтверждает, что он является владельцем аккаунта на выбранном сервисе. И самое главное преимущество – она выполняется двумя кликами (если, конечно, вы залогинены на выбранном сервисе).</p>
<p>Второй вариант, естественно, выглядит привлекательнее. Но, к сожалению, <strong>красиво все получается только в теории</strong>.</p>
<p>Есть глюки в работе сторонних систем комментирования, есть проблемы с переводом на русский. Так, например, в Disqus не всегда правильно отображается время отправки комментария, хотя в английской версии этих проблем нет. Кроме того, Disqus в какой-то момент может оказаться недоступен (правда, я такого не замечал).</p>
<p>Но давайте посмотрим, <strong>какие есть альтернативы</strong>.</p>
<h2>1) Написать систему аутентификации самостоятельно.</h2>
<p>Я серьезно рассматривал этот вариант. В теории все просто. Есть два протокола – <strong>OpenId</strong> и <strong>OAuth</strong>, которые поддерживают большинство сервисов, и есть <a href="http://openid.net/developers/libraries/">готовые библиотеки</a> для работы с ними (писать всё с нуля долго и нудно). Но когда я начал тестировать OpenId библиотеки получилось, что протокол они вроде бы поддерживают, но работают не со всеми сервисами. Например, многие не работают с Google, а он – один из самых популярных OpenId провайдеров.</p>
<p>В общем, получается, что быстро и легко написать такую систему не получится. Придется «допиливать» под каждый сервис.</p>
<p><em>Примечание</em>. Тут я могу ошибаться. Все библиотеки я не тестировал. Возможно, через какое-то время ситуация изменится.</p>
<p>От этого варианта я отказался.</p>
<h2>2) Использовать сервис <a href="https://loginza.ru/">Loginza</a> или аналогичный (правда, аналогов я не знаю <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</h2>
<p>Здесь ситуация гораздо лучше. Поддерживаются все основные сервисы и работает он стабильно. К тому же есть готовый плагин для WP.</p>
<p>Тем не менее, вопросы остаются. Loginza не гарантирует, что вы получите все необходимые данные. Например, email. Некоторые сервисы аутентификации его просто не передают. Тут же возникает вопрос: «Каким образом тогда реализовать подписку на комментарии?»</p>
<p>Кстати, если интересно, у меня есть несколько статей об использовании Loginza – <a href="http://www.simplecoding.org/authentication-with-social-services-and-openid.html">первая</a>, <a href="http://www.simplecoding.org/kak-podruzhit-servis-loginza-i-frejmvork-yii.html">вторая</a>.</p>
<h2>3) Использовать стороннюю систему комментирования, например, Disqus.</h2>
<p>Тут от вас ничего особенного не потребуется. Подключить ее к своему блогу достаточно просто. Но, как я уже говорил, проблемы есть. Правда, всё не так плохо, как рассказывает Тормоз <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Прежде всего, нужно четко понимать, что при использовании Disqus все комментарии автоматически синхронизируются между сервисом и вашей базой данных. Т.е. вы в любой момент может отключить эту систему, и не потеряете ни одного комментария (проверить очень легко, просто посмотрите таблицу wp_comments).</p>
<p>Далее, <strong>о проблемах с некоторыми браузерами</strong>, в частности с IE.</p>
<p>Естественно, если у вас большинство читателей пользуется браузером, который плохо работает с системой Disqus, то глупо её подключать.</p>
<p>Но ориентироваться тут нужно на собственный блог, а не на усреднённую статистику. Например, для этого блога ситуация такая.</p>
<div id="attachment_1135" class="wp-caption alignnone" style="width: 460px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/10/browsers_chart.png" alt="browsers chart" title="browsers chart" width="450" height="281" class="size-full wp-image-1135" /><p class="wp-caption-text"> </p></div>
<p>Имеет ли мне смысл ориентироваться, например, на <a href="http://www.liveinternet.ru/stat/ru/browsers.html?date=2010-09-30;period=month">эту статистику</a>?</p>
<p><strong>Переходим к поддержке JavaScript</strong>, точнее его отсутствию.</p>
<p>Без JS система вроде Disqus работать не будет. Тут без вариантов. Но фокус в том, что без поддержки JS нормально работает только стандартный метод отправки. Можно, конечно, аутентифицировать посетителя и через OpenId, но что будет представлять собой такая аутентификация?</p>
<p>Пользователя будет несколько раз редиректить между вашим сайтом и OpenId провайдером. Такой вариант прекрасно работает на ресурсах вроде <a href="http://stackoverflow.com/">Stackoverflow.com</a>, но, думаю, 99% аудитории там четко понимают, что происходит и что нужно делать. Т.е. опять же, все зависит от ресурса и особенностей его аудитории.</p>
<p>К тому же, многие социальные ресурсы всё равно не работают без JS, а ведь именно их используют для аутентификации.</p>
<p><strong>Спам</strong></p>
<p>Тут Disqus на высоте. Это одно из самых эффективных решений в борьбе со спамом. Подобные результаты я получал только при одновременном использовании Akismet и довольно сложной капчи.</p>
<p>Сейчас автоматитического спама вообще нет, а ручного стало гораздо меньше (меньше 10 комментариев в неделю). Это при том, что раньше я их десятками в день удалял.</p>
<p>Кстати, было бы совсем неплохо, если бы у спамеров браузеры зависали <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Заключение.</h2>
<p>В общем, не хочу я никому ничего навязывать. Мне лично удобно проходить аутентификацию с помощью сторонних сервисов, это экономит моё время. При этом, я пользуюсь последними версиями хороших браузеров <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Но это не означает, что я советую всем блоггерам использовать Disqus или подобную систему. Попробуйте, посоветуйтесь с читателями (для этого достаточно написать пост и попросить оставить свои впечатления). Не понравится – вернёте всё назад.</p>
<p>Не забывайте, что решение вы принимаете именно для своего блога. Угодить абсолютно всем нельзя, и не все общие советы вам подойдут.</p>
<p><strong>Интересно почитать.</strong></p>
<p>Работающая <a href="http://nippondom.com/raskrutka_restorana_i_kafe">раскрутка кафе</a> от японских рестораторов</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/disqus-ocherednoj-xolivar.html/feed</wfw:commentRss>
		<slash:comments>91</slash:comments>
		</item>
		<item>
		<title>Особенности подключения JS скриптов в WordPress</title>
		<link>http://www.simplecoding.org/osobennosti-podklyucheniya-js-skriptov-v-wordpress.html</link>
		<comments>http://www.simplecoding.org/osobennosti-podklyucheniya-js-skriptov-v-wordpress.html#comments</comments>
		<pubDate>Sun, 10 Oct 2010 10:54:06 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1130</guid>
		<description><![CDATA[К сожалению, иногда бывает так, что есть хорошие и удобные инструменты, но по каким-то причинам ими пользуются далеко не все и не всегда. В результате возникают проблемы, казалось бы, на ровном месте. Один из таких примеров – подключение JavaScript кода в WordPress. Этот движок предоставляет удобную функцию wp_enqueue_script. С её помощью можно обеспечить необходимый порядок [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1131" class="wp-caption alignnone" style="width: 299px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/10/wordpress_scripts.jpg" alt="wordpress scripts" title="wordpress scripts" width="289" height="169" style="float:left" class="size-full wp-image-1131" /><p class="wp-caption-text"> </p></div>
<p>К сожалению, иногда бывает так, что есть хорошие и удобные инструменты, но по каким-то причинам ими пользуются далеко не все и не всегда. В результате возникают проблемы, казалось бы, на ровном месте.</p>
<p>Один из таких примеров – <strong>подключение JavaScript кода в WordPress</strong>.</p>
<p>Этот движок предоставляет удобную функцию <code>wp_enqueue_script</code>. С её помощью можно обеспечить необходимый порядок подключения скриптов и, при этом, гарантируется, что один и тот же скрипт будет подключён только один раз.</p>
<p>Кстати, аналогичные возможности есть и в различных фреймворках, например, <a href="http://www.simplecoding.org/yii-php-framework-sozdayom-igrovoj-sajt-chast-7-rabota-s-javascript-i-stranicy-igr.html">Yii</a>.</p>
<p>Но разница между фреймворком и WordPress в том, что с помощью последнего можно создать сайт, не читая документацию, во всяком случае, ту часть, которая касается API. В этом нет ничего плохого, но можно столкнуться с некоторыми нюансами. О них речь пойдет ниже.</p>
<h2>Основные проблемы и причины их появления</h2>
<p><span id="more-1130"></span><br />
Возьмем самую распространённую ситуацию. Есть сайт на WP, и есть готовый JS скрипт, который нужно к этому сайту подключить.</p>
<p>Что написано в инструкции по установке скрипта?</p>
<p>«Вставьте тег <code>&lt;script…&gt;</code> в заголовок страницы (между <code>&lt;head&gt;</code> и <code>&lt;/head&gt;</code>)».</p>
<p>Тут все правильно. Разработчик пишет инструкцию на общий случай, а не конкретно под WP.</p>
<p>Следующий вопрос. Где находятся теги <code>&lt;head&gt;</code> и <code>&lt;/head&gt;</code> в WP?</p>
<p>Обычно в файле <code>header.php</code> текущей темы.</p>
<p>Т.е. если делать строго по инструкции, то нужно добавить теги <code>&lt;script…&gt;</code> в <code>header.php</code>.</p>
<p><strong>Именно здесь и возникают проблемы.</strong></p>
<p>Точнее, если ваш JS скрипт не зависит ни от каких библиотек, и не используется никакими плагинами, то всё будет в порядке, но в противном случае ситуация сложнее.</p>
<h2>Проблема 1. Многократная загрузка JS файлов.</h2>
<p>Возникает если подключить JS скрипт в файле темы, а затем использовать плагин, которому нужен этот же скрипт. Чаще всего такое происходит с JavaScript библиотеками.</p>
<p>Разработчики плагинов доступа к файлам вашей темы не имеют, но должны гарантировать подключение необходимых скриптов. Поэтому для них единственным вариантом будет использование <code>wp_enqueue_script</code>.</p>
<p>В результате один раз JavaScript файл подключается вашим тегом, второй – тегом, который добавит плагин. Это приводит к увеличению веса страницы, времени её загрузки, росту трафика сервера.</p>
<h2>Проблема 2. «Неработающие» плагины.</h2>
<p>Вытекает из первой.</p>
<p>Рассмотрим небольшой пример. Допустим скрипты подключены в <code>header.php</code> следующим образом.</p>
<pre class="brush: php">&lt;head&gt;
	...
	&lt;script src="...jquery.js" ...&gt;&lt;/script&gt;
	&lt;script src="...jquery.my-plugin.js" ...&gt;&lt;/script&gt;
	&lt;?php wp_head(); ?&gt;
&lt;/head&gt;</pre>
<p>Что произойдет если какой-то из плагинов WP подключит jQuery?</p>
<p>Функция <code>wp_enqueue_script</code> добавит теги script там, где находится вызов <code>wp_head()</code>. А это, помимо повторной загрузки jquery, означает, что и объект <code>jQuery</code> будет создан заново. И он будет использоваться вместо первого объекта, к которому подключили плагин.</p>
<p>В принципе, проблему можно решить так.</p>
<pre class="brush: php">&lt;head&gt;
	...
	&lt;?php wp_head(); ?&gt;
	&lt;script src="...jquery.my-plugin.js" ...&gt;&lt;/script&gt;
&lt;/head&gt;</pre>
<p>Но если вы в админке WP отключите плагин, который использует jQuery, то <code>my-plugin.js</code> также перестанет работать. Т.к. jQuery будет не подключена.</p>
<h2>Как избежать этих проблем?</h2>
<p>Просто не трогайте <code>header.php</code>. В папке с темой есть файл functions.php в который нужно добавить следующий код.</p>
<pre class="brush: php">&lt;?php
if ( !is_admin() ) {
	function register_my_js() {
		wp_enqueue_script( 'my-script', get_bloginfo( 'template_directory' ).'/my-script.js', array( 'jquery' ), '1.0', true );
	}
	add_action('init', 'register_my_js');
}
?&gt;</pre>
<p>Этот код подключит скрипт на всех страницах сайта, кроме админки. Если нужно подключать скрипт только на части страниц, можно в условие проверки добавить <code>is_single()</code>, <code>is_home()</code> и т.д.</p>
<p>Кроме того, библиотеку jQuery явно подключать не нужно, т.к. она указана в массиве зависимостей (третий параметр <code>wp_enqueue_script</code>). WordPress подключит её сам до вашего плагина.</p>
<h2>Для справки</h2>
<p>Функция <code>wp_enqueue_script</code> подключает JS файл если он не был подключен ранее. Т.е. можно вызвать её несколько раз для одного и того же скрипта и, при этом, скрипт будет вставлен только один раз.</p>
<p><strong>Параметры.</strong></p>
<pre class="brush: php">wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer );</pre>
<p><code>$handle</code> – название скрипта, должно быть уникальным.</p>
<p><code>$src</code> – URL скрипта. Если скрипт был предварительно зарегистрирован с помощью wp_register_script, то его указывать не обязательно.</p>
<p><code>$deps</code> – массив зависимостей (нужно перечислить названия JS скриптов, которые должны быть загружены перед данным).</p>
<p><code>$ver</code> – версия скрипта (необязательный).</p>
<p><code>$in_footer</code> – если равен true, скрипт будет подключен в конце страницы, там где находится <code>wp_footer()</code>. Обычно в файле <code>footer.php</code> перед <code>&lt;/body&gt;</code>.</p>
<h2>Заключение</h2>
<p>Очень советую почитать статью <a href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">Function Reference/wp enqueue script</a>. Она небольшая, но в ней вы найдёте несколько интересных примеров. Например, объясняющих как заменить версию библиотеки jQuery, которая идёт в дистрибутиве WP.</p>
<p><strong>Интересное в сети</strong>.</p>
<p>Возможно, самый оригинальный подарок:<a href="http://www.fruit-and-juice.ru/">фруктовые корзины</a> с доставкой по Москве.</p>
<p><a href="http://blog.copy-write.ru/moi-uslugi/case_study">Технология кейс-стади</a>:  отлично работает при продаже услуг.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/osobennosti-podklyucheniya-js-skriptov-v-wordpress.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

