<?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; bbPress</title>
	<atom:link href="http://blog.sjinks.pro/bbpress/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>SJ Hook Profiler — плагин для измерения производительности хуков</title>
		<link>http://blog.sjinks.pro/wordpress/plugins/642-sj-hook-profiler/</link>
		<comments>http://blog.sjinks.pro/wordpress/plugins/642-sj-hook-profiler/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 23:01:11 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[bbPress]]></category>
		<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[SJ Hook Profiler]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[оптимизация]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=642</guid>
		<description><![CDATA[Поиск слабых мест в WordPress и bbPress Сразу оговорюсь, что речь пойдёт совсем не о боксе, а о WordPress и bbPress. Разработчики плагинов WordPress и bbPress используют две функции для расширения функциональности WordPress/bbPress: это add_action() и add_filter(). Первая служит для установки обработчика некоторого события, вторая — для установки фильтра. Под хуком подразумевается обобщённое понятие (либо фильтр, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/plugins/642-sj-hook-profiler/">источник</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> и <a href="http://blog.sjinks.pro/tag/bbpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  bbPress">bbPress</a></em></h2>
<p>Сразу оговорюсь, что речь пойдёт совсем не о боксе, а о WordPress и bbPress.</p>
<p>Разработчики плагинов WordPress и bbPress используют две функции для расширения функциональности WordPress/bbPress: это <span class="codebox"><code class="php">add_action<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> и <span class="codebox"><code class="php">add_filter<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>. Первая служит для установки обработчика некоторого события, вторая — для установки фильтра. Под <dfn>хуком</dfn> подразумевается обобщённое понятие (либо фильтр, либо обработчик).</p>
<p>Как показывает практика, б<em>о</em>льшая часть времени генерации страницы уходит именно на вызов обработчиков и фильтров. И когда возникает вопрос: почему время генерации страницы такое большое, а запроса всего три, и они выполняются за сотые доли секунды, на помощь приходит данный <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a>.<span id="more-642"></span></p>
<p>В отличие от WP Tuner, которому явно нужно указывать, какие события нужно профилировать, <a href="http://blog.sjinks.pro/tag/sj-hook-profiler/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SJ Hook Profiler">SJ Hook Profiler</a> автоматически определяет <em>все</em> используемые хуки и устанавливает обработчики, измеряющие их время работы. На выходе получается что-то вида данной таблицы:</p>
<table class="hookdebug">
<thead>
<tr>
<th>Hook Name</th>
<th>Total Time</th>
<th>Invocations</th>
<th>Average Time</th>
</tr>
</thead>
<tbody>
<tr>
<td>pre_option_gmt_offset</td>
<td>0.000169</td>
<td>1</td>
<td>0.000169</td>
</tr>
<tr>
<td>option_blog_charset</td>
<td>0.000405</td>
<td>11</td>
<td>0.000037</td>
</tr>
<tr>
<td>plugins_loaded</td>
<td>0.014295</td>
<td>1</td>
<td>0.014295</td>
</tr>
<tr>
<td>option_siteurl</td>
<td>0.000810</td>
<td>26</td>
<td>0.000031</td>
</tr>
<tr>
<td>option_home</td>
<td>0.004852</td>
<td>160</td>
<td>0.000030</td>
</tr>
<tr>
<td>sanitize_comment_cookies</td>
<td>0.000117</td>
<td>1</td>
<td>0.000117</td>
</tr>
<tr>
<td>option_category_base</td>
<td>0.000029</td>
<td>1</td>
<td>0.000029</td>
</tr>
<tr>
<td>option_tag_base</td>
<td>0.000027</td>
<td>1</td>
<td>0.000027</td>
</tr>
<tr>
<td>setup_theme</td>
<td>0.000030</td>
<td>1</td>
<td>0.000030</td>
</tr>
<tr>
<td>wp_default_scripts</td>
<td>0.001951</td>
<td>1</td>
<td>0.001951</td>
</tr>
<tr>
<td>set_current_user</td>
<td>0.000114</td>
<td>1</td>
<td>0.000114</td>
</tr>
<tr>
<td>init</td>
<td>0.011603</td>
<td>1</td>
<td>0.011603</td>
</tr>
<tr>
<td>widgets_init</td>
<td>0.003384</td>
<td>1</td>
<td>0.003384</td>
</tr>
<tr>
<td>wp_default_styles</td>
<td>0.000349</td>
<td>1</td>
<td>0.000349</td>
</tr>
<tr>
<td>query_vars</td>
<td>0.000036</td>
<td>1</td>
<td>0.000036</td>
</tr>
<tr>
<td>sanitize_title</td>
<td>0.001518</td>
<td>17</td>
<td>0.000089</td>
</tr>
<tr>
<td>posts_where</td>
<td>0.000033</td>
<td>1</td>
<td>0.000033</td>
</tr>
<tr>
<td>the_posts</td>
<td>0.000127</td>
<td>1</td>
<td>0.000127</td>
</tr>
<tr>
<td>template_redirect</td>
<td>0.000541</td>
<td>1</td>
<td>0.000541</td>
</tr>
<tr>
<td>bloginfo</td>
<td>0.002297</td>
<td>8</td>
<td>0.000287</td>
</tr>
<tr>
<td>term_name</td>
<td>0.000621</td>
<td>2</td>
<td>0.000310</td>
</tr>
<tr>
<td>term_description</td>
<td>0.000982</td>
<td>2</td>
<td>0.000491</td>
</tr>
<tr>
<td>single_post_title</td>
<td>0.000468</td>
<td>2</td>
<td>0.000234</td>
</tr>
<tr>
<td>wp_title</td>
<td>0.000747</td>
<td>2</td>
<td>0.000373</td>
</tr>
<tr>
<td>wp_head</td>
<td>0.020773</td>
<td>1</td>
<td>0.020773</td>
</tr>
<tr>
<td>comments_open</td>
<td>0.000373</td>
<td>4</td>
<td>0.000093</td>
</tr>
<tr>
<td>the_title</td>
<td>0.011747</td>
<td>46</td>
<td>0.000255</td>
</tr>
<tr>
<td>wp_print_styles</td>
<td>0.000175</td>
<td>2</td>
<td>0.000088</td>
</tr>
<tr>
<td>style_loader_src</td>
<td>0.000330</td>
<td>9</td>
<td>0.000037</td>
</tr>
<tr>
<td>wp_print_scripts</td>
<td>0.000440</td>
<td>1</td>
<td>0.000440</td>
</tr>
<tr>
<td>print_scripts_array</td>
<td>0.000050</td>
<td>1</td>
<td>0.000050</td>
</tr>
<tr>
<td>wp_list_pages</td>
<td>0.000305</td>
<td>1</td>
<td>0.000305</td>
</tr>
<tr>
<td>the_author</td>
<td>0.000534</td>
<td>2</td>
<td>0.000267</td>
</tr>
<tr>
<td>the_content</td>
<td>1.004469</td>
<td>1</td>
<td>1.004469</td>
</tr>
<tr>
<td>comment_text</td>
<td>0.001105</td>
<td>1</td>
<td>0.001105</td>
</tr>
<tr>
<td>pings_open</td>
<td>0.000087</td>
<td>1</td>
<td>0.000087</td>
</tr>
<tr>
<td>comment_form</td>
<td>0.007084</td>
<td>1</td>
<td>0.007084</td>
</tr>
<tr>
<td>widget_title</td>
<td>0.001137</td>
<td>4</td>
<td>0.000284</td>
</tr>
<tr>
<td>list_cats</td>
<td>0.004768</td>
<td>22</td>
<td>0.000217</td>
</tr>
<tr>
<td>wp_footer</td>
<td>0.009798</td>
<td>1</td>
<td>0.009798</td>
</tr>
<tr>
<td>wp_print_footer_scripts</td>
<td>0.000115</td>
<td>1</td>
<td>0.000115</td>
</tr>
</tbody>
</table>
<p>Из таблицы видно, что слабое место — это вызов фильтра <code>the_content</code> (вызов более одной секунды), и копать нужно именно в сторону оптимизации фильтров <code>the_content</code>. Пока не поддерживается профилирование каждого обработчика (то есть делаются замеры до вызова первого обработчика <code>the_content</code> и после вызова последнего), но это в планах.</p>
<p>Одна из особенностей плагина — поддержка как WordPress, так и bbPress (правда, пришлось немного поколдовать).</p>
<p>По умолчанию плагин активен только для администратора (WordPress) и Key Master (bbPress); изменить это можно, повесив обработчик на фильтр <code>enable_hook_profiler</code> (должен вернуть <span class="codebox"><code class="php"><span class="kw4">true</span></code></span>, если профайлер нужно активировать и <span class="codebox"><code class="php"><span class="kw4">false</span></code></span> в противном случае).</p>
<p><strong><a href="http://d.sjinks.pro/wordpress/sj-hook-profiler-0.1.zip">Скачать плагин SJ Hook Profiler 0.1</a></strong>.<br />
<strong><a href="http://d.sjinks.pro/wordpress/sj-hook-profiler-0.2.zip">Скачать плагин SJ Hook Profiler 0.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/plugins/642-sj-hook-profiler/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/plugins/642-sj-hook-profiler/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>bbPress Attachments 0.2.7: решение проблемы с установкой</title>
		<link>http://blog.sjinks.pro/bbpress/641-bbpress-attachments-fixing-installer-bugs/</link>
		<comments>http://blog.sjinks.pro/bbpress/641-bbpress-attachments-fixing-installer-bugs/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 20:37:21 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[bbPress]]></category>
		<category><![CDATA[bbPress Attachments]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=641</guid>
		<description><![CDATA[Решение проблемы с активацией bbPress Attachments Устанавливал заказчику bbPress и плагин bbPress Attachments 0.2.7. Плагин установился без проблем, но вот незадача: вложения загружаются (создаются файлы на диске), но на форуме не отображаются. Оказалось, что всё дело портит ошибка в функции активации плагина. Плагин хранит свои настройки непосредственно в коде: $bb_attachments[&#039;role&#039;][&#039;see&#039;]=&#34;read&#34;; // minimum role to see list [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/bbpress/641-bbpress-attachments-fixing-installer-bugs/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Решение проблемы с активацией <a href="http://blog.sjinks.pro/tag/bbpress-attachments/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  bbPress Attachments">bbPress Attachments</a></em></h2>
<p>Устанавливал заказчику <a href="http://blog.sjinks.pro/tag/bbpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  bbPress">bbPress</a> и <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> <a href="http://bbpress.org/plugins/topic/bb-attachments/">bbPress Attachments</a> 0.2.7. Плагин установился без проблем, но вот незадача: вложения загружаются (создаются файлы на диске), но на форуме не отображаются.</p>
<p>Оказалось, что всё дело портит <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> в функции активации плагина.<span id="more-641"></span></p>
<p></p>
<p>Плагин хранит свои настройки непосредственно в коде:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6417">
        <div class="code php" id="p641code7">
<span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'role'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'see'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;read&quot;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// minimum role to see list of attachments = read/participate/moderate/administrate</span><br />
<span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'role'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'inline'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;read&quot;</span><span class="sy0">;</span> &nbsp; &nbsp;<span class="co1">// minimum role to view inline reduced images = read/participate/moderate/administrate</span><br />
<span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'role'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'download'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;participate&quot;</span><span class="sy0">;</span> &nbsp;<span class="co1">// minimum role to download original = read/participate/moderate/administrate</span><br />
<span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'role'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'upload'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;participate&quot;</span><span class="sy0">;</span> &nbsp;<span class="co1">// minimum role to upload = participate/moderate/administrate (times out with post edit time)</span><br />
<span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'role'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delete'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;moderate&quot;</span><span class="sy0">;</span> &nbsp;<span class="co1">// minimum role to delete = read/participate/moderate/administrate</span><br />
<span class="co1">// ...</span><br />
<span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'db'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;bb_attachments&quot;</span><span class="sy0">;</span> &nbsp; <span class="co1">// &nbsp; $bbdb-&gt;prefix.&quot;attachments&quot;; &nbsp;// database name - force to &quot;bb_attachments&quot; if you need compatibility with an old install</span>
        </div>
    </div>
</div>

<p>Процедура активации выглядит так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6418">
        <div class="code php" id="p641code8">
<span class="kw2">function</span> bb_attachments_install<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw2">global</span> <span class="re0">$bbdb</span><span class="sy0">,</span><span class="re0">$bb_attachments</span><span class="sy0">;</span><br />
<span class="re0">$bbdb</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;CREATE TABLE IF NOT EXISTS &quot;</span><span class="sy0">.</span><span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'db'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot; (<br />
&nbsp; &nbsp; id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int(10) &nbsp; &nbsp; &nbsp; &nbsp;UNSIGNED NOT NULL auto_increment,<br />
&nbsp; &nbsp; time &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int(10) &nbsp; &nbsp; &nbsp; &nbsp;UNSIGNED NOT NULL default '0',<br />
&nbsp; &nbsp; post_id &nbsp; &nbsp; &nbsp; &nbsp; int(10) &nbsp; &nbsp; &nbsp; &nbsp;UNSIGNED NOT NULL default '0',<br />
&nbsp; &nbsp; user_id &nbsp; &nbsp; &nbsp; &nbsp; int(10) &nbsp; &nbsp; &nbsp; &nbsp;UNSIGNED NOT NULL default '0',<br />
&nbsp; &nbsp; user_ip &nbsp; &nbsp; &nbsp; &nbsp; int(10) &nbsp; &nbsp; &nbsp; &nbsp;UNSIGNED NOT NULL default '0',<br />
&nbsp; &nbsp; status &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tinyint(10) &nbsp; &nbsp;UNSIGNED NOT NULL default '0',<br />
&nbsp; &nbsp; downloads &nbsp; &nbsp; &nbsp; int(10) &nbsp; &nbsp; &nbsp; &nbsp;UNSIGNED NOT NULL default '0',<br />
&nbsp; &nbsp; size &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int(10) &nbsp; &nbsp; &nbsp; &nbsp;UNSIGNED NOT NULL default '0',<br />
&nbsp; &nbsp; ext &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; varchar(255) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL default '',<br />
&nbsp; &nbsp; mime &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;varchar(255) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL default '',<br />
&nbsp; &nbsp; filename &nbsp; &nbsp; &nbsp; &nbsp;varchar(255) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL default '',<br />
&nbsp; &nbsp; PRIMARY KEY ( id ),<br />
&nbsp; &nbsp; INDEX ( post_id )<br />
&nbsp; &nbsp; ) CHARSET utf8 &nbsp;COLLATE utf8_general_ci&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co1">//..</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>А к MySQL запрос приходит в виде</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6419">
        <div class="code mysql" id="p641code9">
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="kw1">IF <span class="kw10">NOT</span> EXISTS</span> &nbsp;<span class="br0">&#40;</span> <span class="coMULTI">/* ... */</span> <span class="br0">&#41;</span> <span class="kw7">CHARSET</span> utf8 &nbsp;<span class="kw10">COLLATE</span> utf8_general_ci
        </div>
    </div>
</div>

<p>Так как имя таблицы пустое, то MySQL возвращает ошибку. Но ведь переменная <span class="codebox"><code class="php"><span class="re0">$bb_attachments</span></code></span> объявлена как глобальная и <span class="codebox"><code class="php"><span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'db'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;bb_attachments&quot;</span></code></span>. Проблема здесь в том, что bbPress при активации плагина подключает его код не из глобального контекста, а из функции:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p64110">
        <div class="code php" id="p641code10">
<span class="kw2">function</span> bb_activate_plugin<span class="br0">&#40;</span> <span class="re0">$plugin</span><span class="sy0">,</span> <span class="re0">$redirect</span> <span class="sy0">=</span> <span class="st_h">''</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$active_plugins</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">array</span><span class="br0">&#41;</span> bb_get_option<span class="br0">&#40;</span> <span class="st_h">'active_plugins'</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$plugin</span> <span class="sy0">=</span> bb_plugin_basename<span class="br0">&#40;</span> <span class="kw3">trim</span><span class="br0">&#40;</span> <span class="re0">$plugin</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">$valid_path</span> <span class="sy0">=</span> bb_validate_plugin<span class="br0">&#40;</span> <span class="re0">$plugin</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> is_wp_error<span class="br0">&#40;</span> <span class="re0">$valid_path</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$valid_path</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">in_array</span><span class="br0">&#40;</span> <span class="re0">$plugin</span><span class="sy0">,</span> <span class="re0">$active_plugins</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&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">$redirect</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// We'll override this later if the plugin can be included without fatal error</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_redirect<span class="br0">&#40;</span> add_query_arg<span class="br0">&#40;</span> <span class="st_h">'_scrape_nonce'</span><span class="sy0">,</span> bb_create_nonce<span class="br0">&#40;</span> <span class="st_h">'scrape-plugin_'</span> <span class="sy0">.</span> <span class="re0">$plugin</span> <span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$redirect</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="sy0">@</span><span class="kw1">include</span><span class="br0">&#40;</span> <span class="re0">$valid_path</span> <span class="br0">&#41;</span><span class="sy0">;</span> <span class="coMULTI">/* &lt;&lt;&lt; Вот оно! */</span><br />
&nbsp; &nbsp; <span class="co1">// Add to the active plugins array</span><br />
&nbsp; &nbsp; <span class="re0">$active_plugins</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$plugin</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">ksort</span><span class="br0">&#40;</span> <span class="re0">$active_plugins</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; bb_update_option<span class="br0">&#40;</span> <span class="st_h">'active_plugins'</span><span class="sy0">,</span> <span class="re0">$active_plugins</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; do_action<span class="br0">&#40;</span> <span class="st_h">'bb_activate_plugin_'</span> <span class="sy0">.</span> <span class="re0">$plugin</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">ob_end_clean</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$valid_path</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Таким образом, в момент активации плагина массив <span class="codebox"><code class="php"><span class="re0">$bb_attachments</span></code></span> принадлежит не глобальному пространству имён (<span class="codebox"><code class="php"><span class="re0">$GLOBALS</span></code></span>), а функции <span class="codebox"><code class="php">bb_activate_plugin<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>. И, как следствие, <span class="codebox"><code class="php"><span class="kw2">global</span> <span class="re0">$bb_attachments</span></code></span> адресует несуществующую на момент активации плагина глобальную переменную.</p>
<p><strong id="solution-641">Решение:</strong> перед первым упоминанием переменной <span class="codebox"><code class="php"><span class="re0">$bb_attachments</span></code></span> добавить:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p64111">
        <div class="code php" id="p641code11">
<span class="kw2">global</span> <span class="re0">$bb_attachments</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>После чего код плагина будет выглядеть примерно так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p64112">
        <div class="code php" id="p641code12">
<span class="kw2">&lt;?php</span><br />
<span class="coMULTI">/*<br />
Plugin Name: bbPress Attachments<br />
Plugin URI: http://bbpress.org/plugins/topic/bb-attachments<br />
Description: Gives members the ability to upload attachments on their posts.<br />
Author: _ck_<br />
Author URI: http://bbShowcase.org<br />
Version: 0.2.7<br />
<br />
License: CC-GNU-GPL http://creativecommons.org/licenses/GPL/2.0/<br />
<br />
Donate: http://bbshowcase.org/donate/<br />
*/</span><br />
<br />
<span class="kw2">global</span> <span class="re0">$bb_attachments</span><span class="sy0">;</span> <span class="coMULTI">/* &lt;&lt;&lt; Вот оно! */</span><br />
<span class="re0">$bb_attachments</span><span class="br0">&#91;</span><span class="st_h">'role'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'see'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&quot;read&quot;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// minimum role to see list of attachments = read/participate/moderate/administrate</span>
        </div>
    </div>
</div>

<p><strong>Разработчикам</strong> (вообще всем) хочу сказать две вещи:</p>
<ol>
<li>Глобальные переменные — это плохо.</li>
<li>Если всё же нужно использовать глобальные переменные, то их нужно явно помечать как глобальные. В противном случае при известных обстоятельствах они внезапно могут стать локальными.</li>
</ol>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/bbpress/641-bbpress-attachments-fixing-installer-bugs/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/bbpress/641-bbpress-attachments-fixing-installer-bugs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

