<?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>Ars Longa, Vita Brevis &#187; Патчи</title>
	<atom:link href="http://blog.sjinks.pro/wordpress/patches/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Sat, 19 May 2012 17:55:07 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL Injection Vulnerability в Z-Vote 1.1</title>
		<link>http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/</link>
		<comments>http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 19:32:49 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Патчи]]></category>
		<category><![CDATA[path disclosure]]></category>
		<category><![CDATA[SQL-инъекция]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=902</guid>
		<description><![CDATA[Исправление уязвимостей в плагине WordPress Z-Vote 1.1 В плагине WordPress Z-Vote 1.1 была обнаружена уязвимость, позволяющая злоумышленнику выполнять произвольные запросы к базе данных (уязвимость типа «SQL-инъекция»). Уязвимость существует из-за неправильного использования метода wpdb::prepare() и отсутствия проверки и очистки переменной $_GET['zvote']. Уязвимость позволяет злоумышленнику изменять запросы к базе данных, выполнять произвольные запросы, читать или изменять конфиденциальную информацию. Вторая [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление уязвимостей в плагине <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> Z-Vote 1.1</em></h2>
<p>В плагине WordPress Z-Vote 1.1 была <a href="http://www.exploit-db.com/exploits/16218/">обнаружена</a> <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a>, позволяющая злоумышленнику выполнять произвольные запросы к базе данных (<a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a> типа «<a href="http://blog.sjinks.pro/tag/sql-injection/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SQL-инъекция">SQL-инъекция</a>»).</p>
<p>Уязвимость существует из-за неправильного использования метода <span class="codebox"><code class="php">wpdb<span class="sy0">::</span><span class="me2">prepare</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> и отсутствия проверки и очистки переменной <code>$_GET['zvote']</code>.</p>
<p>Уязвимость позволяет злоумышленнику изменять запросы к базе данных, выполнять произвольные запросы, читать или изменять конфиденциальную информацию.<span id="more-902"></span><br />
Вторая уязвимость (незначительная по сравнению с SQL-инъекцией) — раскрытие пути к плагину (<a href="http://blog.sjinks.pro/tag/path-disclosure/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  path disclosure">path disclosure</a>) при прямом доступе к файлу плагина.</p>
<p><strong><a href='http://static.sjinks.info/wp-content/uploads/2011/02/z-vote.diff'>Патч, исправляющий уязвимости в Z-Vote 1.1</a>:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9022">
        <div class="code diff" id="p902code2">
diff -uwdBrN z-vote.orig/zvote.php z-vote/zvote.php<br />
<span class="re3">--- z-vote.orig/zvote.php &nbsp; <span class="nu0">2011</span>-02-<span class="nu0">25</span> <span class="nu0">21</span>:05:<span class="nu0">44.000000000</span> +0200</span><br />
<span class="re4">+++ z-vote/zvote.php&nbsp; &nbsp; <span class="nu0">2011</span>-02-<span class="nu0">25</span> <span class="nu0">21</span>:<span class="nu0">10</span>:<span class="nu0">46.531798756</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">9</span>,<span class="nu0">6</span> +<span class="nu0">9</span>,<span class="nu0">8</span> @@</span><br />
&nbsp; &nbsp;License: GPL <br />
&nbsp;*/<br />
&nbsp;<br />
<span class="re8">+ &nbsp; defined<span class="br0">&#40;</span>'ABSPATH'<span class="br0">&#41;</span> or die<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
&nbsp;// --- DEFINITIONS<br />
&nbsp;<br />
&nbsp; &nbsp; //define where zvote is installed on the wordpres system. In 99.9% of the case the path below is correct.<br />
<span class="re6">@@ -<span class="nu0">271</span>,<span class="nu0">7</span> +<span class="nu0">273</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;function zVote_getEntry<span class="br0">&#40;</span>$postid<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp;<br />
<span class="re7">- &nbsp; $entries = $wpdb-&gt;get_results<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $entries = $wpdb-&gt;get_results<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d&quot;, $postid<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; return $entries;<br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="re6">@@ -<span class="nu0">282</span>,<span class="nu0">7</span> +<span class="nu0">284</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; $votes = <span class="nu0">0</span>;<br />
<span class="re7">- &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT COUNT<span class="br0">&#40;</span>*<span class="br0">&#41;</span> FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT COUNT<span class="br0">&#40;</span>*<span class="br0">&#41;</span> FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d&quot;, $postid<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; return $votes;<br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="re6">@@ -<span class="nu0">292</span>,<span class="nu0">7</span> +<span class="nu0">294</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp; &nbsp; <br />
<span class="re7">- &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;DELETE FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;DELETE FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d&quot;, $postid<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; return $votes;<br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="re6">@@ -<span class="nu0">353</span>,<span class="nu0">7</span> +<span class="nu0">355</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //ipcheck for now, will expand to userid-check, based on the user setting in version 1.5<br />
<span class="re7">- &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot; AND userip = \&quot;&quot; . $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d AND userip = %s&quot;, $postid, $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; $wpdb-&gt;insert<span class="br0">&#40;</span> $wpdb-&gt;prefix . 'zvotedata', array<span class="br0">&#40;</span> 'postid' =&gt; $postid, 'userip' =&gt; $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span>, 'userid' =&gt; 0, 'time' =&gt; time<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>, array<span class="br0">&#40;</span> '%d','%s', '%d', '%d' <span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <br />
<span class="re6">@@ -<span class="nu0">365</span>,<span class="nu0">7</span> +<span class="nu0">367</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; global $wpdb, $wp_query, $redirect_meta_key;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //ipcheck for now, will expand to userid-check, based on the user setting in version 1.5<br />
<span class="re7">- &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot; AND userip = \&quot;&quot; . $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d AND userip = %d&quot;, $postid, $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>!$ipcheck<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; //ok to vote, register vote<br />
<span class="re6">@@ -<span class="nu0">382</span>,<span class="nu0">7</span> +<span class="nu0">384</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //send user to post<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; header<span class="br0">&#40;</span>'Location: ' .$injectionPoint<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; wp_redirect<span class="br0">&#40;</span>$injectionPoint<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; exit;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span> else <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; //user already registered, push to entry-page and inform the user.<br />
<span class="re6">@@ -<span class="nu0">394</span>,<span class="nu0">7</span> +<span class="nu0">396</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $injectionPoint = $post . '?zvoters=2';<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; header<span class="br0">&#40;</span>'Location: ' .$injectionPoint<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; wp_redirect<span class="br0">&#40;</span>$injectionPoint<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; exit;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; exit;
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Генерация карты сайта в HTML из XML: часть 3</title>
		<link>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/</link>
		<comments>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 00:30:50 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Google XML Sitemaps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XSL]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[преобразование]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=854</guid>
		<description><![CDATA[Автоматизация: перекладываем работу на Google XML Sitemaps Продолжение цикла статей на тему генерации карты сайта в HTML из карты XML. В данной статье будет рассмотрен вопрос модификации плагина Google XML Sitemaps с целью добавления поддержки автоматической генерации HTML-версии карты сайта; как и в предыдущих статьях, преобразование будет осуществляться средствами XSL. В первой части статьи мы [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Автоматизация: перекладываем работу на <a href="http://blog.sjinks.pro/tag/google-xml-sitemaps/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google XML Sitemaps">Google XML Sitemaps</a></em></h2>
<p>Продолжение <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">цикла</a> <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">статей</a> на тему <a href="/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BA%D0%B0%D1%80%D1%82%D1%8B%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%D0%B2%20HTML%20%D0%B8%D0%B7%20XML/">генерации карты сайта в HTML из карты XML</a>.</p>
<p>В данной статье будет рассмотрен вопрос модификации плагина <a href="http://blog.sjinks.pro/tag/google-xml-sitemaps/">Google XML Sitemaps</a> с целью добавления поддержки автоматической генерации HTML-версии карты сайта; как и в предыдущих статьях, <a href="http://blog.sjinks.pro/tag/conversion/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  преобразование">преобразование</a> будет осуществляться средствами <a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a>.<span id="more-854"></span></p>
<p>В <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">первой части</a> статьи мы рассматривали вариант, основанный на использовании утилиты <code>xsltproc</code>. Предполагалось, что генерация HTML-версии карты сайта осуществляется с использованием <code>cron</code>. Создание карты по расписанию означает, что построение HTML-карты будет запаздывать на некоторое время; а если не сравнивать время модификации XML- и HTML-версий карт, получим бесполезные вызовы <code>xsltproc</code>.</p>
<p>Те, кто используют <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, очень часто для автоматического построения карты сайта используют <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> Google XML Sitemaps; для них предлагается вариант с модификацией кода плагина для автоматической генерации HTML-карты.</p>
<p>Плагин позволяет задавать свою таблицу стилей XSLT:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/11/gxs-options.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/11/gxs-options-300x56.png" alt="Настройки Google XML Sitemaps" title="Настройки Google XML Sitemaps" width="300" height="56" class="alignnone size-medium wp-image-855" /></a></p>
<p>Мы изменим плагин таким образом, чтобы при заданной таблице стилей XSL плагин создавал HTML-файл с результатами преобразований XSL.</p>
<p>В файле <code>sitemap-core.php</code> ищем такой кусок кода:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8546">
        <div class="code php" id="p854code6">
<ol class="php" style="font-family:monospace;" start="2169"><li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st0">&quot;b_xml&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle <span class="sy0">&amp;&amp;</span> <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle <span class="sy0">=</span> <span class="kw4">null</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$status</span><span class="sy0">-&gt;</span><span class="me1">EndXml</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pingUrl</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetXmlUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="re0">$status</span><span class="sy0">-&gt;</span><span class="me1">EndXml</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="sy0">,</span><span class="st0">&quot;Could not close the sitemap file.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>После него добавляем такой:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8547">
        <div class="code php" id="p854code7">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">class_exists</span><span class="br0">&#40;</span><span class="st_h">'XSLTProcessor'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$file</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetXmlPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$styleSheet</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetDefaultStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st_h">'b_style_default'</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw4">true</span> ? <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetDefaultStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st_h">'b_style'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$styleSheet</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xsl</span> <span class="sy0">=</span> <span class="kw2">new</span> DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xsl</span><span class="sy0">-&gt;</span><span class="me1">load</span><span class="br0">&#40;</span><span class="re0">$styleSheet</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xml</span> <span class="sy0">=</span> <span class="kw2">new</span> DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">load</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span> <span class="sy0">=</span> <span class="kw2">new</span> XSLTProcessor<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span><span class="sy0">-&gt;</span><span class="me1">importStyleSheet</span><span class="br0">&#40;</span><span class="re0">$xsl</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span><span class="sy0">-&gt;</span><span class="me1">transformToURI</span><span class="br0">&#40;</span><span class="re0">$xml</span><span class="sy0">,</span> <span class="st_h">'file://'</span> <span class="sy0">.</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st_h">'.xml'</span><span class="sy0">,</span> <span class="st_h">'.html'</span><span class="sy0">,</span> <span class="re0">$file</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Данный код требует PHP 5 и расширения XSLT (в Debian/Ubuntu оно предоставляется пакетом <code>php5-xsl</code>). Код получает имя файла с картой сайта и адрес таблицы стилей (этот адрес должен быть задан абсолютным URL); XML и XSL скармливаются XSLT Processor&#8217;у, результат записывается в файл с тем же именем, что и карта сайта XML, но с расширением <code>.html</code>.</p>
<p>Теперь при каждом построении карты сайта будет создаваться и HTML-версия.</p>
<p>Тем, кто любит патчи (<a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> кумулятивный, исправляет и некоторые другие недостатки плагина):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8548">
        <div class="code diff" id="p854code8">
--- sitemap-core.php.orig &nbsp; 2010-08-16 10:49:16.000000000 +0300<br />
<span class="re4">+++ sitemap-core.php&nbsp; &nbsp; <span class="nu0">2010</span>-<span class="nu0">11</span>-<span class="nu0">28</span> 02:<span class="nu0">10</span>:<span class="nu0">08.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">1654</span>,<span class="nu0">9</span> +<span class="nu0">1654</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorXmlEntry<span class="br0">&#40;</span>'&lt;' . '?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;' . $styleSheet . '&quot;?' . '&gt;'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //All comments as an asso. Array <span class="br0">&#40;</span>postID=&gt;commentCount<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $comments=<span class="br0">&#40;</span>$this-&gt;GetOption<span class="br0">&#40;</span>&quot;b_prio_provider&quot;<span class="br0">&#41;</span>!=&quot;&quot;?$this-&gt;GetComments<span class="br0">&#40;</span><span class="br0">&#41;</span>:array<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">2172</span>,<span class="nu0">6</span> +<span class="nu0">2172</span>,<span class="nu0">22</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $status-&gt;EndXml<span class="br0">&#40;</span>true<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $pingUrl=$this-&gt;GetXmlUrl<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> else $status-&gt;EndXml<span class="br0">&#40;</span>false,&quot;Could not close the sitemap file.&quot;<span class="br0">&#41;</span>;<br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>class_exists<span class="br0">&#40;</span>'XSLTProcessor', true<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $file &nbsp; &nbsp; &nbsp; = $this-&gt;GetXmlPath<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $styleSheet = <span class="br0">&#40;</span>$this-&gt;GetDefaultStyle<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; $this-&gt;GetOption<span class="br0">&#40;</span>'b_style_default'<span class="br0">&#41;</span> === true ? $this-&gt;GetDefaultStyle<span class="br0">&#40;</span><span class="br0">&#41;</span> : $this-&gt;GetOption<span class="br0">&#40;</span>'b_style'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>!empty<span class="br0">&#40;</span>$styleSheet<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xsl = new DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xsl-&gt;load<span class="br0">&#40;</span>$styleSheet<span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xml = new DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xml-&gt;load<span class="br0">&#40;</span>$file<span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc = new XSLTProcessor<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc-&gt;importStyleSheet<span class="br0">&#40;</span>$xsl<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc-&gt;transformToURI<span class="br0">&#40;</span>$xml, 'file://' . str_replace<span class="br0">&#40;</span>'.xml', '.html', $file<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if<span class="br0">&#40;</span>$this-&gt;IsGzipEnabled<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">2514</span>,<span class="nu0">9</span> +<span class="nu0">2530</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp;* @return int The time in seconds<br />
&nbsp; &nbsp; &nbsp;*/<br />
&nbsp; &nbsp; function GetTimestampFromMySql<span class="br0">&#40;</span>$mysqlDateTime<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$date, $hours<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>' ', $mysqlDateTime<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$year,$month,$day<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>'-',$date<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$hour,$min,$sec<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>':',$hours<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$date, $hours<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>' ', $mysqlDateTime<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$year,$month,$day<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>'-',$date<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$hour,$min,$sec<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>':',$hours<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; return mktime<span class="br0">&#40;</span>intval<span class="br0">&#40;</span>$hour<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$min<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$sec<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$month<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$day<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$year<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Очередная партия исправлений для Simple Tags</title>
		<link>http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 18:30:49 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=841</guid>
		<description><![CDATA[Cannot load st_mass_tags Благодаря одному из своих читателей я узнал, что у плагина Simple Tags помимо проблем, которые я регулярно исправляю, есть еще одна: при попытке зайти в Posts » Mass edit terms » All Pages выдаётся сообщение Невозможно загрузить st_mass_tags. Об ошибке автору сообщили на форуме поддержки, но так как автор в комментариях не отметился, пришлось исправлять плагин [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Cannot load st_mass_tags</em></h2>
<p>Благодаря одному из своих <a href="http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/comment-page-1/#comment-3556">читателей</a> я узнал, что у плагина <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a> помимо проблем, которые я <a href="http://blog.sjinks.pro/tag/simple-tags/">регулярно исправляю</a>, есть еще одна: при попытке зайти в Posts » Mass edit terms » All Pages выдаётся сообщение <strong>Невозможно загрузить st_mass_tags</strong>.<span id="more-841"></span></p>
<p>Об ошибке автору <a href="http://wordpress.org/support/topic/plugin-simple-tags-cannot-load-st_mass_tags?replies=1">сообщили</a> на форуме поддержки, но так как автор в комментариях не отметился, пришлось исправлять <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> самостоятельно.</p>
<p>Как оказалось, всё дело в вызове <code>add_posts_page()</code>. Дело в том, что эта функция регистрирует страницу плагина в системе только для меню «Записи» (Posts). Ссылки «Все записи», «Черновики», «Опубликованные» работают нормально, так как в их основе <code>/wp-admin/edit.php?page=st_mass_tags</code>. А ссылка «Все страницы» (<code>/wp-admin/edit.php?page=st_mass_tags&amp;post_type=page</code>) уже не работает — из-за <code>post_type=page</code>. А всё потому, что <code>edit.php?post_type=page</code> — это уже другое меню (Страницы/Pages), для которого <code>add_posts_page()</code> не работает. Для того, чтобы зарегистрировать страницу в этом меню, нужно использовать функцию <code>add_pages_page()</code>.</p>
<p>Но при использовании <code>add_pages_page()</code> ссылка на страницу появится в меню «Страницы», а это, скорее всего, не совсем то, что хотел автор (фактически, у нас бы получилось два пункта «Mass Edit Terms» — один в меню записей, другой в меню страниц). Поэтому для чистого решения проблемы нужно проэмулировать работу функции <code>add_pages_page()</code>, но не создавать запись в меню.</p>
<p>Решение получается очень простым:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84110">
        <div class="code diff" id="p841code10">
--- simple-tags/inc/admin.orig.php&nbsp; 2010-10-24 15:31:16.000000000 +0300<br />
<span class="re4">+++ simple-tags/inc/admin.php &nbsp; <span class="nu0">2010</span>-<span class="nu0">10</span>-<span class="nu0">24</span> <span class="nu0">15</span>:<span class="nu0">59</span>:<span class="nu0">37.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">231</span>,<span class="nu0">6</span> +<span class="nu0">231</span>,<span class="nu0">17</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add_posts_page<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Simple Terms: Mass Edit Terms', 'simpletags'<span class="br0">&#41;</span>, __<span class="br0">&#40;</span>'Mass Edit Terms', 'simpletags'<span class="br0">&#41;</span>, 'simple_tags', 'st_mass_tags', array<span class="br0">&#40;</span>&amp;$this, 'pageMassEditTags'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; add_posts_page<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Simple Terms: Auto Terms', 'simpletags'<span class="br0">&#41;</span>, __<span class="br0">&#40;</span>'Auto Terms', 'simpletags'<span class="br0">&#41;</span>, 'simple_tags', 'st_auto', array<span class="br0">&#40;</span>&amp;$this, 'pageAutoTags'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; add_options_page<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Simple Tags: Options', 'simpletags'<span class="br0">&#41;</span>, __<span class="br0">&#40;</span>'Simple Tags', 'simpletags'<span class="br0">&#41;</span>, 'admin_simple_tags', 'st_options', array<span class="br0">&#40;</span>&amp;$this, 'pageOptions'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; global $_registered_pages, $_wp_real_parent_file;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $menu_slug &nbsp; = plugin_basename<span class="br0">&#40;</span>'st_mass_tags'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $parent_slug = plugin_basename<span class="br0">&#40;</span>'edit.php?post_type=page'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>isset<span class="br0">&#40;</span>$_wp_real_parent_file<span class="br0">&#91;</span>$parent_slug<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $parent_slug = $_wp_real_parent_file<span class="br0">&#91;</span>$parent_slug<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $hookname = get_plugin_page_hookname<span class="br0">&#40;</span>$menu_slug, $parent_slug<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; add_action<span class="br0">&#40;</span>$hookname, array<span class="br0">&#40;</span>&amp;$this, 'pageMassEditTags'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $_registered_pages<span class="br0">&#91;</span>$hookname<span class="br0">&#93;</span> = true;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; /**
        </div>
    </div>
</div>

<p>Специально для тех, у кого слово <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> вызывает нехорошие мысли, я собрал исправленную версию плагина, в которой:</p>
<ul>
<li>Устранена эта самая <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">добавлена поддержка UTF-8 в автоматических ссылках</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">оптимизирован вызов <code>register_uninstall_hook()</code></a>;</li>
<li>исправлена проблема с локализацией (спасибо <a href="http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/comment-page-1/#comment-3469">Analitik</a>).</li>
</ul>
<p><strong id="download"><a href="http://d.sjinks.pro/wordpress/simple-tags-1.8.2.zip" rel="nofollow">Скачать исправленный плагин Simple Tags 1.8.2</a></strong>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Исправляем Simple Tags 1.8</title>
		<link>http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 03:44:50 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=821</guid>
		<description><![CDATA[Очередная порция патчей для Simple Tags Традиционное исправление ошибок в плагине Simple Tags. Ошибки всё те же: отсутствует поддержка многобайтовых символов (в частности, UTF-8) в автоматических ссылках; вызов register_uninstall_hook() при каждом обращении к блогу. Радует, что проблему с автоматическими ссылками меток автор всё же поправил Это то, ради чего данный плагин установлен. Традиционный патч (unified [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Очередная порция патчей для <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a></em></h2>
<p><a href="http://blog.sjinks.pro/search/simpletags/">Традиционное</a> исправление ошибок в плагине Simple Tags.</p>
<p>Ошибки всё те же:</p>
<ul>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">отсутствует поддержка многобайтовых символов (в частности, UTF-8) в автоматических ссылках</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">вызов <code>register_uninstall_hook()</code> при каждом обращении к блогу</a>.</li>
</ul>
<p>Радует, что проблему с автоматическими ссылками меток автор всё же поправил <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Это то, ради чего данный <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> установлен.<span id="more-821"></span></p>
<p>Традиционный <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> (unified diff):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82112">
        <div class="code diff" id="p821code12">
diff -uwdBrN simple-tags.orig/inc/client.php simple-tags/inc/client.php<br />
<span class="re3">--- simple-tags.orig/inc/client.php <span class="nu0">2010</span>-08-<span class="nu0">11</span> <span class="nu0">10</span>:<span class="nu0">37</span>:<span class="nu0">39.000000000</span> +0300</span><br />
<span class="re4">+++ simple-tags/inc/client.php&nbsp; <span class="nu0">2010</span>-09-<span class="nu0">13</span> 06:<span class="nu0">20</span>:<span class="nu0">40.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">157</span>,<span class="nu0">8</span> +<span class="nu0">157</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $filtered = ''; // will filter text token by token<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/\b&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;\b/&quot;.$case;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$0&lt;/a&gt;&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $quoted = preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = '/<span class="br0">&#40;</span>\PL|\A<span class="br0">&#41;</span><span class="br0">&#40;</span>' . $quoted . '<span class="br0">&#41;</span><span class="br0">&#40;</span>\PL|\Z<span class="br0">&#41;</span>/u'.$case;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '$1&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$2&lt;/a&gt;$3&quot;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for efficiency only tokenize if forced to do so<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $must_tokenize <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
diff -uwdBrN simple-tags.orig/inc/inc.functions.php simple-tags/inc/inc.functions.php<br />
<span class="re3">--- simple-tags.orig/inc/inc.functions.php&nbsp; <span class="nu0">2010</span>-08-<span class="nu0">11</span> <span class="nu0">10</span>:<span class="nu0">37</span>:<span class="nu0">39.000000000</span> +0300</span><br />
<span class="re4">+++ simple-tags/inc/inc.functions.php &nbsp; <span class="nu0">2010</span>-09-<span class="nu0">13</span> 06:<span class="nu0">16</span>:<span class="nu0">05.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">4</span>,<span class="nu0">6</span> +<span class="nu0">4</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; *<br />
&nbsp; */<br />
&nbsp;function SimpleTags_Install<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re8">+ &nbsp; register_uninstall_hook <span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/simple-tags.php', 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; $options_from_table = get_option<span class="br0">&#40;</span> STAGS_OPTIONS_NAME <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> $options_from_table == false <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $options = <span class="br0">&#40;</span>array<span class="br0">&#41;</span> include<span class="br0">&#40;</span> dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/default.options.php' <span class="br0">&#41;</span>;<br />
diff -uwdBrN simple-tags.orig/simple-tags.php simple-tags/simple-tags.php<br />
<span class="re3">--- simple-tags.orig/simple-tags.php&nbsp; &nbsp; <span class="nu0">2010</span>-08-<span class="nu0">11</span> <span class="nu0">10</span>:<span class="nu0">37</span>:<span class="nu0">38.000000000</span> +0300</span><br />
<span class="re4">+++ simple-tags/simple-tags.php <span class="nu0">2010</span>-09-<span class="nu0">13</span> 06:<span class="nu0">34</span>:<span class="nu0">39.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">3</span>,<span class="nu0">7</span> +<span class="nu0">3</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Plugin Name: Simple Tags<br />
&nbsp;Plugin URI: http://redmine.beapi.fr/projects/show/simple-tags<br />
&nbsp;Description: Extended Tagging for WordPress 3.0 ! Suggested Tags, Mass edit tags, Autocompletion, Tag Cloud Widgets, Related Posts, Related Tags, etc!<br />
<span class="re7">-Version: 1.8</span><br />
<span class="re8">+Version: 1.8.1</span><br />
&nbsp;Author: Amaury BALMER<br />
&nbsp;Author URI: http://www.herewithme.fr<br />
&nbsp;Text Domain: simpletags<br />
<span class="re6">@@ -<span class="nu0">23</span>,<span class="nu0">6</span> +<span class="nu0">23</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Contributors:<br />
&nbsp;- Kevin Drouvin <span class="br0">&#40;</span>kevin.drouvin@gmail.com - http://inside-dev.net<span class="br0">&#41;</span><br />
&nbsp;- Martin Modler <span class="br0">&#40;</span>modler@webformatik.com - http://www.webformatik.com<span class="br0">&#41;</span><br />
<span class="re8">+- Vladimir Kolesnikov <span class="br0">&#40;</span>vladimir at extrememember dot com - http://blog.sjinks.pro<span class="br0">&#41;</span></span><br />
&nbsp;<br />
&nbsp;Todo:<br />
&nbsp; &nbsp; Both :<br />
<span class="re6">@@ -<span class="nu0">60</span>,<span class="nu0">7</span> +<span class="nu0">61</span>,<span class="nu0">6</span> @@</span><br />
&nbsp;<br />
&nbsp;// Activation, uninstall<br />
&nbsp;register_activation_hook<span class="br0">&#40;</span>__FILE__, 'SimpleTags_Install' &nbsp; <span class="br0">&#41;</span>;<br />
<span class="re7">-register_uninstall_hook <span class="br0">&#40;</span>__FILE__, 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp;// Init ST<br />
&nbsp;function simple_tags_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>И zip-архив для тех, кто патчи не любит: <strong><a href="http://d.sjinks.pro/wordpress/simple-tags-1.8.1.zip" rel="nofollow">скачать исправленную версию плагина Simple Tags 1.8</a></strong>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Core Control: лечим некорректное отображение методов в модуле cron</title>
		<link>http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 16:18:52 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Core Control]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=815</guid>
		<description><![CDATA[Патч для плагина Core Control для корректного отображения имён методов Есть один замечательный плагин для разработчиков, называется Core Control. Данный плагин позволяет контролировать различные аспекты работы WordPress: транспорт HTTP (например, расширение PHP HTTP, cURL, потоки PHP и т.п.), протоколирование HTTP-запросов, контроль обновлений ядра, плагинов и тем, способы доступа к файловой системе, а также отображение запланированных задач. Работая [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Патч для плагина <a href="http://blog.sjinks.pro/tag/core-control/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Core Control">Core Control</a> для корректного отображения имён методов</em></h2>
<p>Есть один замечательный <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> для разработчиков, называется <a href="http://wordpress.org/extend/plugins/core-control/">Core Control</a>. Данный плагин позволяет контролировать различные аспекты работы <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>: транспорт HTTP (например, расширение PHP HTTP, cURL, потоки PHP и т.п.), протоколирование HTTP-запросов, контроль обновлений ядра, плагинов и тем, способы доступа к файловой системе, а также отображение запланированных задач.<span id="more-815"></span></p>
<p>Работая над одним плагином, в котором усиленно использовалось планирование заданий, мы столкнулись с проблемой, что cron-модуль плагина Core Control неправильно отображает запланированные задания, если задание представлено не обычной функцией, а методом класса:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/09/cron-tasks.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/09/cron-tasks-300x110.png" alt="Запланированные задания" title="Scheduled Tasks" width="300" height="110" class="alignnone size-medium wp-image-816" /></a>.</p>
<p>К счастью, исправляется довольно легко.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p81514">
        <div class="code diff" id="p815code14">
--- core-control/modules/core_control_cron.php.orig 2010-09-10 09:20:08.000000000 -0400<br />
<span class="re4">+++ core-control/modules/core_control_cron.php&nbsp; <span class="nu0">2010</span>-09-<span class="nu0">10</span> 09:<span class="nu0">31</span>:<span class="nu0">38.000000000</span> -0400</span><br />
<span class="re6">@@ -<span class="nu0">138</span>,<span class="nu0">8</span> +<span class="nu0">138</span>,<span class="nu0">23</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> isset<span class="br0">&#40;</span>$GLOBALS<span class="br0">&#91;</span>'wp_filter'<span class="br0">&#93;</span><span class="br0">&#91;</span>$hook<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $functions = array<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> <span class="br0">&#40;</span>array<span class="br0">&#41;</span>$GLOBALS<span class="br0">&#91;</span>'wp_filter'<span class="br0">&#93;</span><span class="br0">&#91;</span>$hook<span class="br0">&#93;</span> as $priority =&gt; $function <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> $function as $hook_details <span class="br0">&#41;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $functions<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="br0">&#40;</span>isset<span class="br0">&#40;</span>$hook_details<span class="br0">&#91;</span>'class'<span class="br0">&#93;</span><span class="br0">&#41;</span> ? $hook_details<span class="br0">&#91;</span>'class'<span class="br0">&#93;</span> . '::' : ''<span class="br0">&#41;</span> . $hook_details<span class="br0">&#91;</span>'function'<span class="br0">&#93;</span> . '<span class="br0">&#40;</span><span class="br0">&#41;</span>';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> $function as $hook_details <span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = '';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $f &nbsp; &nbsp;= $hook_details<span class="br0">&#91;</span>'function'<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span>$f<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>is_object<span class="br0">&#40;</span>$f<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = get_class<span class="br0">&#40;</span>$f<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = $f<span class="br0">&#91;</span>0<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook .= '::' . $f<span class="br0">&#91;</span>1<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = $f;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $functions<span class="br0">&#91;</span><span class="br0">&#93;</span> = $hook . '<span class="br0">&#40;</span><span class="br0">&#41;</span>';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo '&lt;br/&gt;&lt;strong&gt;Hooked functions:&lt;/strong&gt; ' . implode<span class="br0">&#40;</span>', ', $functions<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google XML Sitemaps: убираем версию и сигнатуру из карты сайта</title>
		<link>http://blog.sjinks.pro/wordpress/patches/810-google-xml-sitemaps-remove-version-signature-from-sitemap/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/810-google-xml-sitemaps-remove-version-signature-from-sitemap/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 20:36:55 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Google XML Sitemaps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=810</guid>
		<description><![CDATA[Осеннее обострение — убираем информацию о версии WordPress и плагина из карты сайта После установки различных плагинов, отвечающих за псевдобезопасность сайта — например, путем сокрытия используемой версии WordPress, имён и версий установленных плагинов и т.п. — обычно выясняется, что они не могут справиться с Google XML Sitemaps: он как выдавал секретные данные о версии WordPress в карте сайта, так и продолжает их выдавать. [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/810-google-xml-sitemaps-remove-version-signature-from-sitemap/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Осеннее обострение — убираем информацию о версии <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> и плагина из карты сайта</em></h2>
<p>После установки различных плагинов, отвечающих за псевдобезопасность сайта — например, путем сокрытия используемой версии WordPress, имён и версий установленных плагинов и т.п. — обычно выясняется, что они не могут справиться с <a href="http://blog.sjinks.pro/tag/google-xml-sitemaps/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google XML Sitemaps">Google XML Sitemaps</a>: он как выдавал секретные данные о версии WordPress в <a href="/sitemap.xml">карте сайта</a>, так и продолжает их выдавать.</p>
<p>Очевидно, что это очень смущает людей, зацикленных на безопасности сайта.</p>
<p>К счастью, это лечится (во всех смыслах).<span id="more-810"></span></p>
<p>Открываем файл <code>wp-content/plugins/google-sitemap-generator/sitemap-core.php</code>, ищем такие строки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p81017">
        <div class="code php" id="p810code17">
<ol class="php" style="font-family:monospace;" start="1657"><li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">AddElement</span><span class="br0">&#40;</span><span class="kw2">new</span> GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span><span class="st0">&quot;generator=<span class="es1">\&quot;</span>wordpress/&quot;</span> <span class="sy0">.</span> get_bloginfo<span class="br0">&#40;</span><span class="st_h">'version'</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\&quot;</span>&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">AddElement</span><span class="br0">&#40;</span><span class="kw2">new</span> GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span><span class="st0">&quot;sitemap-generator-url=<span class="es1">\&quot;</span>http://www.arnebrachhold.de<span class="es1">\&quot;</span> sitemap-generator-version=<span class="es1">\&quot;</span>&quot;</span> <span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetVersion</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\&quot;</span>&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">AddElement</span><span class="br0">&#40;</span><span class="kw2">new</span> GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span><span class="st0">&quot;generated-on=<span class="es1">\&quot;</span>&quot;</span> <span class="sy0">.</span> <span class="kw3">date</span><span class="br0">&#40;</span>get_option<span class="br0">&#40;</span><span class="st0">&quot;date_format&quot;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot; &quot;</span> <span class="sy0">.</span> get_option<span class="br0">&#40;</span><span class="st0">&quot;time_format&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\&quot;</span>&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>После чего комментируем эти строки. Либо используем <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p81018">
        <div class="code diff" id="p810code18">
--- sitemap-core.php.orig &nbsp; &nbsp; &nbsp; 2010-08-16 10:49:16.000000000 +0300<br />
<span class="re4">+++ sitemap-core.php &nbsp; &nbsp;<span class="nu0">2010</span>-08-<span class="nu0">23</span> <span class="nu0">20</span>:02:<span class="nu0">06.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">1654</span>,<span class="nu0">9</span> +<span class="nu0">1654</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorXmlEntry<span class="br0">&#40;</span>'&lt;' . '?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;' . $styleSheet . '&quot;?' . '&gt;'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //All comments as an asso. Array <span class="br0">&#40;</span>postID=&gt;commentCount<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $comments=<span class="br0">&#40;</span>$this-&gt;GetOption<span class="br0">&#40;</span>&quot;b_prio_provider&quot;<span class="br0">&#41;</span>!=&quot;&quot;?$this-&gt;GetComments<span class="br0">&#40;</span><span class="br0">&#41;</span>:array<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
        </div>
    </div>
</div>

<p>Теперь о том, почему это не спасает. <a href="http://blog.sjinks.pro/tag/tag-security/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  безопасность">Безопасность</a> через сокрытие (<em>security through obscurity</em>) — это то решение, которое может защитить лишь от школьника. Дело в том, что версию WordPress можно определить по его «отпечаткам пальцев» — CSS-файлам, версиям используемых javascript-библиотек (jQuery, TinyMCE), даже по названиям картинок. Установленные плагины можно определять перебором, либо пользуясь путями к их CSS/JS-файлам, которые часто можно подсмотреть в исходном коде страницы.</p>
<p>Да и по большому счету, если известен эксплойт, поражающий какую-то конкретную версию WordPress, то его можно использовать и без предварительного знания версии WordPress — либо нет. Если мне известна <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a> типа <em>SQL injection attack</em> для WordPress версии 2.3.1, проще автоматом ее прогнать по всем сайтам, чем сначала рыскать по ним в поисках версии.</p>
<p>Отсюда совет всем камрадам, страдающим паранойей: это — полумера, причем крайне неэффективная; используйте более эффективные решения.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/810-google-xml-sitemaps-remove-version-signature-from-sitemap/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/810-google-xml-sitemaps-remove-version-signature-from-sitemap/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Simple Tags 1.7.4.4: The New Bugs</title>
		<link>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 14:04:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=782</guid>
		<description><![CDATA[Исправляем старые и новые ошибки Сегодня наконец-то появилось время обновить старые плагины; в их числе оказался и Simple Tags. Честно говоря, версия 1.7.4.4 меня разочаровала: автор сломал автоматические ссылки меток. Теперь они не работают даже для английского языка. Резюмируя: в данной версии нужно исправить: автоматические ссылки меток; поддержку многобайтовых символов в автоматических ссылках; вызов register_uninstall_hook() при [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправляем старые и новые ошибки</em></h2>
<p>Сегодня наконец-то появилось время обновить старые плагины; в их числе оказался и <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a>. Честно говоря, версия 1.7.4.4 меня разочаровала: автор сломал автоматические ссылки меток. Теперь они не работают даже для английского языка.</p>
<p>Резюмируя: в данной версии нужно исправить:</p>
<ul>
<li>автоматические ссылки меток;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">поддержку многобайтовых символов в автоматических ссылках</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">вызов <code>register_uninstall_hook()</code> при каждом обращении к блогу</a>.</li>
</ul>
<p><span id="more-782"></span></p>
<p>Проблема с автоматическими ссылками возникла из-за невнимательности автора:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78221">
        <div class="code php" id="p782code21">
&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">randomArray</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// only continue if the database actually returned any links</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>Метод <code>randomArray()</code> теперь не возвращает массив (как это было в предыдущих версиях плагина), а изменяет тот массив, который передан ему в параметрах (<span class="codebox"><code class="php"><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span></code></span>). Но если раньше результат <span class="codebox"><code class="php"><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">randomArray</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span><span class="br0">&#41;</span></code></span> присваивался переменной <span class="codebox"><code class="php"><span class="re0">$link_tags</span></code></span>, то теперь эта переменная исчезла, и условие в <span class="codebox"><code class="php"><span class="kw1">if</span></code></span> теперь всегда ложно.</p>
<p><a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">Патч</a> для плагина (unified diff):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78222">
        <div class="code diff" id="p782code22">
diff -uwdBrN simple-tags/inc/client.php simple-tags.new/inc/client.php<br />
<span class="re3">--- simple-tags/inc/client.php&nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/inc/client.php&nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:<span class="nu0">14</span>:<span class="nu0">40.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">122</span>,<span class="nu0">8</span> +<span class="nu0">122</span>,<span class="nu0">8</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // Shuffle array<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;randomArray<span class="br0">&#40;</span>$this-&gt;link_tags<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; </span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $link_tags = $this-&gt;link_tags;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $this-&gt;randomArray<span class="br0">&#40;</span>$link_tags<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // HTML Rel <span class="br0">&#40;</span>tag/no-follow<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $rel = $this-&gt;buildRel<span class="br0">&#40;</span> $this-&gt;options<span class="br0">&#91;</span>'no_follow'<span class="br0">&#93;</span> <span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">157</span>,<span class="nu0">8</span> +<span class="nu0">157</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $filtered = ''; // will filter text token by token<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/\b&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;\b/&quot;.$case;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$0&lt;/a&gt;&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $quoted = preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = '/<span class="br0">&#40;</span>\PL|\A<span class="br0">&#41;</span><span class="br0">&#40;</span>' . $quoted . '<span class="br0">&#41;</span><span class="br0">&#40;</span>\PL|\Z<span class="br0">&#41;</span>/u'.$case;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '$1&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$2&lt;/a&gt;$3&quot;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for efficiency only tokenize if forced to do so<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $must_tokenize <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
diff -uwdBrN simple-tags/inc/inc.functions.php simple-tags.new/inc/inc.functions.php<br />
<span class="re3">--- simple-tags/inc/inc.functions.php &nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/inc/inc.functions.php &nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:09:<span class="nu0">06.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">4</span>,<span class="nu0">6</span> +<span class="nu0">4</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; *<br />
&nbsp; */<br />
&nbsp;function SimpleTags_Install<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re8">+ &nbsp; register_uninstall_hook <span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/simple-tags.php', 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; $options_from_table = get_option<span class="br0">&#40;</span> STAGS_OPTIONS_NAME <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> $options_from_table == false <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $options = <span class="br0">&#40;</span>array<span class="br0">&#41;</span> include<span class="br0">&#40;</span> dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/default.options.php' <span class="br0">&#41;</span>;<br />
diff -uwdBrN simple-tags/simple-tags.php simple-tags.new/simple-tags.php<br />
<span class="re3">--- simple-tags/simple-tags.php <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/simple-tags.php <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:07:<span class="nu0">42.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">3</span>,<span class="nu0">7</span> +<span class="nu0">3</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Plugin Name: Simple Tags<br />
&nbsp;Plugin URI: http://redmine.beapi.fr/projects/show/simple-tags<br />
&nbsp;Description: Extended Tagging for WordPress 2.8 and 2.9 ! Suggested Tags, Mass edit tags, Autocompletion, Tag Cloud Widgets, Related Posts, Related Tags, etc!<br />
<span class="re7">-Version: 1.7.4.4</span><br />
<span class="re8">+Version: 1.7.4.4.1</span><br />
&nbsp;Author: Amaury BALMER<br />
&nbsp;Author URI: http://www.herewithme.fr<br />
&nbsp;Text Domain: simpletags<br />
<span class="re6">@@ -<span class="nu0">23</span>,<span class="nu0">6</span> +<span class="nu0">23</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Contributors:<br />
&nbsp;- Kevin Drouvin <span class="br0">&#40;</span>kevin.drouvin@gmail.com - http://inside-dev.net<span class="br0">&#41;</span><br />
&nbsp;- Martin Modler <span class="br0">&#40;</span>modler@webformatik.com - http://www.webformatik.com<span class="br0">&#41;</span><br />
<span class="re8">+- Vladimir Kolesnikov &lt;vladimir at extrememember dot com&gt; - http://blog.sjinks.pro/</span><br />
&nbsp;<br />
&nbsp;Todo:<br />
&nbsp; &nbsp; Both :<br />
<span class="re6">@@ -<span class="nu0">55</span>,<span class="nu0">9</span> +<span class="nu0">56</span>,<span class="nu0">8</span> @@</span><br />
&nbsp;require<span class="br0">&#40;</span> STAGS_DIR . '/inc/tpl.functions.php'<span class="br0">&#41;</span>; // Templates functions<br />
&nbsp;require<span class="br0">&#40;</span> STAGS_DIR . '/inc/widgets.php'<span class="br0">&#41;</span>; &nbsp;&nbsp; &nbsp; // Widgets<br />
&nbsp;<br />
<span class="re7">-// Activation, uninstall</span><br />
<span class="re8">+// Activation</span><br />
&nbsp;register_activation_hook<span class="br0">&#40;</span>__FILE__, 'SimpleTags_Install' &nbsp; <span class="br0">&#41;</span>;<br />
<span class="re7">-register_uninstall_hook <span class="br0">&#40;</span>__FILE__, 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp;// Init ST<br />
&nbsp;function simple_tags_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>Для тех, кто патчи не любит, есть исправленная версия плагина (из исходного архива также удалены скриншоты): <strong><a href="http://d.sjinks.pro/wordpress/simple-tags-1.7.4.4.1.zip">скачать Simple Tags 1.7.4.4.1</a></strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Оптимизация All in One SEO Pack</title>
		<link>http://blog.sjinks.pro/wordpress/patches/707-all-in-one-seo-pack-optimization/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/707-all-in-one-seo-pack-optimization/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 05:35:33 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[All in One SEO Pack]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=707</guid>
		<description><![CDATA[Избавляемся от лишних запросов к базе данных Как оказалось, плагин All in One SEO Pack — один из основных источников запросов к базе данных на блогах с большим количеством страниц (page). Всё дело в том, что в All in One SEO Pack есть одна неотключаемая особенность: он пытается переписать все ссылки, которые выводятся через функцию wp_list_pages() [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/707-all-in-one-seo-pack-optimization/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Избавляемся от лишних запросов к базе данных</em></h2>
<p>Как оказалось, <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> All in One <a href="http://blog.sjinks.pro/tag/seo/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SEO">SEO</a> Pack — один из основных источников запросов к базе данных на блогах с большим количеством страниц (page). Всё дело в том, что в All in One <a href="http://blog.sjinks.pro/tag/seo/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SEO">SEO</a> Pack есть одна неотключаемая особенность: он пытается переписать все ссылки, которые выводятся через функцию <span class="codebox"><code class="php">wp_list_pages<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> (обычно эта функция вызывается из заголовка или подвала темы и используется для создания меню).</p>
<p>Вообще переписывание ссылок — это отдельная история, заслуживающая отдельной статьи. Если вкратце, то плагин берёт метаданные из поста и заменяет ими <code>title</code> и текст ссылки.</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/11/aiosp.png" rel="lightbox" title="All in One SEO Pack: Edit Page"><img src="http://static.sjinks.info/wp-content/uploads/2009/11/aiosp-300x115.png" alt="All in One SEO Pack: Edit Page" title="All in One SEO Pack: Edit Page" width="300" height="115" class="size-medium wp-image-708" /></a></p>
<p>Что характерно, если поле <code>Title Attribute</code> пустое, то <a href="http://blog.sjinks.pro/tag/all-in-one-seo-pack/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  All in One SEO Pack">All in One SEO Pack</a> вообще затрёт <code>title</code> ссылки.</p>
<p>Проблема с запросами возникает из-за того, что All in One SEO Pack читает метаданные для каждой страницы, присутствующей в результате, который вернула функция <span class="codebox"><code class="php">wp_list_pages<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>. Если в меню тридцать страниц, то в результате получим тридцать лишних запросов к базе данных. Умножаем на количество показов страниц (страниц в широком смысле, а не в терминах <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>) и получаем большую цифру.<span id="more-707"></span></p>
<p>К счастью, у проблемы есть решение. Я даже о нём писал — ещё год назад — <strong><a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/">Секреты update_postmeta_cache(): Способ увеличения производительности при чтении метаданных записей</a></strong>.</p>
<p>В файле <code>all-in-one-seo-pack/all-in-one-seo-pack.php</code> нужно заменить несколько строчек.</p>
<ol>
<li>В районе 642 строки есть такой код:
          
<div class="codebox">
    <div class="the_code" style="" id="p70728">
        <div class="code php" id="p707code28">
<ol class="php" style="font-family:monospace;" start="642"><li class="li1"><div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$aioseop_options</span><span class="br0">&#91;</span><span class="st_h">'aiosp_enabled'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; add_action<span class="br0">&#40;</span><span class="st_h">'wp_list_pages'</span><span class="sy0">,</span> <span class="st_h">'aioseop_list_pages'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Нужно вместо <span class="codebox"><code class="php">add_action</code></span> поставить <span class="codebox"><code class="php">add_filter</code></span>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p70729">
        <div class="code php" id="p707code29">
<ol class="php" style="font-family:monospace;" start="642"><li class="li1"><div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$aioseop_options</span><span class="br0">&#91;</span><span class="st_h">'aiosp_enabled'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; add_filter<span class="br0">&#40;</span><span class="st_h">'wp_list_pages'</span><span class="sy0">,</span> <span class="st_h">'aioseop_list_pages'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

А если функциональность с переписыванием <code>title</code> ссылок вообще не нужна, то вместо замены слова проще закомментировать всю строку.</li>
<li>Затем нужно найти функцию <span class="codebox"><code class="php">aioseop_list_pages<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>:
          
<div class="codebox">
    <div class="the_code" style="" id="p70730">
        <div class="code php" id="p707code30">
<ol class="php" style="font-family:monospace;" start="665"><li class="li1"><div class="de1"><span class="co1">// The following two functions copied entirely and modified slightly from Sarah G's Page Menu Editor, http://wordpress.org/extend/plugins/page-menu-editor/</span></div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> aioseop_list_pages<span class="br0">&#40;</span><span class="re0">$content</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$url</span> <span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'/\//'</span><span class="sy0">,</span> <span class="st_h">'/\./'</span><span class="sy0">,</span> <span class="st_h">'/\-/'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'\/'</span><span class="sy0">,</span> <span class="st_h">'\.'</span><span class="sy0">,</span> <span class="st_h">'\-'</span><span class="br0">&#41;</span><span class="sy0">,</span> get_option<span class="br0">&#40;</span><span class="st_h">'siteurl'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pattern</span> <span class="sy0">=</span> <span class="st_h">'/&lt;li class=&quot;page_item page-item-(\d+)([^\&quot;]*)&quot;&gt;&lt;a href=\&quot;([^\&quot;]+)&quot; title=&quot;([^\&quot;]+)&quot;&gt;([^&lt;]+)&lt;\/a&gt;/i'</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">preg_replace_callback</span><span class="br0">&#40;</span><span class="re0">$pattern</span><span class="sy0">,</span> <span class="st0">&quot;aioseop_filter_callback&quot;</span><span class="sy0">,</span> <span class="re0">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>и переписать её:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p70731">
        <div class="code php" id="p707code31">
<span class="kw2">function</span> aioseop_list_pages<span class="br0">&#40;</span><span class="re0">$content</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$matches</span> <span class="sy0">=</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">preg_match_all</span><span class="br0">&#40;</span><span class="st_h">'/&lt;li class=&quot;page_item page-item-(\d+)/i'</span><span class="sy0">,</span> <span class="re0">$content</span><span class="sy0">,</span> <span class="re0">$matches</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update_postmeta_cache<span class="br0">&#40;</span><span class="kw3">array_values</span><span class="br0">&#40;</span><span class="re0">$matches</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">unset</span><span class="br0">&#40;</span><span class="re0">$matches</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pattern</span> <span class="sy0">=</span> <span class="st_h">'/&lt;li class=&quot;page_item page-item-(\d+)([^\&quot;]*)&quot;&gt;&lt;a href=\&quot;([^\&quot;]+)&quot; title=&quot;([^\&quot;]+)&quot;&gt;([^&lt;]+)&lt;\/a&gt;/i'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">preg_replace_callback</span><span class="br0">&#40;</span><span class="re0">$pattern</span><span class="sy0">,</span> <span class="st0">&quot;aioseop_filter_callback&quot;</span><span class="sy0">,</span> <span class="re0">$content</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$content</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

</li>
</ol>
<p>Это поможет избавиться от лишних запросов.</p>
<p><a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">Патч</a> в формате unified diff (внимание, формат концов строк может различаться):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p70732">
        <div class="code diff" id="p707code32">
--- all_in_one_seo_pack.orig.php&nbsp; &nbsp; 2009-12-16 09:37:23.000000000 +0200<br />
<span class="re4">+++ all_in_one_seo_pack.php <span class="nu0">2009</span>-<span class="nu0">12</span>-<span class="nu0">17</span> 06:00:<span class="nu0">32.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">632</span>,<span class="nu0">7</span> +<span class="nu0">632</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;<span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp;if<span class="br0">&#40;</span>$aioseop_options<span class="br0">&#91;</span>'aiosp_enabled'<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; add_action<span class="br0">&#40;</span>'wp_list_pages', 'aioseop_list_pages'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; add_filter<span class="br0">&#40;</span>'wp_list_pages', 'aioseop_list_pages'<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; remove_action<span class="br0">&#40;</span> 'wp_head', 'rel_canonical' <span class="br0">&#41;</span>;<br />
&nbsp;<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re6">@@ -<span class="nu0">688</span>,<span class="nu0">11</span> +<span class="nu0">688</span>,<span class="nu0">17</span> @@</span><br />
&nbsp;<br />
&nbsp;// The following two functions copied entirely and modified slightly from Sarah G's Page Menu Editor, http://wordpress.org/extend/plugins/page-menu-editor/<br />
&nbsp;function aioseop_list_pages<span class="br0">&#40;</span>$content<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $url = preg_replace<span class="br0">&#40;</span>array<span class="br0">&#40;</span>'/\//', '/\./', '/\-/'<span class="br0">&#41;</span>, array<span class="br0">&#40;</span>'\/', '\.', '\-'<span class="br0">&#41;</span>, get_option<span class="br0">&#40;</span>'siteurl'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $matches = array<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>preg_match_all<span class="br0">&#40;</span>'/&lt;li class=&quot;page_item page-item-<span class="br0">&#40;</span>\d+<span class="br0">&#41;</span>/i', $content, $matches<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update_postmeta_cache<span class="br0">&#40;</span>array_values<span class="br0">&#40;</span>$matches<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unset<span class="br0">&#40;</span>$matches<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $pattern = '/&lt;li class=&quot;page_item page-item-<span class="br0">&#40;</span>\d+<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#91;</span>^\&quot;<span class="br0">&#93;</span>*<span class="br0">&#41;</span>&quot;&gt;&lt;a href=\&quot;<span class="br0">&#40;</span><span class="br0">&#91;</span>^\&quot;<span class="br0">&#93;</span>+<span class="br0">&#41;</span>&quot; title=&quot;<span class="br0">&#40;</span><span class="br0">&#91;</span>^\&quot;<span class="br0">&#93;</span>+<span class="br0">&#41;</span>&quot;&gt;<span class="br0">&#40;</span><span class="br0">&#91;</span>^&lt;<span class="br0">&#93;</span>+<span class="br0">&#41;</span>&lt;\/a&gt;/i';<br />
&nbsp; &nbsp; &nbsp; &nbsp; return preg_replace_callback<span class="br0">&#40;</span>$pattern, &quot;aioseop_filter_callback&quot;, $content<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; return $content;</span><br />
<span class="re8">+ &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
&nbsp;function aioseop_filter_callback<span class="br0">&#40;</span>$matches<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>$matches<span class="br0">&#91;</span>1<span class="br0">&#93;</span> &amp;&amp; !empty<span class="br0">&#40;</span>$matches<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> $postID = $matches<span class="br0">&#91;</span>1<span class="br0">&#93;</span>;
        </div>
    </div>
</div>

<p><strong>UPDATE:</strong> обновил патч, теперь он подходит для All in One SEO Pack 1.6.8.2 и поместил патч на <a href="http://wordpress.org/support/topic/342313?replies=0">форум поддержки</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/707-all-in-one-seo-pack-optimization/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/707-all-in-one-seo-pack-optimization/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Еще одна оптимизация NextGen Gallery</title>
		<link>http://blog.sjinks.pro/wordpress/patches/703-yet-another-nextgen-gallery-optimization/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/703-yet-another-nextgen-gallery-optimization/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 21:19:54 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[NextGen Gallery]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[оптимизация]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=703</guid>
		<description><![CDATA[Минус один UPDATE при каждом обращении к блогу Плагин NextGen Gallery имеет одну неприятную особенность: при каждом обращении к блогу выполняется обновление (UPDATE в терминах MySQL) таблицы wp_options. Хотя для «средних» блогов это не критично, для хорошо посещаемых ресурсов это плохо по ряду причин: Обновление таблицы wp_options сбрасывает кэш запросов MySQL к таблице wp_options, что [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/703-yet-another-nextgen-gallery-optimization/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Минус один UPDATE при каждом обращении к блогу</em></h2>
<p><a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">Плагин</a> <a href="http://blog.sjinks.pro/tag/nextgen-gallery/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  NextGen Gallery">NextGen Gallery</a> имеет одну неприятную особенность: при каждом обращении к блогу выполняется обновление (<span class="codebox"><code class="mysql"><span class="kw1">UPDATE</span></code></span> в терминах MySQL) таблицы <code>wp_options</code>. Хотя для «средних» блогов это не критично, для хорошо посещаемых ресурсов это плохо по ряду причин:</p>
<ol>
<li>Обновление таблицы <code>wp_options</code> сбрасывает кэш запросов MySQL к таблице <code>wp_options</code>, что приводит к необходимости реального выполнения запросов на выборку данных (с учётом огромного количества записей — благодаря всяким разным плагинам — это лишний трафик между PHP и MySQL).</li>
<li>Выполнение операции обновления таблицы при использовании MyISAM приводит к блокировке таблицы; при высокой посещаемости это приводит к вынужденному ожиданию освобождения таблицы и негативно сказывается на нагрузке и производительности.</li>
<li>При использовании плагинов объектного кэширования каждый вызов <span class="codebox"><code class="php">update_option<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> приводит к необходимости обновления и записи кэша; обновление файлового объектного кэша приводит к лишним обращениям к диску (которых на виртуальных серверах лучше избегать).</li>
<li>В конце концов, это лишний запрос, который <strong>не является необходимым</strong>.</li>
</ol>
<p><span id="more-703"></span></p>
<p>Использование плагина <a href="http://blog.sjinks.pro/wordpress-plugins/sqlmon/">MySQL Monitor</a> показывает:</p>
<ul>
<li><strong>Запрос:</strong>
          
<div class="codebox">
    <div class="the_code" style="" id="p70336">
        <div class="code mysql" id="p703code36">
<span class="kw1">UPDATE</span> <span class="st0">`wp<span class="es1">_</span>options`</span> <span class="kw1">SET</span> <span class="st0">`option<span class="es1">_</span>value`</span> <span class="sy1">=</span> <span class="st0">'a:3:{i:0;b:0;s:29:<span class="es0">\&quot;</span>nextgen-gallery/nggallery.php<span class="es0">\&quot;</span>;a:2:{i:0;s:9:<span class="es0">\&quot;</span>nggLoader<span class="es0">\&quot;</span>;i:1;s:9:<span class="es0">\&quot;</span>uninstall<span class="es0">\&quot;</span>;}...}'</span> <span class="kw1">WHERE</span> <span class="st0">`option<span class="es1">_</span>name`</span> <span class="sy1">=</span> <span class="st0">'uninstall<span class="es1">_</span>plugins'</span>
        </div>
    </div>
</div>

</li>
<li><strong>Трасса вызовов:</strong>
          
<div class="codebox">
    <div class="the_code" style="" id="p70337">
        <div class="code text" id="p703code37">
wp-includes/wp-db.php, 830 (DbProfile::query)<br />
wp-includes/functions.php, 533 (wpdb::update)<br />
wp-includes/plugin.php, 608 (update_option)<br />
wp-content/plugins/nextgen-gallery/nggallery.php, 80 (register_uninstall_hook)<br />
wp-content/plugins/nextgen-gallery/nggallery.php, 429 (nggLoader::nggLoader)<br />
wp-settings.php, 566 (include_once)<br />
wp-config.php, 84 (require_once)<br />
wp-load.php, 30 (require_once)<br />
wp-blog-header.php, 12 (require_once)<br />
index.php, 17 (require)
        </div>
    </div>
</div>

</li>
</ul>
<p>Говоря простым языком, NextGen Gallery <strong>при каждой загрузке <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a></strong> регистрирует функцию деинсталляции плагина. Таким образом, если мы имеем 25,000 показов страниц в день, это выливается в 25,000 (относительно медленных) запросов <code>UPDATE</code> к базе.</p>
<p>Проблема решается очень просто: вызов функции <span class="codebox"><code class="php">register_uninstall_hook</code></span> переносится из конструктора <span class="codebox"><code class="php">nggLoader<span class="sy0">::</span><span class="me2">nggLoader</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> (файл <code>nextgen-gallery/nggallery.php</code>) в самый конец функции <span class="codebox"><code class="php">nggLoader<span class="sy0">::</span><span class="me2">activate</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> (за строку <span class="codebox"><code class="php">delete_option<span class="br0">&#40;</span> <span class="st_h">'ngg_update_exists'</span> <span class="br0">&#41;</span><span class="sy0">;</span></code></span>).</p>
<p>Получаем простой <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p70338">
        <div class="code diff" id="p703code38">
--- nggallery.php.old &nbsp; 2009-11-23 22:06:09.000000000 +0200<br />
<span class="re4">+++ nggallery.php &nbsp; &nbsp; &nbsp; <span class="nu0">2009</span>-<span class="nu0">11</span>-<span class="nu0">23</span> <span class="nu0">22</span>:07:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">76</span>,<span class="nu0">9</span> +<span class="nu0">76</span>,<span class="nu0">6</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; register_activation_hook<span class="br0">&#40;</span> $this-&gt;plugin_name, array<span class="br0">&#40;</span>&amp;$this, 'activate'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; register_deactivation_hook<span class="br0">&#40;</span> $this-&gt;plugin_name, array<span class="br0">&#40;</span>&amp;$this, 'deactivate'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;&nbsp; <br />
&nbsp;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; // Register a uninstall hook to remove all tables &amp; option automatic</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; register_uninstall_hook<span class="br0">&#40;</span> $this-&gt;plugin_name, array<span class="br0">&#40;</span>'nggLoader', 'uninstall'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;</span><br />
<span class="re7">-</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; // Start this plugin once all other plugins are fully loaded<br />
&nbsp; &nbsp; &nbsp; &nbsp; add_action<span class="br0">&#40;</span> 'plugins_loaded', array<span class="br0">&#40;</span>&amp;$this, 'start_plugin'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="re6">@@ -<span class="nu0">376</span>,<span class="nu0">6</span> +<span class="nu0">373</span>,<span class="nu0">8</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; // remove the update message<br />
&nbsp; &nbsp; &nbsp; &nbsp; delete_option<span class="br0">&#40;</span> 'ngg_update_exists' <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; // Register a uninstall hook to remove all tables &amp; option automatic</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; register_uninstall_hook<span class="br0">&#40;</span> $this-&gt;plugin_name, array<span class="br0">&#40;</span>'nggLoader', 'uninstall'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; function deactivate<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/703-yet-another-nextgen-gallery-optimization/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/703-yet-another-nextgen-gallery-optimization/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>WordPress 2.8 и плагин Post Templates</title>
		<link>http://blog.sjinks.pro/wordpress/patches/608-wordpress-2-8-and-post-templates-plugin/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/608-wordpress-2-8-and-post-templates-plugin/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 01:01:23 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Post Templates]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=608</guid>
		<description><![CDATA[Патч, исправляющий ошибки в заброшенном плагине WordPress 2.8 сказался не самым лучшим образом на плагине Post Templates от Vincent Pratt. На данный момент в плагине присутствуют несколько серьёзных ошибок, которую сводят его практическую пользу к нулю. Хуже всего, что автор, по-видимому, забросил плагин, и исправлять ошибки теперь некому. Итак, имеются следующие ошибки: Ошибка «You do not [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/608-wordpress-2-8-and-post-templates-plugin/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em><a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">Патч</a>, исправляющий ошибки в заброшенном плагине</em></h2>
<p><a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 2.8 сказался не самым лучшим образом на плагине <a href="http://wordpress.org/extend/plugins/post-template/">Post Templates</a> от Vincent Pratt. На данный момент в плагине присутствуют несколько серьёзных ошибок, которую сводят его практическую пользу к нулю. Хуже всего, что автор, по-видимому, забросил <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a>, и исправлять ошибки теперь некому.</p>
<p>Итак, имеются следующие ошибки:</p>
<ul>
<li>Ошибка «<strong>You do not have sufficient permissions to access this page</strong>» при попытке создания нового шаблона или редактировании существующего (и еще в нескольких местах) — появилась в WordPress 2.8.1 в результате исправления <a href="http://corelabs.coresecurity.com/index.php?module=FrontEndMod&amp;action=view&amp;type=advisory&amp;name=WordPress_Privileges_Unchecked">этой уязвимости</a>;</li>
<li><strong>Fatal error: Maximum execution time of 30 seconds exceeded in /wp-includes/plugin.php on line 385</strong> при заходе на страницу редактирования страниц (звучит-то как!);</li>
<li>невозможность сохранения шаблонов, так как отсутствует кнопка «Сохранить» (это если вы побороли первую ошибку, либо у вас WordPress 2.8).</li>
</ul>
<p><span id="more-608"></span></p>
<p>Теперь о том, как это всё исправить. Я сначала хотел выложить отдельные патчи для каждой ошибки, но потом передумал и решил выложить патч целиком (как обычно, в формате unified diff):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p60840">
        <div class="code diff" id="p608code40">
diff -uwdBrN post-template/includes/edit-page-template-page.php post-template.my/includes/edit-page-template-page.php<br />
<span class="re3">--- post-template/includes/edit-page-template-page.php&nbsp; <span class="nu0">2009</span>-02-<span class="nu0">19</span> <span class="nu0">10</span>:<span class="nu0">52</span>:<span class="nu0">22.000000000</span> +0200</span><br />
<span class="re4">+++ post-template.my/includes/edit-page-template-page.php &nbsp; <span class="nu0">2009</span>-06-<span class="nu0">15</span> 05:<span class="nu0">59</span>:<span class="nu0">17.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">108</span>,<span class="nu0">7</span> +<span class="nu0">108</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &lt;input type=&quot;hidden&quot; name=&quot;template_id&quot; value=&quot;&lt;?php echo $template_id; ?&gt;&quot; /&gt;<br />
&nbsp; &nbsp; &lt;input type=&quot;hidden&quot; name=&quot;type&quot; value=&quot;&lt;?php echo $template_type; ?&gt;&quot; /&gt;<br />
&nbsp; &nbsp; &lt;input type=&quot;hidden&quot; name=&quot;parent&quot; value=&quot;&lt;?php echo $template_parent; ?&gt;&quot; /&gt;<br />
<span class="re7">- &nbsp; &lt;div id=&quot;poststuff&quot; class=&quot;metabox-holder&quot;&gt;</span><br />
<span class="re8">+ &nbsp; &lt;div id=&quot;poststuff&quot; class=&quot;metabox-holder has-right-sidebar&quot;&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;div id=&quot;side-info-column&quot; class=&quot;inner-sidebar&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div id=&quot;side-sortables&quot; class=&quot;meta-box-sortables ui-sortable&quot; style=&quot;position: relative;&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div id=&quot;submitdiv&quot; class=&quot;postbox&quot;&gt;<br />
diff -uwdBrN post-template/includes/edit-post-template-page.php post-template.my/includes/edit-post-template-page.php<br />
<span class="re3">--- post-template/includes/edit-post-template-page.php&nbsp; <span class="nu0">2009</span>-02-<span class="nu0">19</span> <span class="nu0">10</span>:<span class="nu0">52</span>:<span class="nu0">22.000000000</span> +0200</span><br />
<span class="re4">+++ post-template.my/includes/edit-post-template-page.php &nbsp; <span class="nu0">2009</span>-06-<span class="nu0">14</span> <span class="nu0">12</span>:<span class="nu0">15</span>:<span class="nu0">35.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">110</span>,<span class="nu0">7</span> +<span class="nu0">110</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &lt;input type=&quot;hidden&quot; name=&quot;type&quot; value=&quot;&lt;?php echo $template_type; ?&gt;&quot; /&gt;<br />
&nbsp; &nbsp; &lt;input type=&quot;hidden&quot; name=&quot;parent&quot; value=&quot;&lt;?php echo $template_parent; ?&gt;&quot; /&gt;<br />
&nbsp;<br />
<span class="re7">- &nbsp; &lt;div id=&quot;poststuff&quot; class=&quot;metabox-holder&quot;&gt;</span><br />
<span class="re8">+ &nbsp; &lt;div id=&quot;poststuff&quot; class=&quot;metabox-holder has-right-sidebar&quot;&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;div id=&quot;side-info-column&quot; class=&quot;inner-sidebar&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div id=&quot;side-sortables&quot; class=&quot;meta-box-sortables ui-sortable&quot; style=&quot;position: relative;&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div id=&quot;submitdiv&quot; class=&quot;postbox&quot;&gt;<br />
diff -uwdBrN post-template/includes/managepages/managepages.php post-template.my/includes/managepages/managepages.php<br />
<span class="re3">--- post-template/includes/managepages/managepages.php&nbsp; <span class="nu0">2009</span>-02-<span class="nu0">19</span> <span class="nu0">10</span>:<span class="nu0">52</span>:<span class="nu0">22.000000000</span> +0200</span><br />
<span class="re4">+++ post-template.my/includes/managepages/managepages.php &nbsp; <span class="nu0">2009</span>-06-<span class="nu0">14</span> 04:<span class="nu0">41</span>:<span class="nu0">11.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">211</span>,<span class="nu0">7</span> +<span class="nu0">211</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for<span class="br0">&#40;</span> d in data <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for<span class="br0">&#40;</span> e in data<span class="br0">&#91;</span>d<span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;jQuery<span class="br0">&#40;</span>'&lt;td&gt;'+data<span class="br0">&#91;</span>d<span class="br0">&#93;</span><span class="br0">&#91;</span>e<span class="br0">&#93;</span>+'&lt;/td&gt;'<span class="br0">&#41;</span>.insertBefore<span class="br0">&#40;</span>'#page-'+d+'/td:nth-child<span class="br0">&#40;</span>'+position+'<span class="br0">&#41;</span>'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;jQuery<span class="br0">&#40;</span>'&lt;td&gt;'+data<span class="br0">&#91;</span>d<span class="br0">&#93;</span><span class="br0">&#91;</span>e<span class="br0">&#93;</span>+'&lt;/td&gt;'<span class="br0">&#41;</span>.insertBefore<span class="br0">&#40;</span>'tbody/tr#page-'+d+'/td:nth-child<span class="br0">&#40;</span>'+position+'<span class="br0">&#41;</span>'<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="br0">&#41;</span>;<br />
diff -uwdBrN post-template/includes/plugin-class.php post-template.my/includes/plugin-class.php<br />
<span class="re3">--- post-template/includes/plugin-class.php <span class="nu0">2009</span>-02-<span class="nu0">19</span> <span class="nu0">10</span>:<span class="nu0">52</span>:<span class="nu0">22.000000000</span> +0200</span><br />
<span class="re4">+++ post-template.my/includes/plugin-class.php&nbsp; <span class="nu0">2009</span>-08-06 03:<span class="nu0">28</span>:<span class="nu0">42.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">155</span>,<span class="nu0">6</span> +<span class="nu0">155</span>,<span class="nu0">14</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add_options_page<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Post Templates', POST_TEMPLATES_I18N_DOMAIN<span class="br0">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __<span class="br0">&#40;</span>'Post Templates', POST_TEMPLATES_I18N_DOMAIN<span class="br0">&#41;</span>, 0,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'post-template/includes/options-page.php' <span class="br0">&#41;</span>;<br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; global $_registered_pages;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $file = plugin_basename<span class="br0">&#40;</span>'post-template/includes/import-page.php'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hookname = get_plugin_page_hookname<span class="br0">&#40;</span>'post-template/includes/import-page.php', ''<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_registered_pages<span class="br0">&#91;</span>$hookname<span class="br0">&#93;</span> = true;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $file = plugin_basename<span class="br0">&#40;</span>'post-template/includes/help-page.php'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hookname = get_plugin_page_hookname<span class="br0">&#40;</span>'post-template/includes/help-page.php', ''<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $_registered_pages<span class="br0">&#91;</span>$hookname<span class="br0">&#93;</span> = true;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>&nbsp; &nbsp; current_user_can<span class="br0">&#40;</span>POST_TEMPLATES_VIEW_TEMPLATES_CAP<span class="br0">&#41;</span> <br />
<span class="re6">@@ -<span class="nu0">165</span>,<span class="nu0">20</span> +<span class="nu0">173</span>,<span class="nu0">20</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'post-template/includes/manage-templates-page.php', <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '', <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WP_CONTENT_URL . '/plugins/post-template/images/menu-icon.png' <span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; plugins_url<span class="br0">&#40;</span>'post-template/images/menu-icon.png'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>current_user_can<span class="br0">&#40;</span>POST_TEMPLATES_CREATE_TEMPLATES_CAP<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add_submenu_page<span class="br0">&#40;</span> 'post-template/includes/manage-templates-page.php',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __<span class="br0">&#40;</span>'New Post Template', POST_TEMPLATES_I18N_DOMAIN<span class="br0">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __<span class="br0">&#40;</span>'New Post Template', POST_TEMPLATES_I18N_DOMAIN<span class="br0">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'admin.php?page=post-template/includes/edit-post-template-page.php' <span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'post-template/includes/edit-post-template-page.php' <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add_submenu_page<span class="br0">&#40;</span> 'post-template/includes/manage-templates-page.php',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __<span class="br0">&#40;</span>'New Page Template', POST_TEMPLATES_I18N_DOMAIN<span class="br0">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __<span class="br0">&#40;</span>'New Page Template', POST_TEMPLATES_I18N_DOMAIN<span class="br0">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'admin.php?page=post-template/includes/edit-page-template-page.php' <span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'post-template/includes/edit-page-template-page.php' <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
diff -uwdBrN post-template/post-template.php post-template.my/post-template.php<br />
<span class="re3">--- post-template/post-template.php <span class="nu0">2009</span>-02-<span class="nu0">19</span> <span class="nu0">10</span>:<span class="nu0">52</span>:<span class="nu0">22.000000000</span> +0200</span><br />
<span class="re4">+++ post-template.my/post-template.php&nbsp; <span class="nu0">2009</span>-06-<span class="nu0">26</span> 06:<span class="nu0">42</span>:<span class="nu0">15.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">60</span>,<span class="nu0">7</span> +<span class="nu0">60</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;require_once<span class="br0">&#40;</span>POST_TEMPLATES_DIR . '/includes/dashboard-widget-class.php'<span class="br0">&#41;</span>;<br />
&nbsp;require_once<span class="br0">&#40;</span>POST_TEMPLATES_DIR . '/includes/post-templates-dao-class.php'<span class="br0">&#41;</span>;<br />
&nbsp;require_once<span class="br0">&#40;</span>POST_TEMPLATES_DIR . '/includes/post-templates-shortcodes-class.php'<span class="br0">&#41;</span>;<br />
<span class="re7">-require_once<span class="br0">&#40;</span>POST_TEMPLATES_DIR . '/includes/managepages/managepages.php'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+//require_once<span class="br0">&#40;</span>POST_TEMPLATES_DIR . '/includes/managepages/managepages.php'<span class="br0">&#41;</span>;</span><br />
&nbsp;//############################################################################<br />
&nbsp;<br />
&nbsp;//############################################################################
        </div>
    </div>
</div>

<p>Первый и второй блоки исправляют <a href="http://wordpress.org/support/topic/282163#post-1110588">третью ошибку</a>, третий блок исправляет ошибку, <a href="http://wordpress.org/support/topic/282163?replies=5#post-1113758">на которую пожаловался ChuckMcB</a>, четвёртый и пятый блоки исправляют <a href="http://wordpress.org/support/topic/289046">первую ошибку</a>, шестой блок — <a href="http://wordpress.org/support/topic/289427">вторую</a>.</p>
<p><strong>Скачать:</strong></p>
<ul>
<li><strong><a href='http://static.sjinks.info/wp-content/uploads/2009/08/post-template.diff'>патч, исправляющий ошибки в коде Post Templates</a></strong>;</li>
<li><strong><a href='http://static.sjinks.info/wp-content/uploads/2009/08/post-template.3.3.0.1.zip'>исправленную версию плагина Post Templates</a></strong>.</li>
</ul>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/608-wordpress-2-8-and-post-templates-plugin/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/608-wordpress-2-8-and-post-templates-plugin/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

