<?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/tips-and-tricks/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Показ отрывка вместо статьи на страницах комментариев</title>
		<link>http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/</link>
		<comments>http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 15:48:01 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Советы]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[комментарии]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=583</guid>
		<description><![CDATA[Избавляемся от повторяющегося контента и делаем жизнь диалапщиков легче Прочитав сегодня еще раз статью «Комментатор уже читал пост», решил реализовать описанную Сергеем технику более простым способом. Кроме того, в WordPress 2.7 добавлена поддержка многостраничных комментариев; следуя логике статьи, было бы неплохо показывать отрывок (excerpt) вместо полного текста и для страниц комментариев. Я вижу два способа решения [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Избавляемся от повторяющегося контента и делаем жизнь диалапщиков легче</em></h2>
<p>Прочитав сегодня еще раз статью <strong>«<a href="http://iskariot.ru/development/yet-read/">Комментатор уже читал пост</a>»</strong>, решил реализовать описанную Сергеем технику более простым способом.</p>
<p>Кроме того, в <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 2.7 добавлена поддержка многостраничных комментариев; следуя логике статьи, было бы неплохо показывать отрывок (excerpt) вместо полного текста и для страниц комментариев.</p>
<p>Я вижу два способа решения поставленной задачи:</p>
<ol>
<li>Изменение шаблона <code>single.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>.</li>
<li>Добавление функции в <code>functions.php</code> темы.</li>
</ol>
<p><span id="more-583"></span></p>
<p>Я начну рассмотрение со второго способа — после него реализация первого способа будет тривиальной.</p>
<p>Начнём со скучной теории (<a href="#skip-boring-theory">skip it</a>).</p>
<p>При использовании разбиения комментариев на страницы, WordPress добавляет переменную <code>cpage</code> в массив <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">query_vars</span></code></span>. Но здесь есть парочка нюансов:</p>
<ol>
<li>На первой странице комментариев (она же может быть последней — всё зависит от настроек WordPress) — той, которая отображается при просмотре статьи — WordPress не устанавливает переменную <code>cpage</code> в номер страницы.</li>
<li>При отправлении комментария (и использовании многостраничных комментариев) WordPress перенаправляет пользователя на страницу с изменившейся постоянной ссылкой: к постоянной ссылке страницы добавляется <code>comment-page-<strong>PAGE</strong>/#comment-<strong>ID</strong></code>. <code>PAGE</code> — это номер страницы комментариев, <code>ID</code> — ID комментария.</li>
<li>Если в постоянной ссылке присутствует параметр <code>comment-page-XXX</code> (он же <code>cpage</code> при отключённом ЧПУ), то WordPress устанавливает переменную <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">query_vars</span><span class="br0">&#91;</span><span class="st_h">'cpage'</span><span class="br0">&#93;</span></code></span> (сюрприз!)</li>
</ol>
<p>Какие из этого можно сделать выводы? Если посетитель просматривает не первую страницу комментариев, либо только что оставил свой комментарий, <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</span><span class="br0">&#41;</span></code></span> вернёт ненулевое значение. В противном случае переменная <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">query_vars</span><span class="br0">&#91;</span><span class="st_h">'cpage'</span><span class="br0">&#93;</span></code></span> не будет установлена. Что и требовалось по условию.</p>
<p>Теперь переходим к отрывку (который excerpt). Плохая новость заключается в том, что многие люди (в том числе и я) его просто не заполняют. Хорошая новость — WordPress (по крайней мере, 2.8; хотя в комментариях к коду написано, что работает, начиная с версии 1.5) умеет его заполнять самостоятельно — это делает функция <span class="codebox"><code class="php">wp_trim_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>, которая устанавливается фильтром на событие <code>get_the_excerpt</code>. У этой функции (по сравнению с методом Сергея) есть два недостатка:</p>
<ol>
<li>Она убирает напрочь всю HTML-разметку (anybody cares?)</li>
<li>У WordPress своё представление о том, как выглядит знак типографского пропуска (лечится установкой своего фильтра на событие <code>wp_trim_excerpt</code>).</li>
</ol>
<p>Есть одна особенность: вызов функций <span class="codebox"><code class="php">the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>/<span class="codebox"><code class="php">get_the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> из фильтра <code>the_content</code> может привести к рекурсивному вызову этого же фильтра из функции <span class="codebox"><code class="php">wp_trim_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>.</p>
<div id="skip-boring-theory"></div>
<p>В <code>functions.php</code> темы добавляем такой код (в WordPress младше 2.8 вместо <span class="codebox"><code class="php">esc_atrr<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> нужно использовать <span class="codebox"><code class="php">attribute_escape<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5833">
        <div class="code php" id="p583code3">
&nbsp; &nbsp; <span class="kw2">function</span> show_excerpt_on_paged_comments<span class="br0">&#40;</span><span class="re0">$s</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">static</span> <span class="re0">$in_here</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$in_here</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$s</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$in_here</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wp_query</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$cpage</span> <span class="sy0">=</span> <span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</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="re0">$cpage</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$s</span> <span class="sy0">=</span> get_the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;p&gt;← Вернуться к полной версии записи «&lt;strong&gt;'</span> <span class="sy0">.</span> <span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st_h">'&lt;a href=&quot;%s&quot;&gt;%s&lt;/a&gt;'</span><span class="sy0">,</span> esc_attr<span class="br0">&#40;</span>get_permalink<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> get_the_title<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;/strong&gt;»…&lt;/p&gt;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$in_here</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$s</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="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'add_filter'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add_filter<span class="br0">&#40;</span><span class="st_h">'the_content'</span><span class="sy0">,</span> <span class="st_h">'show_excerpt_on_paged_comments'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Для тех, кто ждёт первый вариант: в шаблоне <code>single.php</code> заменяем вызов <code>the_content()</code> следующим кодом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5834">
        <div class="code php" id="p583code4">
<span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> get_the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;p&gt;← Вернуться к полной версии записи «&lt;strong&gt;'</span> <span class="sy0">.</span> <span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st_h">'&lt;a href=&quot;%s&quot;&gt;%s&lt;/a&gt;'</span><span class="sy0">,</span> esc_attr<span class="br0">&#40;</span>get_permalink<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> get_the_title<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;/strong&gt;»…&lt;/p&gt;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the_content<span class="br0">&#40;</span><span class="st0">&quot;Далее…&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>В принципе, вариант №2 (тот, который был рассмотрен первым) при желании можно реализовать в виде плагина.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Глобальный nofollow для страниц комментариев</title>
		<link>http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/</link>
		<comments>http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 06:44:37 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Советы]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[комментарии]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=579</guid>
		<description><![CDATA[Еще один способ прятать ссылки от поисковиков Идеально для SEOшников, использующих разбиение комментариев на страницы: глобальный запрет следования по ссылкам для всех страниц комментариев, кроме первой (или последней, в зависимости от настроек WordPress). В шаблон header.php добавляем такой вот код: &#60;?php if ($wp_query-&#62;get(&#039;cpage&#039;)) : ?&#62; &#60;meta name=&#34;robots&#34; content=&#34;index,nofollow&#34;/&#62; &#60;?php endif; ?&#62; Работает для WordPress 2.7 и [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Еще один способ прятать ссылки от поисковиков</em></h2>
<p>Идеально для SEOшников, использующих разбиение комментариев на страницы: глобальный запрет следования по ссылкам для всех страниц комментариев, кроме первой (или последней, в зависимости от настроек <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>).<span id="more-579"></span></p>
<p>В шаблон <code>header.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code> добавляем такой вот код:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5796">
        <div class="code php" id="p579code6">
<span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="sy1">?&gt;</span><br />
&nbsp; &nbsp; <span class="sy0">&lt;</span>meta name<span class="sy0">=</span><span class="st0">&quot;robots&quot;</span> content<span class="sy0">=</span><span class="st0">&quot;index,nofollow&quot;</span><span class="sy0">/&gt;</span><br />
<span class="kw2">&lt;?php</span> <span class="kw1">endif</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Работает для WordPress 2.7 и старше.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>WordPress: одновременный логин для HTTP и HTTPS</title>
		<link>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/</link>
		<comments>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 19:09:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=486</guid>
		<description><![CDATA[Простое решение для POST на SSL URL В WordPress, начиная с версии 2.6, встроена поддержка HTTPS: можно сделать либо HTTPS-логин, либо поместить панель администратора за SSL. Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для HTTPS. Иными словами, если пользователь попал на http&#x003A;//example.com/wp-admin/, то при переходе на [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Простое решение для POST на <a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">SSL</a> URL</em></h2>
<p>В <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, начиная с версии 2.6, встроена поддержка <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>: можно сделать либо <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>-логин, либо поместить панель администратора за SSL. Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>. Иными словами, если пользователь попал на <code>http&#x003A;//example.com/wp-admin/</code>, то при переходе на <code>https&#x003A;//example.com/wp-admin/</code> ему придётся входить в систему еще раз.</p>
<p>Всё бы ничего, но если плагин делает POST на HTTPS, то пользователь попадает на wp-login.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a>, который после успешного входа сделает перенаправление (GET) на URL, который ожидает принять POST. При этом если POST шёл на <code>https&#x003A;//example.com/wp-admin/admin.php?page=somepage&amp;<strong style="color: red">noheader=1</strong></code>, то пользователь увидит безобразную страницу.<span id="more-486"></span></p>
<p>К счастью, есть простое решение. Как известно, аутентификационные cookies устанавливает процедура <code>wp_set_auth_cookie</code>. Перед их установкой она генерирует событие <code>set_auth_cookie</code>, которому передаются следующие параметры:</p>
<ul>
<li><span class="codebox"><code class="php"><span class="re0">$auth_cookie</span></code></span>&nbsp;&mdash;&nbsp;значение для cookie, сгенерированное процедурой <span class="codebox"><code class="php">wp_generate_auth_cookie<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>;</li>
<li><span class="codebox"><code class="php"><span class="re0">$expire</span></code></span>&nbsp;&mdash;&nbsp;0, если пользователь не выбрал "Запомнить меня", не 0 в противном случае;</li>
<li><span class="codebox"><code class="php"><span class="re0">$expiration</span></code></span>&nbsp;&mdash;&nbsp;срок жизни cookie;</li>
<li><span class="codebox"><code class="php"><span class="re0">$user_id</span></code></span>&nbsp;&mdash;&nbsp;ID пользователя (из таблицы <code>wp_users</code>);</li>
<li><span class="codebox"><code class="php"><span class="re0">$scheme</span></code></span>&nbsp;&mdash;&nbsp;схема аутентификации: <code>secure_auth</code> для SSL, <code>auth</code> для HTTP.</li>
</ul>
<p>Использовать эти данные можно следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4868">
        <div class="code php" id="p486code8">
<span class="co4">/**<br />
&nbsp;* set_auth_cookie action hook<br />
&nbsp;*<br />
&nbsp;* @param string $auth_cookie &nbsp; Value generated by wp_generate_auth_cookie()<br />
&nbsp;* @param int $expire &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, if Remember Me is not checked<br />
&nbsp;* @param int $expiration &nbsp; &nbsp; &nbsp; Cookie expiration date<br />
&nbsp;* @param int $user_id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ID of the logged in usger<br />
&nbsp;* @param string $scheme &nbsp; &nbsp; &nbsp; &nbsp;Authentication scheme (secure_auth or auth)<br />
&nbsp;*/</span><br />
<span class="kw2">function</span> sj_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$auth_cookie</span><span class="sy0">,</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="re0">$expiration</span><span class="sy0">,</span> <span class="re0">$user_id</span><span class="sy0">,</span> <span class="re0">$scheme</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">static</span> <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">===</span> <span class="re0">$was_here</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st_h">'secure_auth'</span> <span class="sy0">==</span> <span class="re0">$scheme</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wp_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$user_id</span><span class="sy0">,</span> 0 <span class="sy0">!=</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elseif</span> <span class="br0">&#40;</span><span class="st_h">'auth'</span> <span class="sy0">==</span> <span class="re0">$scheme</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wp_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$user_id</span><span class="sy0">,</span> 0 <span class="sy0">!=</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
add_action<span class="br0">&#40;</span><span class="st_h">'set_auth_cookie'</span><span class="sy0">,</span> <span class="st_h">'sj_set_auth_cookie'</span><span class="sy0">,</span> <span class="sy0">-</span>100<span class="sy0">,</span> 5<span class="br0">&#41;</span><span class="sy0">;</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/tips-and-tricks/486-simultaneous-login-for-http-and-https/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Секреты update_postmeta_cache()</title>
		<link>http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/</link>
		<comments>http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 10:27:14 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[производительность]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=349</guid>
		<description><![CDATA[Способ увеличения производительности при чтении метаданных записей Если плагину приходится в цикле читать метаданные для большого количества записей, можно увеличить производительность путём использования функции update_postmeta_cache(). Например, такой код $all_posts = $wpdb-&#62;get_col(&#34;SELECT `ID` FROM `{$wpdb-&#62;posts}` WHERE `post_type` = &#039;post&#039; ORDER BY `post_title`&#34;); if (false == empty($all_posts)) : foreach ($all_posts as $id) : $caps = get_post_meta($id, &#039;_disclosesecret_cap&#039;); [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Способ увеличения производительности при чтении метаданных записей</em></h2>
<p>Если плагину приходится в цикле читать метаданные для большого количества записей, можно увеличить <a href="http://blog.sjinks.pro/tag/performance/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  производительность">производительность</a> путём использования функции <code>update_postmeta_cache()</code>.<span id="more-349"></span></p>
<p>Например, такой код</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34911">
        <div class="code php" id="p349code11">
<span class="re0">$all_posts</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">get_col</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT `ID` FROM `<span class="es4">{$wpdb-&gt;posts}</span>` WHERE `post_type` = 'post' ORDER BY `post_title`&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$all_posts</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$all_posts</span> <span class="kw1">as</span> <span class="re0">$id</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$caps</span> <span class="sy0">=</span> get_post_meta<span class="br0">&#40;</span><span class="re0">$id</span><span class="sy0">,</span> <span class="st_h">'_disclosesecret_cap'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//...</span><br />
&nbsp; &nbsp; <span class="kw1">endforeach</span><span class="sy0">;</span><br />
<span class="kw1">endif</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>потребует выполнения <var>n</var> дополнительных запросов, где <var>n</var>&nbsp;&mdash;&nbsp;число выбраннных записей.</p>
<p>Код можно сделать гораздо эффективнее, добавив всего одну строку:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34912">
        <div class="code php" id="p349code12">
<span class="re0">$all_posts</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">get_col</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT `ID` FROM `<span class="es4">{$wpdb-&gt;posts}</span>` WHERE `post_type` = 'post' ORDER BY `post_title`&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$all_posts</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; update_postmeta_cache<span class="br0">&#40;</span><span class="re0">$all_posts</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$all_posts</span> <span class="kw1">as</span> <span class="re0">$id</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$caps</span> <span class="sy0">=</span> get_post_meta<span class="br0">&#40;</span><span class="re0">$id</span><span class="sy0">,</span> <span class="st_h">'_disclosesecret_cap'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//...</span><br />
&nbsp; &nbsp; <span class="kw1">endforeach</span><span class="sy0">;</span><br />
<span class="kw1">endif</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>В этом случае понадобится один дополнительный запрос.</p>
<p><strong>Техническая информация:</strong> <code>get_post_meta()</code> вызывает <code>update_postmeta_cache()</code>, если метаинформация не найдена во внутреннем кэше (группа <code>post_meta</code>, ключ <span class="codebox"><code class="php"><span class="re0">$id</span></code></span>&nbsp;&mdash;&nbsp;уникальный идентификатор записи). Так как <code>update_postmeta_cache()</code> читает <strong>все</strong> метаданные для указанных записей, получаем пенальти в одно обращение к базе данных на уникальную запись.</p>
<p><code>update_postmeta_cache()</code> в качестве параметра принимает либо строку (список идентификаторов записей, разделённых запятой), либо массив. "Стоимость" вызова данной функции составляет один запрос к базе данных на весь набор параметров.</p>
<p><strong>Побочные эффекты:</strong> если длина SQL-запроса превысит значение переменной <code>max_allowed_packet</code> (для <a href="http://blog.sjinks.pro/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a>), запрос к базе данных завершится ошибкой.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

