<?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>Sun, 25 Jul 2010 20:00:16 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<link rel="http://api.friendfeed.com/2008/03#sup" xmlns="http://www.w3.org/2005/Atom" type="application/json" href="http://friendfeed.com/api/public-sup.json#d217526a2c"/>		<item>
		<title>WordPress плагин для внутренней перелинковки страниц сайта. Версия 3.</title>
		<link>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta-versiya-3.html</link>
		<comments>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta-versiya-3.html#comments</comments>
		<pubDate>Thu, 24 Jun 2010 08:30:24 +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=1089</guid>
		<description><![CDATA[Знаете, всегда очень приятно, когда кто-то проявляет внимание к твоей работе и помогает полезными советами. Сразу появляется желание что-нибудь сделать  
Так примерно месяц назад я написал и выложил первую версию плагина Terms Descriptions. Практически сразу же появилось множество отзывов и пожеланий, были найдены баги.
Примечание. Этот плагин предназначен для автоматической внутренней перелинковки сайта. Вы создаёте [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1090" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/06/wp_terms_descriptions_3_logo.png" alt="wp terms descriptions 3 logo" title="wp terms descriptions 3 logo" width="300" height="250" class="size-full wp-image-1090" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Знаете, всегда очень приятно, когда кто-то проявляет внимание к твоей работе и <strong>помогает полезными советами</strong>. Сразу появляется желание что-нибудь сделать <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Так примерно месяц назад я написал и выложил первую версию плагина <a href="http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta.html">Terms Descriptions</a>. Практически сразу же появилось множество отзывов и пожеланий, были найдены баги.</p>
<p><em>Примечание</em>. Этот плагин предназначен для автоматической внутренней перелинковки сайта. Вы создаёте перечень ключевых слов и указываете ссылки для них. Плагин ищет ключевые слова в записях блога и преобразует их в ссылки.</p>
<p>В результате, через неделю вышла <a href="http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta-versiya-2.html">вторая версия плагина</a>, которая значительно гибче позволяла управлять созданием ссылок. Например, была добавлена возможность ограничить их количество на одной странице.</p>
<p>В общем-то, я думал, что плагин решает свою узкую задачу в полном объеме… Но один из читателей этого блога (по имени <strong>Турист</strong>) объяснил мне, что это не так <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-1089"></span><br />
Представьте, что у вас есть несколько сайтов схожей тематики, и вы хотите поставить ссылки с одного сайта на другой. Т.е. нужна возможность <strong>задавать произвольные ссылки</strong>.</p>
<p>Именно эта функция и добавлена в новой (третьей) версии плагина.</p>
<div id="attachment_1088" class="wp-caption alignnone" style="width: 413px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/06/wp_terms_descriptions_3.png" alt="wp terms descriptions 3" title="wp terms descriptions 3" width="403" height="459" class="size-full wp-image-1088" /><p class="wp-caption-text"> </p></div>
<p>Как видно на скриноште, появилась дополнительная опция при выборе типа ссылки. Вы можете поставить ссылку на пост (Post), страницу (Page) данного блога или указать произвольную ссылку.</p>
<p>При выборе последнего варианта список с перечнем страниц будет заменен на обычное текстовое поле, в котором можно указать ссылку.</p>
<p>Остальные функции плагина по сравнению с предыдущей версией не изменились, было исправлено несколько мелких багов.</p>
<p>Надеюсь, нововведение окажется полезным, и, как всегда, жду ваши отзывы и комментарии.</p>
<p><strong>Скачать</strong> новую версию плагина.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2010/05/terms-descriptions.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><strong>P.S.</strong> Я сделал <a href="http://www.simplecoding.org/plagin-wordpress-terms-descriptions">отдельную страницу</a> для этого плагина, теперь все новые версии будут выкладываться там.</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1089&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta-versiya-3.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WordPress плагин для внутренней перелинковки страниц сайта. Версия 2.</title>
		<link>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta-versiya-2.html</link>
		<comments>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta-versiya-2.html#comments</comments>
		<pubDate>Wed, 02 Jun 2010 08:41:17 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1074</guid>
		<description><![CDATA[Приветствую!
Прежде всего, хочу поблагодарить всех, кто участвовал в обсуждении и тестировании моего плагина «Terms Descriptions». Вы подсказали мне несколько хороших идей, которые я реализовал в новой версии плагина.
Сразу даю ссылку на архив.

Новые возможности.

1) Изменились имена файлов и папки плагина. Поэтому перед обновлением необходимо деактивировать и удалить старую версию, а затем установить новую. Все ваши термины [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1075" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/wp_terms_descriptions_2_logo.png" alt="wp terms descriptions 2" title="wp terms descriptions 2" width="300" height="250" class="size-full wp-image-1075" style="float:left" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую!</strong></p>
<p>Прежде всего, хочу поблагодарить всех, кто участвовал в обсуждении и тестировании моего плагина «<a href="http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta.html">Terms Descriptions</a>». Вы подсказали мне несколько хороших идей, которые я реализовал в новой версии плагина.</p>
<p>Сразу даю ссылку на архив.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2010/05/terms-descriptions.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Новые возможности.<br />
<span id="more-1074"></span><br />
<em>1) Изменились имена файлов и папки плагина.</em> Поэтому перед обновлением необходимо деактивировать и удалить старую версию, а затем установить новую. Все ваши термины и настройки сохранятся.</p>
<p>Если вы устанавливаете плагин в первый раз, просто распакуйте архив в папку <code>wp-content/plugins</code> и активируйте плагин в админке.</p>
<p><em>2) Добавлена возможность создавать ссылки не только на страницы блога, но и на посты.</em></p>
<p><em>3) Добавлена возможность ограничить количество замен терминов.</em> Например, если в поле «Преобразовывать первые &#8230; терминов» установить значение равное трём, ссылки будут поставлены на первые три термина. Если вы не хотите использовать это ограничение, установите в этом поле значение «-1».</p>
<p>Обратите внимание, что термины в постах и комментариях подсчитываются отдельно.</p>
<p><em>4) Теперь плагин сверяет id страницы (поста) на которую ведёт ссылка и id текущей страницы (поста). Если они равны, то ссылка не ставится.</em></p>
<p>Например, у вас есть два термина: <code>php</code> и <code>mysql</code>. Ссылка для первого установлена на страницу <code>myblog.domen/php.html</code>, для второго – на <code>myblog.domen/mysql.html</code>. На странице <code>myblog.domen/php.html</code> встречаются оба термина (и <code>php</code>, и <code>mysql</code>), но только <code>mysql</code> будет преобразован в ссылку, т.к. ссылка для термина <code>php</code> указывает на текущую страницу.</p>
<p>Взгляните на скриншот админки.</p>
<div id="attachment_1078" class="wp-caption alignnone" style="width: 460px"><a href="http://www.simplecoding.org/wp-content/uploads/2010/05/terms_descriptions_2_admin.png" target="_blank"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/terms_descriptions_2_admin_thumb.png" alt="terms descriptions 2 admin thumb" title="terms descriptions 2 admin thumb" width="450" height="290" class="size-full wp-image-1078" /></a><p class="wp-caption-text"> </p></div>
<p>Думаю, вы легко определите, где какие параметры нужно указывать <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>И, как всегда, буду рад выслушать ваши замечания и пожелания!</p>
<p><strong>UPD 23.06.2010</strong> Я сделал <a href="http://www.simplecoding.org/plagin-wordpress-terms-descriptions">отдельную страницу</a> для этого плагина, теперь все новые версии будут выкладываться там.</p>
<p><strong>Интересно почитать</strong></p>
<p>Новая модель: <a href="http://www.onyx-inter.ru/bankovskaya-telezhka-onyx.html ">банковская тележка для перевозки денег</a> отечественной разработки.</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1074&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta-versiya-2.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Создание файлов переводов для плагинов и тем WordPress</title>
		<link>http://www.simplecoding.org/sozdanie-fajlov-perevodov-dlya-plaginov-i-tem-wordpress.html</link>
		<comments>http://www.simplecoding.org/sozdanie-fajlov-perevodov-dlya-plaginov-i-tem-wordpress.html#comments</comments>
		<pubDate>Sat, 29 May 2010 10:37:36 +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=1067</guid>
		<description><![CDATA[Всегда приятно, когда можно без особых усилий перевести плагин или тему для движка WordPress на свой язык. Под «особыми усилиями» я подразумеваю необходимость ковыряться в исходных файлах.
WordPress предоставляет механизм для работы с файлами переводов, который, по-идее, должен использовать каждый разработчик. Если, конечно, он хочет распространять свою работу.
В этой статье я постараюсь рассказать о создании и [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1068" class="wp-caption alignnone" style="width: 269px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/wp_translations_logo.png" alt="wp translations logo" title="wp translations logo" width="259" height="124" style="float:left" class="size-full wp-image-1068" /><p class="wp-caption-text"> </p></div>
<p>Всегда приятно, когда можно без особых усилий перевести плагин или тему для движка WordPress на свой язык. Под «особыми усилиями» я подразумеваю необходимость ковыряться в исходных файлах.</p>
<p><strong>WordPress</strong> предоставляет механизм для работы с файлами переводов, который, по-идее, должен использовать каждый разработчик. Если, конечно, он хочет распространять свою работу.</p>
<p>В этой статье я постараюсь рассказать о создании и использовании файлов переводов, а также о программах, которые позволяют упростить работу.</p>
<p><strong>Шаг первый. Определяем, какие строки нужно перевести.</strong><br />
<span id="more-1067"></span><br />
Для этого, в исходных файлах плагина или темы все текстовые строки, которые нужно перевести, помещаем внутрь функций: </p>
<p><code>_e()</code> – выводит (<code>echo</code>) текст;<br />
<code>__()</code> – возвращает (<code>return</code>) текст;<br />
<code>_n()</code> – позволяет работать с единственным и множественным числом;<br />
<code>_x()</code> – работает аналогично <code>__()</code>, но имеет дополнительный параметр – контекст.</p>
<p>Подробно их использование описано в статье <a href="http://codex.wordpress.org/I18n_for_WordPress_Developers">I18n for WordPress Developers</a>. Повторять их примеры я не буду, но советую обратить внимание на два момента.</p>
<p>1) Очень желательно использовать второй параметр в этих функцих (<code>domain</code>). Для плагинов обычно используют название плагина, для темы &#8211; название папки в которой она расположена (а вообще, подойдет любая уникальная строка).</p>
<p>2) Символы окончания строк (<acronym title="End of line">EOL</acronym>) должны быть в Unix-формате, т.е. <code>\n</code>, а не <code>\r\n</code>, как принято в windows. Иначе могут быть проблемы при использовании утилиты <strong>gettext</strong>. Большинство редакторов вроде notepad++ позволяют легко заменить окончания.</p>
<p><strong>Шаг второй. Создаём файлы переводов.</strong></p>
<p>Тут вам нужно сначала создать <code>.po</code> файлы, в которых будут находиться оригинальные строки и переводы, а затем, скомпилировать их в <code>.mo</code> файлы, с которыми работает WordPress.</p>
<p>Вообще для этих целей предназначена утилита <a href="http://www.gnu.org/software/gettext/">gettext</a>, но она консольная и пользоваться ей не очень удобно.</p>
<p>Гораздо приятнее работать с программой <a href="http://www.poedit.net/">Poedit</a>, т.к. она сделает все рутинные операции за вас.</p>
<p>При её первом запуске желательно сразу указать личные данные (Меню Файл -&gt; Установки), т.к. они сохраняются в файлах переводов.</p>
<div id="attachment_1069" class="wp-caption alignnone" style="width: 473px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/poedit_options.png" alt="poedit options" title="poedit options" width="463" height="515" class="size-full wp-image-1069" /><p class="wp-caption-text"> </p></div>
<p>После этого можно приступать к <strong>созданию файлов переводов</strong>.</p>
<p>Заходим в меню Файл -&gt; Создать каталог и в открывшемся окне внимательно заполняем настройки.</p>
<p><em>Общие данные о проекте</em></p>
<div id="attachment_1070" class="wp-caption alignnone" style="width: 421px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/poedit_project_options.png" alt="poedit project options" title="poedit project options" width="411" height="344" class="size-full wp-image-1070" /><p class="wp-caption-text"> </p></div>
<p>Тут всё довольно просто, главное не ошибиться с кодировкой.</p>
<p><em>Вкладка «Путь»</em>. Тут нужно указать путь к папке плагина или темы.</p>
<div id="attachment_1071" class="wp-caption alignnone" style="width: 422px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/poedit_project_options_2.png" alt="poedit project options 2" title="poedit project options 2" width="412" height="344" class="size-full wp-image-1071" /><p class="wp-caption-text"> </p></div>
<p><strong>PoEdit</strong> будет просматривать файлы в этих папках и выбирать строки, которые нужно перевести.</p>
<p><em>Вкладка «Ключевые слова»</em>. Это важный момент. Тут нужно перечислить название функций, которые вы использовали для перевода строк. Без скобок!!!</p>
<div id="attachment_1072" class="wp-caption alignnone" style="width: 421px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/poedit_project_options_3.png" alt="poedit project options 3" title="poedit project options 3" width="411" height="344" class="size-full wp-image-1072" /><p class="wp-caption-text"> </p></div>
<p>После этого, программа импортирует строки из файлов с исходым кодом.</p>
<p>Если строки нужно обновить, выбираем в меню &#034;Каталог&#034; пункт &#034;Обновить из исходного кода&#034;.</p>
<p>После импорта строк <strong>можно приступать к переводу</strong>.</p>
<p>Сам перевод особой сложности не представляет. Если, конечно, вы хорошо знаете язык <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Выбираете строку и пишите в нижней части экрана перевод для неё.</p>
<p><strong>Сохраняем файл</strong>. Poedit автоматически создает два файла .po и .mo.</p>
<p>Важный момент &#8211; <em>имя файла</em>.</p>
<p>Обычно формируется следующим образом</p>
<p><code>pluginname-locale.po<br />
pluginname-locale.mo</code></p>
<p>Например<br />
<code>termdescription-ru_RU.mo</code></p>
<p><strong>Шаг третий. Загружаем файлы переводов в плагине.</strong></p>
<p>Для этого можно использовать следующий код.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> myplugin_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">…</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$plugin_dir</span> = <span class="kw3">basename</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw2">__FILE__</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">load_plugin_textdomain<span class="br0">&#40;</span> <span class="re0">$domain</span>, <span class="st0">&#039;/wp-content/plugins/&#039;</span>.<span class="re0">$plugin_dir</span>, <span class="re0">$plugin_dir</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">…</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Тут предполагается, что плагин и файлы переводов находятся в папке <code>pluginname</code>.</p>
<p>Этот код должен быть вызван при инициализации плагина. Например, в функции, которая вызывается действием <code>init</code> или <code>admin_init</code> (если переводы нужны только для админки)</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">add_action<span class="br0">&#40;</span> <span class="st0">&#039;init&#039;</span>, <span class="st0">&#039;myplugin_init&#039;</span> <span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>В случае с темами, подключение файлов переводов немного проще. В файл <code>functions.php</code> добавьте вызов</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">load_theme_textdomain<span class="br0">&#40;</span>domain-name<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Имя файла при этом должно иметь вид:</p>
<p><code>locale.mo</code></p>
<p>например, <code>ru_RU.mo</code>. И находиться он должен в папке с темой.</p>
<p><strong>Шаг четвёртый. Выбор файла перевода.</strong></p>
<p>WordPress должен определить, какой именно перевод использовать. Указать это можно в настройках блога (файл wp-config.php). Найдите строку в которой определена константа WPLANG и установите нужное значение.</p>
<p>Например, так</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">define</span> <span class="br0">&#40;</span><span class="st0">&#039;WPLANG&#039;</span>, <span class="st0">&#039;ru_RU&#039;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Если у вас возникли вопросы или замечания, пишите, постараюсь ответить.</p>
<p>Удачи!</p>
<p><strong>Интересно почитать</strong></p>
<p>Как установить и настроить <a href="http://www.getwifi.ru/">wifi сеть</a> в вашем доме.</p>
<p>Банкам и службам инкассации: <a href="http://www.onyx-inter.ru/1-3.html">инкассаторские сумки собственной разработки</a>, возможна печать вашего логотипа</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1067&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/sozdanie-fajlov-perevodov-dlya-plaginov-i-tem-wordpress.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WordPress плагин для внутренней перелинковки страниц сайта</title>
		<link>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta.html</link>
		<comments>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta.html#comments</comments>
		<pubDate>Tue, 25 May 2010 14:06:48 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1062</guid>
		<description><![CDATA[Приветствую всех!
Сегодня я хочу поделиться небольшим плагином для WordPress, который недавно доделал.
Идея следующая. Если вы ведете тематический блог, то, скорее всего, используете много названий, определений и терминов. Объяснять их в каждой статье нет никакого смысла, тем не менее, какая-то часть читателей, увидит эти названия впервые. В таких случаях обычно ставят ссылку на официальный сайт или [...]]]></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><strong>Приветствую всех!</strong></p>
<p>Сегодня я хочу поделиться небольшим плагином для <strong>WordPress</strong>, который недавно доделал.</p>
<p><em>Идея следующая</em>. Если вы ведете тематический блог, то, скорее всего, <strong>используете много названий, определений и терминов</strong>. Объяснять их в каждой статье нет никакого смысла, тем не менее, какая-то часть читателей, увидит эти названия впервые. В таких случаях обычно ставят ссылку на официальный сайт или какую-нибудь статью с подробным описанием.</p>
<p>При этом, мы получаем много внешних ссылок. Но можно сделать свою страницу с описанием нужного термина и ссылаться на неё. В принципе, не обязательно даже делать подробное описание. На этой странице можно просто разместить ссылки на официальный сайт и другие интересные ресурсы.<br />
<span id="more-1062"></span><br />
Идея не новая и довольно широко используется на различных ресурсах.</p>
<p>Но расставлять вручную такие ссылки довольно утомительно, особенно если у вас несколько десятков терминов. Но сократить количество работы можно с помощью этого плагина. Ссылка на архив.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2010/05/termdescription.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><strong>Установка.</strong></p>
<p>Всё как обычно. Скачать, распаковать в папку <code>wp-content/plugins</code>, активировать в админке.</p>
<p>После этого, в <strong>меню Tools</strong> появится пункт «<strong>Term Description</strong>» (или «Описание термина» если используется русская локализация), который приведет вас на страницу с настройками плагина.</p>
<div id="attachment_1066" class="wp-caption alignnone" style="width: 460px"><a href="http://www.simplecoding.org/wp-content/uploads/2010/05/term_description_admin.png" target="_blank"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/term_description_admin_thumb.png" alt="term description admin thumb" title="term description admin thumb" width="450" height="302" class="size-full wp-image-1066" /></a><p class="wp-caption-text"> </p></div>
<p><strong>Использование.</strong></p>
<p>Прежде всего, нужно <strong>создать страницы с описаниями</strong>. Иначе вы не сможете указать ссылку.</p>
<p>После того, как страницы созданы, заходите в настройки и <strong>добавляете термины и ссылки</strong>.</p>
<p>Любой термин можно отредактировать или удалить. Для этого наведите курсор на название термина в таблице и под ним появятся ссылки «Изменить» и «Удалить».</p>
<p>Также можно указать где именно нужно заменять термины. В тексте постов и/или комментариях.</p>
<p><strong>Принцип работы плагина.</strong></p>
<p>Преобразование терминов в ссылки происходит только в постах (Posts), страницы (Pages) игнорируются. Иначе может получится, что на страницах окажутся ссылки, которые ведут на них же. Я не знаю как на это отреагируют поисковые роботы, но людям точно не понравится <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Кроме того, найденные термины игнорируются в следующих случаях.</p>
<p>1) Если они уже находятся внутри ссылки.</p>
<p>2) Если они находятся внутри тега (например, в атрибуте <code>alt</code> тега <!--more-->img).</p>
<p>3) Если они находятся внутри заголовков (теги <code>h1</code> &#8211; <code>h6</code>).</p>
<p>4) Если они являются составляющей частью другого слова (например, термин <em>рот</em>, найденное слово &#8211; <em>крот</em>).</p>
<p>Обратите внимание, что если вы снимете отметки в обоих чекбоксах в настройках плагина, то термины на ссылки заменяться нигде не будут.</p>
<p><strong>Небольшое предупреждение.</strong></p>
<p>Это первая версия плагина, и в каких-то ситуациях могут возникнуть проблемы. Поэтому очень желательно сразу после активации проверить корректность его работы.</p>
<p>Все замеченные недостатки или пожеланиях можно оставлять в комментариях к этому посту.</p>
<p><strong>Удачи!</strong></p>
<p><strong>UPD 23.06.2010</strong> Я сделал <a href="http://www.simplecoding.org/plagin-wordpress-terms-descriptions">отдельную страницу</a> для этого плагина, теперь все новые версии будут выкладываться там.</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1062&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-plagin-dlya-vnutrennej-perelinkovki-stranic-sajta.html/feed</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Плагин WordPress. Исключаем ненужные категории.</title>
		<link>http://www.simplecoding.org/plagin-wordpress-isklyuchaem-nenuzhnye-kategorii.html</link>
		<comments>http://www.simplecoding.org/plagin-wordpress-isklyuchaem-nenuzhnye-kategorii.html#comments</comments>
		<pubDate>Thu, 06 May 2010 08:01:52 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1053</guid>
		<description><![CDATA[На сегодняшний день, не смотря на всю критику в его адрес, движок WordPress остаётся наиболее популярным среди блоггеров. И одна из основных причин такой популярности – огромное количество плагинов и готовых тем оформления.
Я не буду утверждать, что создание плагинов для WP простой и интуитивно понятный процесс, но и назвать его сверхсложным я тоже не могу. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1054" class="wp-caption alignnone" style="width: 213px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/wp_plugin_exclude_categories.png" alt="wordpress plugin exclude categories" title="wordpress plugin exclude categories" width="203" height="115" class="size-full wp-image-1054" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>На сегодняшний день, не смотря на всю критику в его адрес, движок <strong>WordPress</strong> остаётся наиболее популярным среди блоггеров. И одна из основных причин такой популярности – огромное количество плагинов и готовых тем оформления.</p>
<p>Я не буду утверждать, что создание плагинов для <acronym title="WordPress">WP</acronym> простой и интуитивно понятный процесс, но и назвать его сверхсложным я тоже не могу. Есть свои нюансы, к которым нужно привыкнуть.</p>
<p>В этот раз я хочу рассказать о разработке несложного плагина, позволяющего <strong>исключать записи из определённых категорий с главной страницы и из <acronym title="Really Simple Syndication">RSS</acronym> ленты</strong>.</p>
<p>Для чего это может понадобиться.<br />
<span id="more-1053"></span><br />
<strong>1)</strong> Вы ведёте тематический блог, но иногда любите писать просто о жизни. По-умолчанию, на главной страницы блога отображаются последние записи. Посетитель, попав на ваш ресурс, в первую очередь, будет смотреть именно на них, и если они ему не понравятся, то вряд ли он станет листать ваши архивы, надеясь найти тематическую статью.</p>
<p><strong>2)</strong> Вы занимаетесь размещением платных статей. Тут вообще всё просто. Постоянные читатели вряд ли оценят seo&#039;шную статью о преимуществах очередного интернет магазина <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  В тоже время, монетизировать блог как-то нужно.</p>
<p><strong>Возвращаемся к реализации.</strong></p>
<p>Сразу даю ссылку на архив</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2010/05/exclude_category.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Вообще-то, я нашел несколько готовых плагинов с похожим функционалом. Но по разным причинам они меня не устроили. Возможности некоторых были явно избыточны (для меня), другие работали не совсем так, как мне хотелось. Поэтом я решил сделать свой вариант.</p>
<p><strong>Установка и подключение</strong> точно такие же, как и у большинства плагинов. Архив нужно распаковать в папку wp-content\plugins и активировать в панели у правления. После этого в разделе Settings появится страница с настройками плагина.</p>
<div id="attachment_1056" class="wp-caption alignnone" style="width: 384px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/05/wp_plugin_exclude_categories_admin.png" alt="wp plugin exclude categories admin" title="wp plugin exclude categories admin" width="374" height="232" class="size-full wp-image-1056" /><p class="wp-caption-text"> </p></div>
<p>Отмечаете нужные категории, и решаете где их не нужно показывать.</p>
<p><strong>Теперь разберем реализацию плагина.</strong></p>
<p>Начало стандартное.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Plugin Name: Exclude Category Plugin</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Plugin URI: http://www.simplecoding.org/plagin-wordpress-isklyuchaem-nenuzhnye-kategorii.html</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Description: Позволяет убрать посты указанных категорий с главной страницы и из <acronym title="Really Simple Syndication">RSS</acronym> ленты.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">Version: 1.0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Author: Statsenko Vladimir</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Author URI: http://www.simplecoding.org</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
</ol>
</div>
<p>Этот комментарий содержит данные, которые отображаются на панели управления плагинами.</p>
<p><strong>Создание страницы в панели управления.</strong></p>
<p>Нам нужно выполнить два действия: создать новый пункт в меню <strong>Settings</strong> и создать форму с настройками плагина.</p>
<p>Начнём с создания формы.</p>
<blockquote style="white-space: nowrap; overflow:auto; margin: 10px 0 10px 0; border: dotted 1px #aeaeae; background-color: #f0f0f0;"><p><code><font size="2" face="Courier New" color="black">
<ol>
<li>&#60;?php</li>
<li>function ec_settings_page() {</li>
<li>&nbsp;&nbsp;<font color="#008000">//получаем список категорий</font></li>
<li>&nbsp;&nbsp;$categories = get_categories(array(<font color="#A31515">'hide_empty'</font> =&#62; <font color="#0000ff">false</font>));</li>
<li>?&#62;</li>
<li>&#60;div <font color="#0000ff">class</font>=<font color="#A31515">"wrap"</font>&#62;</li>
<li>&nbsp;&nbsp;&#60;h2&#62;Exclude Category Plugin Settings&#60;/h2&#62;</li>
<li>&nbsp;&nbsp;&#60;form method=<font color="#A31515">"post"</font> action=<font color="#A31515">"options.php"</font>&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&#60;?php</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//Необходимо для автоматической обработки формы</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;settings_fields( <font color="#A31515">'ec-settings-group'</font> );</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;?&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&#60;table <font color="#0000ff">class</font>=<font color="#A31515">"form-table"</font>&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;tbody&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;tr valign=<font color="#A31515">"top"</font>&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;th scope=<font color="#A31515">"row"</font>&#62;Выберите категории, которые нужно исключить&#60;/th&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;td&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;fieldset&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;legend <font color="#0000ff">class</font>=<font color="#A31515">"screen-reader-text"</font>&#62;&#60;span&#62;Выберите категории, которые нужно исключить&#60;/span&#62;&#60;/legend&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;?php</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//читаем значение текущее опции</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$curCL = get_option(<font color="#A31515">'cats_list'</font>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">foreach</font> ($categories <font color="#0000ff">as</font> $category) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<font color="#0000ff">checked</font> = <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (is_array($curCL) &#38;&#38; in_array($category-&#62;cat_ID, $curCL)) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<font color="#0000ff">checked</font> = <font color="#A31515">'checked="checked"'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo <font color="#A31515">'&#60;label&#62;&#60;input '</font>.$<font color="#0000ff">checked</font>.<font color="#A31515">' type="checkbox" name="cats_list[]" value="'</font>.$category-&#62;cat_ID.<font color="#A31515">'" /&#62; '</font>.$category-&#62;name.<font color="#A31515">'&#60;/label&#62;&#60;br /&#62;'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/fieldset&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/td&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/tr&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;tr valign=<font color="#A31515">"top"</font>&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;th scope=<font color="#A31515">"row"</font>&#62;Не выводить выбранные категории&#60;/th&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;td&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;fieldset&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;legend <font color="#0000ff">class</font>=<font color="#A31515">"screen-reader-text"</font>&#62;&#60;span&#62;Не выводить выбранные категории&#60;/span&#62;&#60;/legend&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;?php</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$curCH = get_option(<font color="#A31515">'cats_home'</font>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cH = $cF = <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (is_array($curCH)) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cH = in_array(<font color="#A31515">'home'</font>, $curCH) ? <font color="#A31515">'checked="checked"'</font> : <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cF = in_array(<font color="#A31515">'feed'</font>, $curCH) ? <font color="#A31515">'checked="checked"'</font> : <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;label&#62;&#60;input type=<font color="#A31515">"checkbox"</font> &#60;?php echo $cH; ?&#62; name=<font color="#A31515">"cats_home[]"</font> <font color="#0000ff">value</font>=<font color="#A31515">"home"</font> /&#62; на главной&#60;/label&#62;&#60;br /&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;label&#62;&#60;input type=<font color="#A31515">"checkbox"</font> &#60;?php echo $cF; ?&#62; name=<font color="#A31515">"cats_home[]"</font> <font color="#0000ff">value</font>=<font color="#A31515">"feed"</font> /&#62; в <acronym title="Really Simple Syndication">RSS</acronym> ленте&#60;/label&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/fieldset&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/td&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/tr&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/tbody&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&#60;/table&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&#60;p <font color="#0000ff">class</font>=<font color="#A31515">"submit"</font>&#62;&#60;input type=<font color="#A31515">"submit"</font> <font color="#0000ff">class</font>=<font color="#A31515">"button-primary"</font> <font color="#0000ff">value</font>=<font color="#A31515">"Сохранить"</font> /&#62;&#60;/p&#62;</li>
<li>&nbsp;&nbsp;&#60;/form&#62;</li>
<li>&#60;/div&#62;</li>
<li>&nbsp;</li>
<li>&#60;?php</li>
<li>}</li>
<li>?&#62;</li>
<p></font></ol>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Получилась она довольно объёмной, но в основном из-за разметки. Кода совсем немного.</p>
<p>С <strong>разметкой формы</strong> ситуация следующая. По большому счёту, она может быть любой. Но, если вы хотите, чтобы ваша страница с настройками выглядела так же, как и остальная часть админки, то, нужно просто копировать их разметку со страниц с похожими формами. Что я и сделал.</p>
<p>Перед отображением формы мы получаем список всех постов с помощью функции <code>get_categories</code>. Внутри формы создаём группу чекбоксов для них. Атрибут <code>name</code> у этой группы имеет значение <code>cats_list[]</code>.</p>
<p>Вторая группа чекбоксов позволяет указать, откуда нужно исключить записи. У неё атрибут <code>name</code> равен <code>cats_home[]</code>.</p>
<p>Теперь обратите внимание на функцию <code>settings_fields('ec-settings-group')</code>, которую мы вызываем сразу после открытия формы. Она создаёт несколько скрытых полей, с помощью которых автоматически выполняется сохранение данных, введённых в форму.</p>
<p>Но для того, чтобы эта возможность заработала необходимо зарегистрировать оба наших набора чекбоксов.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> register_ec_settings<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; register_setting<span class="br0">&#40;</span> <span class="st0">&#039;ec-settings-group&#039;</span>, <span class="st0">&#039;cats_list&#039;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; register_setting<span class="br0">&#40;</span> <span class="st0">&#039;ec-settings-group&#039;</span>, <span class="st0">&#039;cats_home&#039;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>В первом параметре функции <code>register_setting</code> передаём имя группы (оно должно совпадать с параметром, переданным <code>settings_fields</code>). Во втором параметре указываем атрибут name группы чекбоксов.</p>
<p>Теперь, при сохранении формы данные автоматически будут записаны в таблицу <code>wp_options</code> (при этом выполняется их сериализация).</p>
<p>Получить сохранённые данные можно с помощью функции <code>settings_fields</code>. Что мы и делаем перед формированием списка чекбоксов в форме. Проверку, есть ли текущая категория среди выбранных ранее, выполняем с помощью функции <code>is_array</code>.</p>
<p><strong>Добавляем новый пункт в меню Settings</strong></p>
<blockquote style="white-space: nowrap; overflow:auto; margin: 10px 0 10px 0; border: dotted 1px #aeaeae; background-color: #f0f0f0;"><p><code><font size="2" face="Courier New" color="black">
<ol>
<li><font color="#008000">//создаём подменю Settings-&#62;Exclude Category Plugin и соответствующую форму</font></li>
<li>&nbsp;</li>
<li><font color="#008000">//регистрируем функцию создания меню</font></li>
<li>add_action(<font color="#A31515">'admin_menu'</font>, <font color="#A31515">'ec_create_menu'</font>);</li>
<li>&nbsp;</li>
<li><font color="#008000">//функция создания меню</font></li>
<li>function ec_create_menu() {</li>
<li>&nbsp;&nbsp;add_submenu_page(<font color="#A31515">'options-general.php'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,<font color="#A31515">'Exclude Category Plugin Settings'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , <font color="#A31515">'Exclude Category'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , <font color="#A31515">'edit_plugins'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , __FILE__</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , <font color="#A31515">'ec_settings_page'</font>);</li>
<li>&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;<font color="#008000">//Регистрируем функцию register_ec_settings. Она нужна для автоматической</font></li>
<li>&nbsp;&nbsp;<font color="#008000">//обработки формы с настройками</font></li>
<li>&nbsp;&nbsp;add_action( <font color="#A31515">'admin_init'</font>, <font color="#A31515">'register_ec_settings'</font> );</li>
<li>}</li>
<p></font></ol>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Сам пункт создаётся с помощью функции <code>add_submenu_page</code>, в параметрах которой необходимо указать различные настройки. Перечислять их все я не буду, лучше дам ссылку на статью с <a href="http://codex.wordpress.org/Adding_Administration_Menus">подробным описанием</a>. Но, обратите внимание, что в последнем параметре указано имя функции, создающей форму.</p>
<p>Для того, чтобы <acronym title="WordPress">WP</acronym> создал меню, нужно добавить действие (<code>add_action</code>). В её первом параметре мы указываем название действия в котором мы хотим выполнить наш код (в данном случае это <code>admin_menu</code>), во втором параметре – имя функции, которую нужно выполнить, именно в ней должен быть вызов <code>add_submenu_page</code>. Кроме того, в этой функции мы добавляем еще одно действие &#8211; <code>admin_init</code>, и в нём регистрируем обработчик <code>register_ec_settings</code>.</p>
<p>На данном этапе у нас есть рабочая форма в админке с двумя наборами чекбоксов. Все отмеченные чекбоксы сохраняются в базе данных (таблица wp_options) и доступ к ним можно получить с помощью get_option(&#039;cats_home&#039;) и get_option(&#039;cats_list&#039;).</p>
<p><strong>Рассмотрим принцип удаления постов.</strong></p>
<p>Список постов движок <acronym title="WordPress">WP</acronym> получает из базы данных с помощью обычного запроса. Т.е. нам нужно добавить к этому запросу условия, которые исключат ненужные нам категории.</p>
<p>Для этого, нам нужно создать фильтр, который выполнит наш код до отправки запроса движком. Делается это следующим образом.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">add_filter<span class="br0">&#40;</span><span class="st0">&#039;pre_get_posts&#039;</span>,<span class="st0">&#039;ec_exclude&#039;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Событие <code>pre_get_posts</code> возникает как раз перед отправкой запроса, а <code>ec_exclude</code> – название нашей функции, причем в первом её параметре <acronym title="WordPress">WP</acronym> передаст объект с запросом. Рассмотрим её подробнее.</p>
<blockquote style="white-space: nowrap; overflow:auto; margin: 10px 0 10px 0; border: dotted 1px #aeaeae; background-color: #f0f0f0;"><p><code><font size="2" face="Courier New" color="black">
<ol>
<li>function ec_exclude($query) {</li>
<li>&nbsp;&nbsp;<font color="#008000">//читаем массивы с опциями</font></li>
<li>&nbsp;&nbsp;<font color="#0000ff">if</font> (is_array($target = get_option(<font color="#A31515">'cats_home'</font>))) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (is_array($categories = get_option(<font color="#A31515">'cats_list'</font>))) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//добавляем к id категорий знак "-"</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">foreach</font> ($categories <font color="#0000ff">as</font> $i =&#62; $category) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$categories[$i] = <font color="#A31515">'-'</font>.$categories[$i];</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//формируем строку с перечнем категорий</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cat_string = implode(<font color="#A31515">','</font>, $categories);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//удаляем посты указанных категорий из <acronym title="Really Simple Syndication">RSS</acronym> ленты</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (in_array(<font color="#A31515">'feed'</font>, $target) &#38;&#38; $query-&#62;is_feed) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query-&#62;<font color="#0000ff">set</font>(<font color="#A31515">'cat'</font>,$cat_string);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//удаляем посты указанных категорий с главной страницы</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (in_array(<font color="#A31515">'home'</font>, $target) &#38;&#38; $query-&#62;is_home) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query-&#62;<font color="#0000ff">set</font>(<font color="#A31515">'cat'</font>,$cat_string);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;<font color="#0000ff">return</font> $query;</li>
<li>}</li>
<p></font></ol>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Исключить ненужные категории можно с помощью метода <code>set</code>.<br />
Например:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$query</span>-&gt;<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#039;cat&#039;</span>, <span class="st0">&#039;-1,-2,-5&#039;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Здесь 1, 2, 5 – id категорий в БД, знак минус означает, что категории нужно исключить.</p>
<p>В самой функции <code>ec_exclude</code> мы проверяем, указаны ли страницы, с которых нужно убрать посты и список ненужных категорий (с помощью <code>get_option('cats_home')</code> и <code>get_option('cats_list')</code>).</p>
<p>Если эти опции установлены, то формируем строку с id категорий <code>$cat_string</code> и передаём её методу <code>set</code>. При этом с <code>$query->is_home</code> и помощью <code>$query->is_feed</code> проверяем, какая страница в данный момент формируется.</p>
<p>Не зависимо от того, вносили мы изменения в запрос или нет, функция <code>ec_exclude</code> обязательно должна вернуть объект <code>$query</code>, иначе сформировать страницу не получится.</p>
<p>Как видите, логика работы плагина довольно простая, но добавление страниц в админку немного запутанное. С другой стороны, есть много достаточно хорошей документации и примеров, и, в большинстве случаев, их можно легко адаптировать для своих целей.</p>
<p>Все замечания, вопросы и предложения пишите в комментариях. Постараюсь ответить <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1053&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/plagin-wordpress-isklyuchaem-nenuzhnye-kategorii.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>29 плагинов для WordPress, которые я использую</title>
		<link>http://www.simplecoding.org/29-plaginov-dlja-wordpress-kotorie-ja-icpolzuju.html</link>
		<comments>http://www.simplecoding.org/29-plaginov-dlja-wordpress-kotorie-ja-icpolzuju.html#comments</comments>
		<pubDate>Mon, 28 Dec 2009 18:50:53 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=958</guid>
		<description><![CDATA[Начал писать этот пост и сразу понял, что мне сложно даже примерно вспомнить сколько хорошего и плохого я читал о движке WordPress.
Причем все отзывы (и положительные, и отрицательны) вполне обоснованы и я с ними не собираюсь спорить, тем более, что от этого ничего не измениться   На сегодняшний день WordPress остается наиболее популярной платформой [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_959" class="wp-caption alignnone" style="width: 275px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/12/29_wordpress_plugins.png" alt="29 wordpress plugins" title="29 wordpress plugins" width="265" height="185" style="float:left" class="size-full wp-image-959" /><p class="wp-caption-text"> </p></div>
<p>Начал писать этот пост и сразу понял, что мне сложно даже примерно вспомнить сколько хорошего и плохого я читал о движке <a href="http://wordpress.org/">WordPress</a>.</p>
<p>Причем все отзывы (и положительные, и отрицательны) вполне обоснованы и я с ними не собираюсь спорить, тем более, что от этого ничего не измениться <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  На сегодняшний день <strong>WordPress</strong> остается наиболее популярной платформой для блоггинга.</p>
<p>И, на мой взгляд, причин этот популярности две.</p>
<p>1) <strong>Постоянная работа разработчиков над движком</strong>. Конечно, не все нововведения мне нравятся (например, ревизии), но вцелом <acronym title="WordPress">WP</acronym> развивается в правильном направлении.</p>
<p>2) <strong>Огромное количество сторонних плагинов</strong>. С одной стороны, это большой плюс, т.к. вы можете получить нужный функционал не написав ни строчки кода. Но с другой стороны, возникают неизбежные проблемы.</p>
<p>Т.к. плагины может писать кто угодно, никаких гарантий качества вы не получите. Кроме того, за последние несколько лет накопилось множество заброшенных плагинов, т.е. авторы их больше не поддерживают и не тестируют на совместимость с новыми версиями движка.</p>
<p>В результате <strong>на поиски уходит приличное количество времени</strong>. Хотя, это все-равно быстрее чем разработка и тестирование своего плагина.</p>
<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_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>Примечание</em>. Раньше я публиковал подобный список <a href="http://www.simplecoding.org/17-plaginov-dlya-wordpress-kotorye-u-menya-aktivirovany.html">17 Wordpress плагинов, которые у меня активированы</a>, но с тех пор прошел почти год и за это время многое изменилось. Какие-то плагины стали не нужны (их функционал появился в движке), какие-то я заменил.</p>
<p>Итак, <strong>новый список</strong>.<br />
<span id="more-958"></span><br />
1) <a href="http://wordpress.org/extend/plugins/acronyms/">Acronyms</a>. Находит аббревиатуры и заключает их в теги <code>acronym</code>. Сразу после установки появляется довольно большой список аббревиатур, который можно изменять и дополнять.</p>
<p>2) <a href="http://akismet.com/">Akismet</a>. Одно из основных средств борьбы со спамом. Точность не идеальная, но вполне приемлимая. Например, я трачу не более 5 мин в день на просмотр списка спамерских комментариев.</p>
<p>3) <a href="http://semperfiwebdesign.com/">All in One SEO Pack</a>. Очень полезный для SEO&#039;шных целей плагин. Позволяет создавать индивидуальные для каждого поста теги title, description, keywords, а также содержит множество других настроек.</p>
<p>4) <a href="http://maxsite.org/anti-xss-attack">Anti-XSS attack</a>. Защита/предупреждение XSS-атак (в модификации Макса/maxsite.org). На практике вам потребуется кликнуть по дополнительной ссылке при входе в админку.</p>
<p>5) <a href="http://www.dagondesign.com/articles/sitemap-generator-plugin-for-wordpress/">Dagon Design Sitemap Generator</a>. Создает карту сайта. Плагин отличается большим количеством настроек. Вы можете указать какие страницы должны быть включены в карту, каким образом они должны быть отсортированы, нужно ли разбивать карту на страницы и т.д.</p>
<p>6) <a href="http://www.deanlee.cn/wordpress/code_highlighter_plugin_for_wordpress/">Dean&#039;s Code Highlighter</a>. Выполняет подсветку блоков кода. К этому плагину у меня есть претензии и возможно в будущем я его заменю. Дело в том, что при вставке больших блоков кода возникает какая-то ошибка и текст поста вообще не отображается. Правда, справедливости ради, хочу отметить, что такие блоки читаются очень плохо, поэтому в текст поста я стараюсь вставлять только фрагменты, а исходники целиком выкладывать в архиве.</p>
<p>7) <a href="http://blog.ticktag.org/2009/02/19/2765/">Faster Image Insert</a>. Немного упрощает загрузку и вставку картинов в текст поста. Используются стандартные инструменты <acronym title="WordPress">WP</acronym>, но этот плагин размещает их в блоке под редактором поста, а не в отдельном окне.</p>
<p>8 ) <a href="http://www.google.com/support/feedburner/bin/answer.py?hl=en&#038;answer=78483">FeedBurner FeedSmith</a>. Имеет смысл если вы публикуете <acronym title="Really Simple Syndication">RSS</acronym> ленту через FeedBurner.</p>
<p>9) <del datetime="2009-12-29T15:30:37+00:00"><a href="http://cavemonkey50.com/code/full-feed/">Full Text Feed</a>. Отправляет в <acronym title="Really Simple Syndication">RSS</acronym> ленту полный текст постов, независимо от наличия тега <code>&lt;!--more--&gt;</code>.</del> (можно указать в настройках движка, Settings &#8211; Writing).</p>
<p>10) <a href="http://www.arnebrachhold.de/redir/sitemap-home/">Google <acronym title="eXtensible Markup Language">XML</acronym> Sitemaps</a>. Создает <acronym title="eXtensible Markup Language">XML</acronym> версию карты сайта, которую понимают поисковые роботы Google и Яндекса. Полезно для SEO.</p>
<p>11) <a href="http://aboutme.lmbbox.com/lmbbox-plugins/lmbbox-comment-quicktags/">LMB^Box Comment Quicktags</a>. Добавляет несколько кнопок для форматирования комментариев. Вообще существует довольно много подобных плагинов, выбирайте исходя из необходимого функционала.</p>
<p>12) <a href="http://www.bad-neighborhood.com/">Login LockDown</a>. Ограничивает количество некорректных попыток ввода имени и пароля в форму входа в <acronym title="WordPress">WP</acronym> (защита от брутфорса).</p>
<p>13) <a href="http://www.maxblogpress.com/plugins/mpo/">MaxBlogPress Ping Optimizer</a>. Уменьшает количество пингов, которые отправляет движок при публикации новых материалов. По-умолчанию, пинги отправляются каждый раз когда вы обновляете пост, но такое поведение может быть расценено как спам, особенно если вносите незначительные изменения в текст.</p>
<p>14) <a href="http://maxsite.org/">MaxSite-социальные закладки</a>. Еще один плагин Максима. Создает небольшую панель с кнопками добавления ссылок на пост в сервисы социальных закладок.</p>
<p>15) <a href="http://maxsite.org/">MaxSite Russian Date</a>. Изменяет отображение дат в соответствии с правилами русского языка.</p>
<p>16) <a href="http://www.geekyweekly.com/mycategoryorder">My Category Order</a>. Позволяет устанавливать свой порядок отображения категорий. Плагин удобный и полезный, но будьте внимательны при обновлении <acronym title="WordPress">WP</acronym>. Иногда требуется изменить права доступа к файлу <code>wp-includes/taxonomy.php</code>.</p>
<p>17) <a href="http://blogwaffe.com/2006/10/04/421/">No Self Pings</a>. Блокирует отправку пингов на свои же посты.</p>
<p>18 ) <a href="http://alexking.org/projects/wordpress">Popularity Contest</a>. Плагин выполняет оценку популярности постов по множеству параметров и позволяет создавать список самых популярных. Причём вы можете изменять вес различных параметров. В общем, очень удобно.</p>
<p>19) <a href="http://bueltge.de/wordpress-version-verschleiern-plugin/602/">Replace <acronym title="WordPress">WP</acronym>-Version</a>. Удаляет версию WordPress из заголовка страницы. Рекомендуется использовать в целях безопасности.</p>
<p>20) <a href="http://mywordpress.ru/plugins/rustolat/">RusToLat</a>. Выполняет транслитерацию русских символов в латинские. Удобно если используются ЧПУ.</p>
<p>21) <a href="http://www.pfadvice.com/wordpress-plugins/show-top-commentators/">Show Top Commentators</a>. Создает список наиболее активных комментаторов.</p>
<p>22) Source &#038; Demo Links. Это моя собственная поделка <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Предназначена для вставки кнопок &#034;Демо&#034; и &#034;Скачать&#034;. В паблик не выкладываю, но если кому-то интересно, расскажу как работает.</p>
<p>23) <a href="http://txfx.net/code/wordpress/subscribe-to-comments/">Subscribe To Comments</a>. Добавляет возможность подписываться на комментарии и получать их на email. Мне очень не нравится, если автор блога не обеспечивает эту возможность. Обсуждать что-то в комментариях становится намного сложнее, т.к. можно просто забыть об этом обсуждении <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>24) <a href="http://www.semiologic.com/software/unfancy-quote/">Unfancy Quote</a>. Отключает автоматическую замену кавычек движком <acronym title="WordPress">WP</acronym>. Полезно если вы публикуете блоки кода.</p>
<p>25) <a href="http://www.ilfilosofo.com/blog/wp-db-backup">WordPress Database Backup</a>. Создает backup базы данных. Есть возможность настраивать периодичность создания бекапа, включать в него дополнительные таблицы, отправлять на email. В общем, очень полезная вещь.</p>
<p>26) <a href="http://ocaoimh.ie/exploit-scanner/">WordPress Exploit Scanner</a>. Этот плагин выполняет поиск уязвимостей. Постоянно держать активированным не обязательно, можно проверить и отключить. Но результаты выводятся с кучей технических подробностей и если вы не занимаетесь web разработкой, проанализировать их будет довольно сложно.</p>
<p>27) <a href="http://lesterchan.net/portfolio/programming/php/"><acronym title="WordPress">WP</acronym>-Polls</a>. Позволяет создавать опросы. Плагин очень удобный, есть множество настроек, например, возможность позволять посетителям добавлять свои варианты ответов, ограничивать время действия опроса, создавать страницы с перечнем опросов и т.п.</p>
<p>28) <a href="http://semperfiwebdesign.com/plugins/wp-security-scan/"><acronym title="WordPress">WP</acronym> Security Scan</a>. Ещё один плагин для проверки безопасности <acronym title="WordPress">WP</acronym>. В основном выдает рекомендации по улучшению безопасности движка.</p>
<p>29) <a href="http://neothoughts.com/wp-sup/"><acronym title="WordPress">WP</acronym> SUP</a>. Если вы используете сервис FriendFeed, то этот плагин обеспечит автоматическую публикацию ваших постов.</p>
<p>На этом я список заканчиваю. Были и другие плагины, но от них я отказался по разным причинам.</p>
<p>Я буду рад ответить на любые вопросы, касающиеся перечисленных плагинов.</p>
<p>До встречи!</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=958&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/29-plaginov-dlja-wordpress-kotorie-ja-icpolzuju.html/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>WordPress: создаем виджет для показа картинок с Flickr</title>
		<link>http://www.simplecoding.org/wordpress-sozdaem-vidzhet-dlya-pokaza-kartinok-s-flickr.html</link>
		<comments>http://www.simplecoding.org/wordpress-sozdaem-vidzhet-dlya-pokaza-kartinok-s-flickr.html#comments</comments>
		<pubDate>Sat, 12 Dec 2009 19:11:53 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=953</guid>
		<description><![CDATA[Сегодня я расскажу о создании виджета для одной из самых популярных на сегодняшний день CMS – WordPress.
По большому счету, виджеты – это обычные плагины. Но они имеют несколько особенностей и предназначены в основном для отображения небольших блоков информации, чаще всего в сайдбаре.
С точки зрения пользователя, виджеты удобны тем, что их можно добавлять в сайдбар прямо [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_954" class="wp-caption alignnone" style="width: 247px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/12/wordpress_flickr_widget.png" alt="wordpress flickr widget" title="wordpress flickr widget" width="237" height="157" style="float:left" class="size-full wp-image-954" /><p class="wp-caption-text"> </p></div>
<p>Сегодня я расскажу о <strong>создании виджета</strong> для одной из самых популярных на сегодняшний день <acronym title="Content Management System">CMS</acronym> – <strong>WordPress</strong>.</p>
<p>По большому счету, виджеты – это обычные плагины. Но они имеют несколько особенностей и предназначены в основном для отображения небольших блоков информации, чаще всего в сайдбаре.</p>
<p>С точки зрения пользователя, виджеты удобны тем, что <strong>их можно добавлять в сайдбар прямо из админки <acronym title="WordPress">WP</acronym>, не изменяя код темы</strong>.</p>
<p>Кроме того, для каждого виджета создается панель с настройками. Таким образом, все настройки сгруппированы в одном месте, что очень удобно.</p>
<p>Единственное условие – тема должна быть «widget ready», т.е. поддерживать виджеты. Но добавить эту поддержку несложно. Подробная инструкция находится <a href="http://automattic.com/code/widgets/themes/">здесь</a>. Чтобы не усложнять пример, я буду считать, что используется дефолтная тема.</p>
<p><strong>Сформулируем задачу.</strong></p>
<p>Допустим, нам нужен виджет, который будет находить по заданным тегам на сервесе flickr картинки и показывать их. При этом администратор должен иметь возможность задать теги, количество картинок и их размер.<br />
<span id="more-953"></span><br />
Сразу приведу ссылку на архив с плагином</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2009/12/flickr_widget.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><em>Примечание</em>. Я знаю, что для WordPress существуют готовые плагины для работы с flickr, причем с гораздо большим количеством функций, но это демонстрационный пример, и я хочу просто показать общий принцип.</p>
<p><strong>Условно создание виджета можно разбить на 3 этапа.</strong></p>
<p>1) Регистрация виджета.</p>
<p>2) Создание панели управления.</p>
<p>3) Создание самого виджета.</p>
<p>Рассмотрим их подробнее.</p>
<p>Наш виджет достаточно простой, поэтому он будет состоять всего из одного файла <code>flickr-widget.php</code>, который мы разместим в папке <code>wp-content/plugins/flickr_widget</code>. Учтите, что имя файла виджета должно совпадать с названием папки, иначе WordPress не сможет его найти.</p>
<p>В начале файла размещаем комментарий.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Plugin Name: Flickr Widget</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Plugin URI: http://localhost</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Description: Этот виджет ищет по заданным тегам фотографии на сервисе flickr и показывает их.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">Version: 1.0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Author: Statsenko Vladimir</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">Author URI: http://www.simplecoding.org</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
</ol>
</div>
<p>Как видите, это обычный комментарий плагина <acronym title="WordPress">WP</acronym>. Заполнять все перечисленные поля очень желательно, т.к. WordPress их использует для создания описаний на странице управления плагинами.</p>
<p>На данном этапе мы получили обычный плагин <acronym title="WordPress">WP</acronym>, который можно активировать и деактивировать, правда, он ничего не умеет делать.</p>
<p>Но, прежде чем переходить к написанию функционала, <strong>разберемся с сервисом Flickr</strong>. Я его выбрал главным образом потому, что он предоставляет удобный <acronym title="Application Programming Interface">API</acronym>, из которого нам потребуется всего одна функция <a href="http://www.flickr.com/services/api/flickr.photos.search.html">flickr.photos.search</a>.</p>
<p>Как несложно догадаться из названия, она используется для поиска фотографий. Правда перед использованием Flickr <acronym title="Application Programming Interface">API</acronym> нужно <strong>зарегистрировать свое приложение на этом сервисе и получить для него уникальный ключ</strong> (Application Key), но эта операция бесплатная и сложности не представляет.</p>
<p>Запрос на Flickr можно отправить несколькими способами, кстати, существуют готовые <a href="http://www.flickr.com/services/api/">библиотеки для различных языков</a>. Но этот пример очень простой, поэтому мы просто отправим <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> запрос (библиотека для работы с <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> есть в дистрибутиве <acronym title="WordPress">WP</acronym>).</p>
<p>По описанию функции на официальном сайте я составил <strong>минимальный перечень параметров</strong>, которые мы должны передать в <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> запросе.</p>
<p>1) <code>api_key</code> – ключ нашего приложения;<br />
2) <code>tags</code> – список тегов через запятую;<br />
3) <code>per_page</code> – количество фотографий.</p>
<p>В ответ мы получим <acronym title="eXtensible Markup Language">XML</acronym> строку с данными найденных фотографий, используя которые можно будет сформировать разметку виджета.</p>
<p><strong>Возвращаемся к нашему виджету.</strong></p>
<p>Определимся с методом хранения настроек виджета. На мой взгляд, тут удобнее всего использовать <strong>опции WordPress</strong>. Они предназначены для хранения небольших фрагментов данных в формате «ключ – значение» и WordPress содержит все необходимые функции для работы с ними. Причем, мы можем записать данные в ассоциативный массив и хранить его в одной опции, <acronym title="WordPress">WP</acronym> его автоматически сериализует.</p>
<p><strong>Следующий шаг &#8211; инициализация виджета.</strong></p>
<p>Выполняется с помощью одной строчки кода.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">add_action<span class="br0">&#40;</span><span class="st0">&quot;widgets_init&quot;</span>, <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#039;Flickr_Widget&#039;</span>, <span class="st0">&#039;register&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p><em>Обратите внимание</em>, что во втором параметре мы должны указать либо имя функции, либо имя метода класса, который выполняет инициализацию. Причем, если используется второй способ, то нужно передать массив с двумя элементами: именем класса и именем метода.</p>
<p>На мой взгляд, удобнее использовать второй способ. Т.к. имена функций вашего плагина должны быть уникальными, а при использовании класса достаточно, чтобы только его имя было уникальным.</p>
<p>Сам метод инициализации выглядит следующим образом</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Flickr_Widget <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">…</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> register<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; register_sidebar_widget<span class="br0">&#40;</span><span class="st0">&#039;Flickr Widget&#039;</span>, <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#039;Flickr_Widget&#039;</span>, <span class="st0">&#039;widget&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; register_widget_control<span class="br0">&#40;</span><span class="st0">&#039;Flickr Widget&#039;</span>, <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#039;Flickr_Widget&#039;</span>, <span class="st0">&#039;control&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">…</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Как видите, в этом методе мы регистрируем виджет и его панель управления. Проще говоря, рассказываем WordPress какие методы формируют виджет и панель управления.</p>
<p>Кроме того, нам нужно назначить два хука (для активации и деактивации виджета).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">register_activation_hook<span class="br0">&#40;</span> <span class="kw2">__FILE__</span>, <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#039;Flickr_Widget&#039;</span>, <span class="st0">&#039;activate&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">register_deactivation_hook<span class="br0">&#40;</span> <span class="kw2">__FILE__</span>, <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#039;Flickr_Widget&#039;</span>, <span class="st0">&#039;deactivate&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Здесь, также как и при инициализации, мы просто указываем имена соответствующих методов.</p>
<p>Рассмотрим, как они работают.</p>
<blockquote style="white-space: nowrap; overflow:auto; margin: 10px 0 10px 0; border: dotted 1px #aeaeae; background-color: #f0f0f0;"><p><code><font size="2" face="Courier New" color="black">
<ol>
<li><font color="#0000ff">class</font> Flickr_Widget {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">private</font> <font color="#0000ff">static</font> $APP_NAME = <font color="#A31515">'Flickr_Widget'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">private</font> <font color="#0000ff">static</font> $APP_KEY = <font color="#A31515">'17e73e544f0f6fff4d06822668e76e01'</font>;</li>
<li>…</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;function activate() {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//устанавливаем начальные значения</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'fw_app_name'</font>] = Flickr_Widget::$APP_NAME;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'fw_app_key'</font>] = Flickr_Widget::$APP_KEY;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'wf_images'</font>] = <font color="#A31515">'2'</font>; <font color="#008000">//две картинки</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'fw_size'</font>] = <font color="#A31515">'2'</font>; <font color="#008000">//размер не более 100px по большей стороне</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'wf_tags'</font>] = <font color="#A31515">'nature, природа'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//и создаем опцию</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_option(<font color="#A31515">'fw_data'</font>, $data);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;function deactivate() {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//удаляем опцию</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete_option(<font color="#A31515">'fw_data'</font>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>}</li>
<p></font></ol>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>При активации виджета мы формируем массив с настройками по-умолчанию и сохраняем его в опции <code>fw_data</code> (с помощью метода <code>add_option</code>).</p>
<p>Обратите внимание на использовании атрибутов класса (<code>$APP_NAME</code> и <code>$APP_KEY</code>). При вызове методов WordPress не создает экземпляр класса, поэтому для обращения к свойствам нужно указывать имя класса.</p>
<p>При деактивации виджета мы удаляем опцию. Все настройки при этом будут удалены.</p>
<p><strong>Теперь напишем метод создания панели управления виджетом.</strong></p>
<blockquote style="white-space: nowrap; overflow:auto; margin: 10px 0 10px 0; border: dotted 1px #aeaeae; background-color: #f0f0f0;"><p><code><font size="2" face="Courier New" color="black">
<ol>
<li><font color="#0000ff">class</font> Flickr_Widget {</li>
<li>…</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">private</font> <font color="#0000ff">static</font> $IMG_SIZES = array(</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#A31515">'1'</font>=&#62;array(<font color="#A31515">'s'</font>,<font color="#A31515">'75 x 75 px'</font>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, <font color="#A31515">'2'</font>=&#62;array(<font color="#A31515">'t'</font>,<font color="#A31515">'max 100 px'</font>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, <font color="#A31515">'3'</font>=&#62;array(<font color="#A31515">'m'</font>,<font color="#A31515">'max 240 px'</font>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, <font color="#A31515">'4'</font>=&#62;array(<font color="#A31515">''</font>,<font color="#A31515">'max 500 px'</font>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</li>
<li>…</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;function control() {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//если пришли данные в массиве $_POST, обновляем опцию</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (isset($_POST[<font color="#A31515">'wf_images'</font>])){</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'fw_app_name'</font>] = Flickr_Widget::$APP_NAME;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'fw_app_key'</font>] = Flickr_Widget::$APP_KEY;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'wf_images'</font>] = esc_attr($_POST[<font color="#A31515">'wf_images'</font>]);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'fw_size'</font>] = esc_attr($_POST[<font color="#A31515">'fw_size'</font>]);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'wf_tags'</font>] = esc_attr($_POST[<font color="#A31515">'wf_tags'</font>]);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_option(<font color="#A31515">'fw_data'</font>, $data);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//читаем данные, сохраненные в опции</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = get_option(<font color="#A31515">'fw_data'</font>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> ( FALSE === $data ) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//заполняем массив $data значениями по-умолчанию</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = array();</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'wf_images'</font>] = <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'fw_size'</font>] = <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[<font color="#A31515">'wf_tags'</font>] = <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//создаем поля формы, которая будет показана в панели управления</font></li>
<li>?&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;p&#62;&#60;label&#62;Количество картинок &#60;input name=<font color="#A31515">"wf_images"</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#A31515">"text"</font> <font color="#0000ff">value</font>=<font color="#A31515">"&#60;?php echo $data['wf_images']; ?&#62;"</font> /&#62;&#60;/label&#62;&#60;/p&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;p&#62;&#60;label&#62;Размер картинок &#60;<font color="#0000ff">select</font> size=<font color="#A31515">"1"</font> name=<font color="#A31515">"fw_size"</font>&#62;</li>
<li>&#60;?php</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">foreach</font> ( Flickr_Widget::$IMG_SIZES <font color="#0000ff">as</font> $i =&#62; $size ) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$selected = <font color="#A31515">''</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> ( $i == $data[<font color="#A31515">'fw_size'</font>] ) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$selected = <font color="#A31515">'selected="selected"'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>?&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;option <font color="#0000ff">value</font>=<font color="#A31515">"&#60;?php echo $i; ?&#62;"</font> &#60;?php echo $selected; ?&#62;&#62;&#60;?php echo $size[<font color="#A31515">'1'</font>]; ?&#62;&#60;/option&#62;</li>
<li>&#60;?php</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>?&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;/<font color="#0000ff">select</font>&#62;&#60;/label&#62;&#60;/p&#62;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#60;p&#62;&#60;label&#62;Теги (через запятую) &#60;input name=<font color="#A31515">"wf_tags"</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#A31515">"text"</font> <font color="#0000ff">value</font>=<font color="#A31515">"&#60;?php echo $data['wf_tags']; ?&#62;"</font> /&#62;&#60;/label&#62;&#60;/p&#62;</li>
<li>&#60;?php</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>…</li>
<li>}</li>
<p></font></ol>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>В начале этого метода мы проверяем, не пришли ли данные, которые мы должны сохранить. Если в массиве <code>$_POST</code> есть поля, которые относятся к нашему виджету, то мы записываем их в массив и сохраняем в опции.</p>
<p>После этого мы создаем форму и заполняем её значениями из опции. Точнее часть формы создает движок. Нам нужно только добавить поля ввода.</p>
<p>Их у нас три.<br />
1) Поле «Количество картинок».<br />
2) Выпадающий список с размерами картинок.<br />
3) Поле для ввода тегов.</p>
<p><em>Примечание</em>. При загрузке пользователем фотографий, Flickr создает несколько превьюшек разных размеров. Именно эти превьюшки мы и будем показывать в сайдбаре.</p>
<p><strong>Переходим к методу, формирующему сам виджет</strong>.</p>
<blockquote style="white-space: nowrap; overflow:auto; margin: 10px 0 10px 0; border: dotted 1px #aeaeae; background-color: #f0f0f0;"><p><code><font size="2" face="Courier New" color="black">
<ol>
<li><font color="#0000ff">class</font> Flickr_Widget {</li>
<li>…</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public</font> function widget($args) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $args[<font color="#A31515">'before_widget'</font>];</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//показываем заголовок виджета</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $args[<font color="#A31515">'before_title'</font>] . <font color="#A31515">'Images from Flickr'</font> . $args[<font color="#A31515">'after_title'</font>];</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//читаем массив с опциями</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> ( $data = get_option(<font color="#A31515">'fw_data'</font>) ) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//подключаем библиотеку для работы с <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> </font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include_once (<font color="#A31515">'wp-includes/class-IXR.php'</font>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$client = <font color="#0000ff">new</font> IXR_Client(Flickr_Widget::$flickr_url);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<font color="#0000ff">params</font> = array(<font color="#A31515">'api_key'</font>=&#62;$data[<font color="#A31515">'fw_app_key'</font>]</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,<font color="#A31515">'tags'</font>=&#62;$data[<font color="#A31515">'wf_tags'</font>]</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,<font color="#A31515">'per_page'</font>=&#62;$data[<font color="#A31515">'wf_images'</font>]</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> ( !$client-&#62;query(<font color="#A31515">'flickr.photos.search'</font>, $<font color="#0000ff">params</font>) ) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo <font color="#A31515">'Error: '</font>.$client-&#62;getErrorCode().<font color="#A31515">':'</font>.$client-&#62;getErrorMessage();</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">else</font> {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$photos = $client-&#62;getResponse();</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xml = <font color="#0000ff">new</font> SimpleXMLElement($photos);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">foreach</font> ($xml-&#62;photo <font color="#0000ff">as</font> $photo) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url = <font color="#A31515">'http://farm'</font>.$photo[<font color="#A31515">'farm'</font>]</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<font color="#A31515">'.static.flickr.com/'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.$photo[<font color="#A31515">'server'</font>].<font color="#A31515">'/'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.$photo[<font color="#A31515">'id'</font>].<font color="#A31515">'_'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.$photo[<font color="#A31515">'secret'</font>];</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$oUrl = <font color="#A31515">'http://www.flickr.com/photos/'</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.$photo[<font color="#A31515">'owner'</font>]</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<font color="#A31515">'/'</font>.$photo[<font color="#A31515">'id'</font>];</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (<font color="#A31515">''</font> !== $data[<font color="#A31515">'fw_size'</font>]) {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url .= <font color="#A31515">'_'</font>.Flickr_Widget::$IMG_SIZES[$data[<font color="#A31515">'fw_size'</font>]][0].<font color="#A31515">'.jpg'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">else</font> {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url .= <font color="#A31515">'.jpg'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo <font color="#A31515">'&#60;div class="flickr_image"&#62;&#60;a href="'</font>.$oUrl.<font color="#A31515">'" target="_blank"&#62;&#60;img src="'</font>.$url.<font color="#A31515">'" alt="'</font>.$photo[<font color="#A31515">'title'</font>].<font color="#A31515">'" /&#62;&#60;/a&#62;&#60;/div&#62;'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">else</font> {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo <font color="#A31515">'No settings'</font>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $args[<font color="#A31515">'after_widget'</font>];</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>…</li>
<li>}</li>
<p></font></ol>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Принцип работы следующий.</p>
<p>1) Выводим заголовок виджета.</p>
<p>2) Читаем опцию (с помощью функции <code>get_option</code>). Если опция найдена:</p>
<p>2.1) Загружаем класс для работы с <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym>.</p>
<p>2.2) Формируем и отправляем запрос на Flickr.</p>
<p>2.3) Если ответ получен, формируем ссылки для тегов img. Ответ от Flickr приходит в <acronym title="eXtensible Markup Language">XML</acronym> формате, и для его анализа мы используем библиотеку SimpleXML. Расписывать, как формируются ссылки я не буду, на <a href="http://www.flickr.com/services/api/misc.urls.html">этой</a> странице вы найдете достаточное количество примеров.</p>
<p>2.4) В цикле выводим теги <code>img</code> (я дополнительно вставил их в <code>div</code>’ы).</p>
<p>Вот и все <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Мы получили работающий виджет.</p>
<p>Я не буду утверждать, что работать с виджетами в WordPress одно удовольствие <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Но, с другой стороны, каких-то сверхсложных действий не требуется, и основная часть времени все равно уйдет на написание вашего кода.</p>
<p>К тому же для показа блоков с какой-то информацией в сайдбаре виджеты удобнее, чем обычные плагины, т.к. позволяют обойтись без изменения кода темы, а для обычного пользователя это большой плюс.</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>Даем бесплатные <a href="http://busins.ru/aktualnye_voprosy_po_nalogooblozheniju">консультации по вопросам налогообложения</a>. Заходите!</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=953&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wordpress-sozdaem-vidzhet-dlya-pokaza-kartinok-s-flickr.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Отложенная публикация постов в WordPress с помощью XML-RPC</title>
		<link>http://www.simplecoding.org/otlozhennaya-publikaciya-postov-v-wordpress-s-pomoshhyu-xml-rpc.html</link>
		<comments>http://www.simplecoding.org/otlozhennaya-publikaciya-postov-v-wordpress-s-pomoshhyu-xml-rpc.html#comments</comments>
		<pubDate>Wed, 21 Oct 2009 18:31:15 +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=930</guid>
		<description><![CDATA[Я думаю, многие блоггеры пользуются возможностью отложенной публикации постов в WP. Действительно, функция очень удобная, т.к. позволяет публиковать новые материалы через более-менее равномерные промежутки времени. К тому же для ее использования делать практически ничего не нужно, достаточно просто указать в админке WordPress дату публикации.
Но недавно у меня возникла задача публиковать посты через XML-RPC и, сразу [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_931" class="wp-caption alignnone" style="width: 224px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/10/wordpress-xml-rpc.png" alt="wordpress-xml-rpc" title="wordpress-xml-rpc" width="214" height="107" class="size-full wp-image-931" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Я думаю, многие блоггеры пользуются возможностью <strong>отложенной публикации постов</strong> в <acronym title="WordPress">WP</acronym>. Действительно, функция очень удобная, т.к. позволяет публиковать новые материалы через более-менее равномерные промежутки времени. К тому же для ее использования делать практически ничего не нужно, достаточно просто указать в админке WordPress дату публикации.</p>
<p>Но недавно у меня возникла задача публиковать посты через <strong><acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym></strong> и, сразу же обнаружилось несколько не совсем очевидных нюансов, которые касаются указания даты. О них я и хочу сегодня рассказать.<br />
<span id="more-930"></span><br />
<strong>Для начала немного теории.</strong></p>
<p>WordPress имеет встроенный <strong><acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервер</strong>, который позволяет выполнять практически все операции с постами и страницами (создание/чтение/изменение/удаление).</p>
<p><em>Примечание</em>. По-умолчанию в целях безопасности поддержка <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> отключена. Вы можете включить ее на странице <code>Settings</code> &#8211; <code>Writing</code> &#8211; <code>Enable the WordPress, Movable Type, MetaWeblog and Blogger <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> publishing protocols</code>.</p>
<p>Для публикации поста нужно <strong>сформировать и отправить <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> запрос</strong> со всеми необходимыми данными.</p>
<p>Естественно, формировать его вручную не самое увлекательное занятие. Гораздо удобнее использовать одну из многочисленных библиотек для работы с <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym>.</p>
<p>Для этого примера я решил использовать библиотеку под названием <a href="http://scripts.incutio.com/xmlrpc/">IXR_Library</a>, которую, кстати, использует и движок WordPress.</p>
<p>Только <acronym title="WordPress">WP</acronym> ее использует для создания <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервера, а нам нужен <strong><acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> клиент</strong>.</p>
<p>Нам потребуется выполнить 3 несложных действия.</p>
<p>1)	Создать объект типа <code>IXR_Client</code> (<acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> клиент).</p>
<p>2)	Создать массив с данными.</p>
<p>3)	Опубликовать пост с помощью метода <code>query</code>.</p>
<p>Наибольшие проблемы вызывает второй этап. При формировании массива важно не ошибиться с именами ключей массива и форматом значений, которые в них передаются.</p>
<p>Взгляните на пример кода.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&#039;IXR_Library.inc&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$client</span> = <span class="kw2">new</span> IXR_Client<span class="br0">&#40;</span><span class="st0">&#039;http://myblog.com/xmlrpc.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$requestData</span> = <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$userName</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$userPass</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;title&#039;</span>=&gt;<span class="st0">&#039;Заголовок поста&#039;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;mt_allow_comments&#039;</span>=&gt;<span class="nu0">1</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;mt_allow_pings&#039;</span>=&gt;<span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;mt_keywords&#039;</span>=&gt;<span class="st0">&#039;tag1, tag2&#039;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;dateCreated&#039;</span>=&gt;new IXR_Date<span class="br0">&#40;</span><span class="st0">&#039;20091021T12:23:10&#039;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;description&#039;</span>=&gt;<span class="st0">&#039;Тут нужно вставить текст поста &#8230;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">TRUE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$resp</span> = <span class="re0">$client</span>-&gt;<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#039;metaWeblog.newPost&#039;</span>, <span class="re0">$requestData</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$postId</span> = <span class="re0">$client</span>-&gt;<span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Мы подключили библиотеку, создали объект типа <code>IXR_Client</code> (при этом мы указали адрес блога) и начали заполнять массив с данными (<code>$requestData</code>).</p>
<p>Первым элементом этого массива должен быть <code>id</code> автора. Если вы единственный автор блога, ставьте 0.</p>
<p>Второй и третий элементы – ваши логин и пароль.</p>
<p>Четвертый элемент &#8211; массив с данными. Это ассоциативный массив, поэтому последовательность элементов роли не играет. В данном случае мы указали заголовок поста (<code>title</code>), разрешили комментарии (<code>mt_allow_comments</code>) и запретили пинги (<code>mt_allow_pings</code>).</p>
<p><strong>Обратите внимание</strong>. Элементам <code>mt_allow_comments</code> и <code>mt_allow_pings</code> нужно присвоить числовые значения, элементу <code>title</code> – текстовое.</p>
<p>Затем мы указали перечень тегов (<code>mt_keywords</code>) и добавили текст поста (<code>description</code>).</p>
<p><strong>Теперь о дате</strong>. Передавать нужно объект типа <code>IXR_Date</code>, а в его конструкторе указать дату в формате «<code>ггггммддТчч:мм:сс</code>». Букву «Т» в принципе можно заменить любой другой или пробелом, она просто игнорируется. Но все остальные значения должны быть введены в строгом соответствии с этим форматом, а длина строки должна равняться <strong>17</strong>-ти символам.</p>
<p>Например, нельзя выводить только две последних цифры года, <strong>обязательно все четыре</strong>.</p>
<p>Пятый элемент массива – булево значение, указывает, публиковать пост или нет. Если дата, указанная в элементе dateCreated еще не наступила, то статус поста будет scheduled.</p>
<p>Для отправки поста мы используем метод <code>query</code>. В его первом параметре указываем название функции <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервера, которую мы хотим вызвать. В данном случае это <code>metaWeblog.newPost</code>. Во втором – передаем массив с данными.</p>
<p><em>Примечание</em>. Подробнее о функциях, которые поддерживает <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> сервер <acronym title="WordPress">WP</acronym> можно почитать в статье «<a href="http://www.simplecoding.org/publicatsija-v-wordpress-c-xml-rpc-i-codeigniter.html">Публикация постов в WordPress с помощью <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> и CodeIgniter</a>». Но основными источниками информации остаются <a href="http://codex.wordpress.org/XML-RPC">Codex <acronym title="WordPress">WP</acronym></a> и, конечно, сам файл <strong>xmlrpc.php</strong>.</p>
<p>Получить <code>id</code> опубликованного поста можно с помощью метода <code>getResponse</code>.</p>
<p>Как видите, ничего принципиально сложного нет. Главное правильно сформировать массив с данными <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>А вообще <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> интерфейс позволяет делать очень интересные вещи. Например, можно сделать общую панель управления несколькими блогами или систему для получения расширенной статистики (частота публикаций, среднее количество комментариев и т.п.).</p>
<p>Возможности ограничены только вашей фантазией <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=930&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/otlozhennaya-publikaciya-postov-v-wordpress-s-pomoshhyu-xml-rpc.html/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Собственное оформление комментариев в WordPress</title>
		<link>http://www.simplecoding.org/sobstvennoe-oformlenie-kommentariev-v-wordpress.html</link>
		<comments>http://www.simplecoding.org/sobstvennoe-oformlenie-kommentariev-v-wordpress.html#comments</comments>
		<pubDate>Tue, 15 Sep 2009 08:28:32 +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=905</guid>
		<description><![CDATA[Вы, конечно, знаете, что новые версии WordPress поддерживают древовидные комментарии.
Для каждого такого комментария движок создаёт довольно сложную разметку с большим количеством классов, которые можно использовать для оформления.
В идеале разработчик темы WordPress должен использовать только параметры функции wp_list_comments (выводит список комментариев) и CSS стили.
Но идеальных вещей не существует в природе и WordPress – не исключение  [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_904" class="wp-caption alignnone" style="width: 260px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/09/wp-comments.png" alt="wordpress comments" title="wordpress comments" width="250" height="98" class="size-full wp-image-904" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Вы, конечно, знаете, что новые версии <a href="http://wordpress.org/">WordPress</a> поддерживают <strong>древовидные комментарии</strong>.</p>
<p>Для каждого такого комментария движок создаёт довольно сложную разметку с большим количеством классов, которые можно использовать для оформления.</p>
<p>В идеале разработчик темы WordPress должен использовать только параметры функции <code>wp_list_comments</code> (выводит список комментариев) и <strong><acronym title="Cascading Style Sheets">CSS</acronym></strong> стили.</p>
<p>Но идеальных вещей не существует в природе и WordPress – не исключение <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>В общем, стандартное оформление комментариев содержит несколько очень неприятных <strong>недостатков</strong>.</p>
<p>Например.</p>
<p>После имени комментатора выводится слово <code>says:</code>, которое нельзя изменить с помощью параметров <code>wp_list_comments</code>. Хотя, текст ссылки <code>Reply</code> можно изменить с помощью этой функции</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">wp_list_comments<span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#039;reply_text&#039;</span>=&gt;<span class="st0">&#039;Ответить&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Вывод даты имеет фиксированный формат, что-то вроде <code>сентября 7, 2009 at 9:29 am</code><br />
<span id="more-905"></span><br />
<em>Примечание</em>. Я использую оригинальную английскую версию <strong>WordPress</strong>, вполне возможно, что разработчики локализированных версий перевели надписи и поправили формат даты. Но проблему это не решает. Разработчик темы все равно вынужден использовать те настройки, которые есть. К тому же получается, что тема будет зависеть от локализации движка.</p>
<p>Проблема заключается в том, что эти настройки прописаны в файле <code>wp-includes/comment-templates.php</code>. Т.е. если мы внесем в него изменения, они будут перезаписаны после очередного обновления движка, которые, кстати, появляются довольно часто.</p>
<p>Кстати, строка <code>1226</code> в файле <code>wp-includes/comment-templates.php</code> выглядит так:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> <span class="kw3">printf</span><span class="br0">&#40;</span>__<span class="br0">&#40;</span><span class="st0">&#039;&lt;cite class=&quot;fn&quot;&gt;%s&lt;/cite&gt; &lt;span class=&quot;says&quot;&gt;says:&lt;/span&gt;&#039;</span><span class="br0">&#41;</span>, get_comment_author_link<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Видите, мы может изменить оформление слова <code>says:</code> (с помощью <acronym title="Cascading Style Sheets">CSS</acronym> класса <code>says</code>), но не можем изменить сам текст.</p>
<p>Для того, чтобы решить эти проблемы нужно <strong>определить собственную функцию, формирующую дерево комментариев</strong>.</p>
<p>1) В файле <code>comments.php</code> вашей темы в параметре <code>callback</code> функции <code>wp_list_comments</code> указываем имя функции, которую нужно использовать для вывода комментариев.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">wp_list_comments<span class="br0">&#40;</span><span class="st0">&#039;type=comment&amp;callback=mytheme_comment&#039;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>В данном случае это <code>mytheme_comment</code>.</p>
<p>2) Создаем саму функцию. Она должна находиться в файл <code>functions.php</code> вашей темы.</p>
<p>Заново писать всю функцию целиком нет никакого смысла (разве что вы хотите сделать что-то неповторимое <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Лучше использовать <a href="http://codex.wordpress.org/Template_Tags/wp_list_comments">готовый шаблон</a></p>
<p>Он полностью совпадает со стандартным выводом комментариев в <acronym title="WordPress">WP</acronym>.<br />
Теперь можно немного его подправить.</p>
<p><em>Примечание</em>. Почитать о форматировании дат можно <a href="http://ua.php.net/manual/en/function.date.php">здесь</a>.</p>
<p>У меня получилось примерно следующее.</p>
<p>Строка с форматами даты и времени.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">&lt;div <span class="kw2">class</span>=<span class="st0">&quot;comment-meta commentmetadata&quot;</span>&gt;&lt;a href=<span class="st0">&quot;&lt;?php echo htmlspecialchars( get_comment_link( $comment-&gt;comment_ID ) ) ?&gt;&quot;</span>&gt;&lt;?php <span class="kw3">printf</span><span class="br0">&#40;</span>__<span class="br0">&#40;</span><span class="st0">&#039;%1$s в %2$s&#039;</span><span class="br0">&#41;</span>, get_comment_date<span class="br0">&#40;</span><span class="st0">&#039;j F Y&#039;</span><span class="br0">&#41;</span>, &nbsp;get_comment_time<span class="br0">&#40;</span><span class="st0">&#039;G:i&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ?&gt;&lt;/a&gt;&lt;?php edit_comment_link<span class="br0">&#40;</span>__<span class="br0">&#40;</span><span class="st0">&#039;(Edit)&#039;</span><span class="br0">&#41;</span>,<span class="st0">&#039; &nbsp;&#039;</span>,<span class="st0">&#034;</span><span class="br0">&#41;</span> ?&gt;&lt;/div&gt;</div>
</li>
</ol>
</div>
<p>Слово <code>says:</code> я просто удалил.</p>
<p>Кстати, будьте аккуратны при использовании этого метода. Учтите, что на вывод комментариев влияют не только разметка и стили, указанные в теме WordPress, но и настройки, сделанные через админку движка.</p>
<p>Например, если вы будете уменьшать размер шрифта вложенных комментариев или сделаете большой отступ слева, то ваш дизайн может стать совсем не привлекательным без ограничения на количество уровней вложенности комментариев.</p>
<p>В общем, тщательно тестируйте все ваши нововведения.</p>
<p>Удачи!</p>
<p><strong>Интересно почитать</strong></p>
<p><a href="http://eutem.com" title="Разработка сайтов в Минске">Разработка сайтов в Минске</a>. Студия веб-дизайна в Минске.</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=905&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/sobstvennoe-oformlenie-kommentariev-v-wordpress.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Оптимизируем WordPress</title>
		<link>http://www.simplecoding.org/optimiziruem-wordpress.html</link>
		<comments>http://www.simplecoding.org/optimiziruem-wordpress.html#comments</comments>
		<pubDate>Fri, 30 Jan 2009 18:35:48 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=744</guid>
		<description><![CDATA[Наверное, ни для одного блоггера не секрет, что в новых версиях WordPress появилось несколько довольно спорных нововведений.
Речь, прежде всего о ревизиях. Если их не отключить, то размер базы данных может легко увеличиться в несколько раз, причем безо всякой пользы для вас.
Поэтому появление плагинов, которые позволяют с этим бороться вряд ли кого-то удивит.
О таком плагине сегодня [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_745" class="wp-caption alignnone" style="width: 282px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/01/wp-optimize.png" alt="wp-optimize" title="wp-optimize" width="272" style="float:left" height="111" class="size-full wp-image-745" /><p class="wp-caption-text"> </p></div>
<p>Наверное, ни для одного блоггера не секрет, что в новых версиях <strong>WordPress</strong> появилось несколько довольно <strong>спорных</strong> нововведений.</p>
<p>Речь, прежде всего о ревизиях. Если их не отключить, то размер базы данных может легко увеличиться в несколько раз, причем безо всякой пользы для вас.</p>
<p>Поэтому появление плагинов, которые позволяют с этим бороться вряд ли кого-то удивит.</p>
<p>О таком плагине сегодня и пойдет речь. Называется он <a href="http://www.ruhanirabin.com/wp-optimize/"><acronym title="WordPress">WP</acronym>-Optimize</a>  и <strong>позволяет</strong>:</p>
<p>- удалить ревизии постов;</p>
<p>- удалить спамерские комментарии, т.е. те, которые в базе данных уже отмечены как spam;</p>
<p>- удалить комментарии, которые не прошли модерацию;</p>
<p>- оптимизировать базу данных;</p>
<p>- изменить имя администратора. Эту возможность, на мой взгляд, нужно было давно встроить в движок.<br />
<span id="more-744"></span><br />
Честно говоря, себе я этот плагин не устанавливал, т.к. ревизии у меня в базе данных никогда не создавались. Я их <a href="http://www.simplecoding.org/wordpress-26-pervye-vpechatleniya.html">отключил сразу после установки <acronym title="WordPress">WP</acronym></a>.</p>
<p>Спам – это вообще отдельная тема, которая уже надоела до предела. Да и все равно проверять эти комментарии приходится вручную.</p>
<p>Остальное операции тоже несложно выполнить имея минимальные знания о базах данных и PhpMyAdmin.</p>
<p>Т.е. плагин будет полезен прежде всего тем пользователям WordPress, которые не рискуют сами работать с БД <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Установка плагина</strong> не требует никаких не стандартных действий.</p>
<p>Все как обычно. Скачиваем, распаковываем, заливаем в <code>wp-content/plugins</code>, активируем.</p>
<p>После этого в настройках появиться страница этого плагина (<acronym title="WordPress">WP</acronym>-Optimize) на которой вы сможете выбрать нужную операцию.</p>
<p>В заключение дам <strong>несколько советов</strong>.</p>
<p>1) Если вы не уверены в собственных действиях или просто хотите подстраховаться, <strong>сделайте бекап базы данных</strong>.</p>
<p>2) <strong>Обязательно удаляйте старые ревизии</strong>. Особенно если вы часто вносите изменения в посты. Они предназначены для совместной работы, а если вы этой возможностью не пользуетесь, то ревизии только захламляют вашу базу.</p>
<p>3) <strong>Измените имя администратора</strong>. Это вопрос безопасности. Стандартное имя (admin) все знают и хакерам останется только определить ваш пароль. А если вы измените имя, то их взломать блог станет сложнее.</p>
<p>Как видите, плагин довольно полезный, и если сами работать с базой данных вы не хотите, то установить его стоит.</p>
<p>До встречи!</p>
<p><strong>Интересно почитать</strong></p>
<p>Оригинальные, но очень эффективные <a href="http://ultra-effect.com/">рецепты похудения</a> помогут решить ваши проблемы.<br />
<a href="http://ukraine.ibr-network.com/">Открытая школа бизнеса</a> приглашает всех желающих.</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=744&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/optimiziruem-wordpress.html/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
