<?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>Статьи о php &#8212; Nikita Spivak</title>
	<atom:link href="https://nikita-sp.com.ua/blog/o-sozdanii-sajtov/sjatji-o-php/feed" rel="self" type="application/rss+xml" />
	<link>https://nikita-sp.com.ua</link>
	<description>web developer&#039;s portfolio</description>
	<lastBuildDate>Mon, 09 Nov 2015 19:33:45 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>Скрыть весь контент страницы OnePress Social Locker</title>
		<link>https://nikita-sp.com.ua/2015/11/skryit-ves-kontent-stranitsyi-onepress-social-locker.html</link>
					<comments>https://nikita-sp.com.ua/2015/11/skryit-ves-kontent-stranitsyi-onepress-social-locker.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Mon, 09 Nov 2015 18:00:49 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[интересно]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=2788</guid>

					<description><![CDATA[Несколько дней назад я уже рассказывал о социальных блокировщиках контента, для чего они нужны и в чем их преимущества и недостатки. Сегодня я хочу поделиться одним скромным решением для сайтов на WordPress, на которых все-таки установлен бесплатный плагин социального блокировщика контента OnePress Social Locker. Данный плагин очень удобный и имеет достаточно настроек, но к сожалению, в нем отсутствует [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Несколько дней назад я уже рассказывал <a href="http://nikita-sp.com.ua/2015/11/blokirovat-kontent-sayta-cherez-sotsialnyie-seti.html" data-wpel-link="internal">о социальных блокировщиках контента</a>, для чего они нужны и в чем их преимущества и недостатки. Сегодня я хочу поделиться одним скромным решением для сайтов на <strong>WordPress</strong>, на которых все-таки установлен бесплатный плагин социального блокировщика контента <strong>OnePress Social Locker</strong>.</p>
<p><a href="http://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker.jpg" rel="lightbox[2788]" data-wpel-link="internal"><img fetchpriority="high" decoding="async" width="960" height="321" itemprop="image" class="aligncenter size-large wp-image-2810" src="http://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-960x321.jpg" alt="One Press Social Locker" srcset="https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-960x321.jpg 960w, https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-600x201.jpg 600w, https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-150x50.jpg 150w, https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker.jpg 983w" sizes="(max-width: 960px) 100vw, 960px" /></a></p>
<p>Данный плагин очень удобный и имеет достаточно настроек, но к сожалению, в нем отсутствует опция блокирования всего контента страницы/статьи, о чем и пойдет речь.<span id="more-2788"></span></p>
<p><strong>OnePress Social Locker</strong> &#8212; это один из популярных <span style="text-decoration: underline;">бесплатных</span> (<em>если не единственный бесплатный</em>) социальных локеров контента для WordPress. Он позволяет блокировать определенный контент на странице при помощи shortcode (шорткодов/тегов, см. изображение). Вы можете создать несколько типов блокировки (текст, оформление блокирующего блока) и использовать для разных кусков контента. Например:</p>
<ol>
<li>Чтобы скачать с сайта &#8212; создадим блокировщик с текстом &#171;Ссылка скрыта, подпишитесь на группу чтобы скачать&#187; и ссылка на группу;</li>
<li>Чтобы просмотреть отдельную часть статьи &#8212; создадим блокировщик с текстом &#171;Контент защищен, поставьте лайк чтобы увидеть&#187; и кнопочки для лайков;</li>
</ol>
<p><a href="http://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-2.png" rel="lightbox[2788]" data-wpel-link="internal"><img decoding="async" width="530" height="315" itemprop="image" class="aligncenter size-full wp-image-2809" src="http://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-2.png" alt="Создаем блокировщик используя One Press Social Locker для WordPress" srcset="https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-2.png 530w, https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-2-150x89.png 150w" sizes="(max-width: 530px) 100vw, 530px" /></a></p>
<p><a href="http://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-1.png" rel="lightbox[2788]" data-wpel-link="internal"><img decoding="async" width="530" height="650" itemprop="image" class="aligncenter size-full wp-image-2808" src="http://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-1.png" alt="Обворачиваем контент в шорткод используя One Press Social Locker для WordPress" srcset="https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-1.png 530w, https://nikita-sp.com.ua/wp-content/uploads/2015/11/one-press-social-locker-1-122x150.png 122w" sizes="(max-width: 530px) 100vw, 530px" /></a>Также, плагин позволяет автоматически закрыть нужный контент в уже существующих записях: вы можете закрыть весь контент или только часть статьи, используя следующие правила:</p>
<ul>
<li>количество абзацев после которых дальнейший контент будет заблокирован;</li>
<li>скрывать контент после тега &#171;Далее&#187; (&lt;!&#8212; more &#8212;&gt;);</li>
</ul>
<p>и еще множество других. Но! Если мы скроем контент таким образом, то при необходимости убрать блокировку необходимо будет перелопатить потом вручную все записи, удаляя шорткод. Чтобы не прибегать к такому неудобному способу, было разработано следующее решение: заменить в файле <em>single.php</em> стандартный вывод контента на следующий код:</p>
<pre class="brush: php; title: Код:; notranslate">	 	 
$content = get_the_content();
$content = apply_filters('the_content', $content);
echo do_shortcode('[sociallocker]'.$content.'[/sociallocker]');
</pre>
<p>Таким образом весь контент нашей статьи будет обернут в shortcode блокировщика и его можно будет, спустя некоторое время, безболезненно и быстро убрать, при этом не редактируя все записи на вашем сайте.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2015/11/skryit-ves-kontent-stranitsyi-onepress-social-locker.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Установка OCMOD модулей на Opencart 2.x на localhost (denwer) без FTP</title>
		<link>https://nikita-sp.com.ua/2015/06/install-ocmod-module-opencart-2-localhost-denwer-bez-ftp.html</link>
					<comments>https://nikita-sp.com.ua/2015/06/install-ocmod-module-opencart-2-localhost-denwer-bez-ftp.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Mon, 22 Jun 2015 08:40:44 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[OpenCart]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=2372</guid>

					<description><![CDATA[Работая с интернет магазином на Opencart 2 на локальном хосте (я использую, например, Denwer), вы можете столкнутся со сложностью установки OCMOD модулей, т.к. установщик требует настроенного FTP доступа, а в пакете Denwer&#8217;a отсутствует FTP server. Таким образом, разработчик не может установить модификации на Opencart 2 используя стандартный Extension Installer. Но для решения этой проблемы существует решение, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Работая с интернет магазином на Opencart 2 на локальном хосте (я использую, например, Denwer), вы можете столкнутся со сложностью установки OCMOD модулей, т.к. установщик требует настроенного FTP доступа, а в пакете Denwer&#8217;a отсутствует FTP server.</p>
<p><a href="http://nikita-sp.com.ua/wp-content/uploads/2015/04/opencart-extension-installer-ftp-error.jpg" rel="lightbox[2372]" data-wpel-link="internal"><img loading="lazy" decoding="async" width="600" height="394" itemprop="image" class="aligncenter size-medium wp-image-2443" src="http://nikita-sp.com.ua/wp-content/uploads/2015/04/opencart-extension-installer-ftp-error-600x394.jpg" alt="Opencart extension installer ошибка ftp" srcset="https://nikita-sp.com.ua/wp-content/uploads/2015/04/opencart-extension-installer-ftp-error-600x394.jpg 600w, https://nikita-sp.com.ua/wp-content/uploads/2015/04/opencart-extension-installer-ftp-error-960x630.jpg 960w, https://nikita-sp.com.ua/wp-content/uploads/2015/04/opencart-extension-installer-ftp-error-150x98.jpg 150w, https://nikita-sp.com.ua/wp-content/uploads/2015/04/opencart-extension-installer-ftp-error.jpg 1323w" sizes="auto, (max-width: 600px) 100vw, 600px" /></a></p>
<p>Таким образом, разработчик не может установить модификации на Opencart 2 используя стандартный Extension Installer. Но для решения этой проблемы существует решение, достаточно простое и красивое. Достаточно лишь модифицировать несколько строк кода!<span id="more-2372"></span></p>
<p>Итак, для изменения алгоритма работы установщика дополнений в Opencart 2.x необходимо модифицировать файл <em>admin/controller/extension/installer.php</em></p>
<p>Далее необходимо найти строку, где указан шаг с использование FTP соединения для копирования файлов дополнения на сервер (~133 line):</p>
<pre class="brush: php; title: Код:; notranslate">'url'  =&gt; str_replace('&amp;amp;', '&amp;', $this-&gt;url-&gt;link('extension/installer/ftp', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL')),</pre>
<p>Как видим в троке идет обращение к функции FTP, соответственно, для обхода данного шага нам необходимо изменить имя вызываемой функции на имя нашей функции, которую мы добавим в файл далее. Для этого заменим вышеупомянутую строку на следующую:</p>
<pre class="brush: php; title: Код:; notranslate">'url'  =&gt; str_replace('&amp;amp;', '&amp;', $this-&gt;url-&gt;link('extension/installer/localcopy', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL')),</pre>
<p>После этого нам необходимо добавить собственно саму функцию localcopy(), код которой расположен ниже, в любое удобное место, например, перед строкой (~535 line):</p>
<pre class="brush: php; title: Код:; notranslate">public function clear() {</pre>
<p>Размещаем код функции localcopy() и установщик расширений OpenCart 2.x будет работать без настроек FTP!</p>
<pre class="brush: php; title: Код:; notranslate">
public function localcopy() {
	$this-&gt;load-&gt;language('extension/installer');
	$json = array();

	if (!$this-&gt;user-&gt;hasPermission('modify', 'extension/installer')) {
		$json['error'] = $this-&gt;language-&gt;get('error_permission');
	}

	$directory = DIR_UPLOAD . str_replace(array('../', '..\\', '..'), '', $this-&gt;request-&gt;post['path']) . '/upload/';
	if (!is_dir($directory)) {
		$json['error'] = $this-&gt;language-&gt;get('error_directory');
	}

	if (!$json) {
	// Get a list of files ready to upload
	$files = array();
	$path = array($directory . '*');

		while (count($path) != 0) {
			$next = array_shift($path);
			foreach (glob($next) as $file) {
				if (is_dir($file)) {
					$path[] = $file . '/*';
				}
				$files[] = $file;
			}
		}

	$root = dirname(DIR_APPLICATION).'/';

		foreach ($files as $file) {
		// Upload everything in the upload directory
		$destination = $root.substr($file, strlen($directory));

			if (is_dir($file)) {
			$list = glob(rtrim($destination, '/').'/*');

				if (!file_exists($destination)) {
					if (!mkdir($destination)) {
						$json['error'] = sprintf($this-&gt;language-&gt;get('error_ftp_directory'), $destination);
					}
				}
			}

			if (is_file($file)) {
				if (!copy($file, $destination)) {
					$json['error'] = sprintf($this-&gt;language-&gt;get('error_ftp_file'), $file);
				}
			}
		}
	}

	$this-&gt;response-&gt;addHeader('Content-Type: application/json');
	$this-&gt;response-&gt;setOutput(json_encode($json));
}
</pre>
<p>Надеюсь данная статья была полезной и вы нашли ответ, который искали. Ставте like, подписывайтесь, впереди еще много интересного!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2015/06/install-ocmod-module-opencart-2-localhost-denwer-bez-ftp.html/feed</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Как в Opencart получить код языка по-умолчанию</title>
		<link>https://nikita-sp.com.ua/2015/03/kak-v-opencart-poluchit-kod-yazyika-po-umolchaniyu.html</link>
					<comments>https://nikita-sp.com.ua/2015/03/kak-v-opencart-poluchit-kod-yazyika-po-umolchaniyu.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Wed, 04 Mar 2015 13:00:36 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[OpenCart]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[интересно]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=2346</guid>

					<description><![CDATA[Работая над модулем SEO URL для мультиязычного интернет магазина, я столкнулся с проблемой получения кода языка  по-умолчанию. Интересный факт, однако с помощью привычной конструкции, позволяющей получить настройки интернет магазина, $this-&#62;config-&#62;get(&#8216;config_language&#8217;) нельзя получить код языка пользовательской части по-умолчанию. Однако, необходимо было решить задачу, и я нашел решение. Что ж, давайте вместе разберемся с данной проблемой. В процессе [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Работая над <a title="Модуль SEO URL для мультиязычного интернет магазина на Opencart" href="http://nikita-sp.com.ua/2015/03/module-seo-url-dlya-magazina-opencart.html" target="_blank" data-wpel-link="internal">модулем SEO URL для мультиязычного интернет магазина</a>, я столкнулся с проблемой получения кода языка  по-умолчанию. Интересный факт, однако с помощью привычной конструкции, позволяющей получить настройки интернет магазина, $this-&gt;config-&gt;get(&#8216;config_language&#8217;) нельзя получить код языка пользовательской части по-умолчанию.</p>
<p><img loading="lazy" decoding="async" width="600" height="250" itemprop="image" class="aligncenter size-medium wp-image-2349" src="http://nikita-sp.com.ua/wp-content/uploads/2015/03/opencart-get-default-shop-language-600x250.jpg" alt="Opencart get default shop language" srcset="https://nikita-sp.com.ua/wp-content/uploads/2015/03/opencart-get-default-shop-language.jpg 600w, https://nikita-sp.com.ua/wp-content/uploads/2015/03/opencart-get-default-shop-language-150x63.jpg 150w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Однако, необходимо было решить задачу, и я нашел решение. Что ж, давайте вместе разберемся с данной проблемой.<span id="more-2346"></span></p>
<p>В процессе написания плагинов и модулей для Opencart, в контроллере можно получить доступ к настройкам самого магазина, или же отдельных модулей, однако каково было мое удивление, когда при разработке <a title="Модуль SEO URL для мультиязычного интернет магазина на Opencart" href="http://nikita-sp.com.ua/2015/03/module-seo-url-dlya-magazina-opencart.html" target="_blank" data-wpel-link="internal">модуля SEO URL для многоязычного интернет магазина</a>, при обращении к массиву конфигурации $this-&gt;config-&gt;get(&#8216;config_language&#8217;) я получал текущий язык, который выбрал пользователь.</p>
<p>То есть в данном массиве хранится код языка, на котором пользователь просматривает интернет магазин, и отнюдь не язык по-умолчанию: если по-молчанию стоит русский язык, а пользователь зашел и выбрал английский, то значение переменной $this-&gt;config-&gt;get(&#8216;config_language&#8217;) будет &#171;en&#187;.</p>
<p>Дело в том, что в файле index.php, где формируются все основные конфигурационные массивы и данные в данную переменную записывается значение текущего языка! Вот строки файла index.php, в которых видно, как в переменную заносится значение текущего языка:</p>
<pre class="brush: php; title: Код:; notranslate">
if (isset($session-&gt;data['language']) &amp;&amp; array_key_exists($session-&gt;data['language'], $languages) &amp;&amp; $languages[$session-&gt;data['language']]['status']) {
$code = $session-&gt;data['language'];
} elseif (isset($request-&gt;cookie['language']) &amp;&amp; array_key_exists($request-&gt;cookie['language'], $languages) &amp;&amp; $languages[$request-&gt;cookie['language']]['status']) {
$code = $request-&gt;cookie['language'];
} elseif ($detect) {
$code = $detect;
} else {
$code = $config-&gt;get('config_language');
}

if (!isset($session-&gt;data['language']) || $session-&gt;data['language'] != $code) {
$session-&gt;data['language'] = $code;
}

if (!isset($request-&gt;cookie['language']) || $request-&gt;cookie['language'] != $code) {
setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $request-&gt;server['HTTP_HOST']);
}

$config-&gt;set('config_language_id', $languages[$code]['language_id']);
$config-&gt;set('config_language', $languages[$code]['code']);

</pre>
<p>А как же в контроллере получить язык по-молчанию, установленный в административной части для фронтенда? После недолгого поиска необходимой информации, я пришел к выводу что сделать это все-таки можно, правда не так просто и красиво, как это можно было бы сделать, используя основной массив конфигурации.</p>
<pre class="brush: php; title: Код:; notranslate">

$this-&gt;load-&gt;model('setting/setting');
$store_settings_config = $this-&gt;model_setting_setting-&gt;getSetting(&quot;config&quot;, $this-&gt;config-&gt;get('config_store_id'));

echo $store_settings_config['config_language']; // Вот тут наш язык по-умолчанию

</pre>
<p>Вот таким вот нехитрым образом, хоть и сложнее, чем обращение в конфигурационный массив, можно получить язык пользовательской части вашего интернет магазина на Opencart по-умолчанию.</p>
<p>Данный пост размещаю тут больше, пожалуй, для себя, на будущее, однако если вы это читаете и вам помогло мое решение, не поленитесь и поставьте лайк, напишите комментарий. Заранее спасибо. Если возникли вопросы или предложения &#8212; пишите, обсудим.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2015/03/kak-v-opencart-poluchit-kod-yazyika-po-umolchaniyu.html/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Как добавить Google Adsense в середину записи WordPress</title>
		<link>https://nikita-sp.com.ua/2015/02/dobavit-adsense-v-seredinu-zapisi-wordpress.html</link>
					<comments>https://nikita-sp.com.ua/2015/02/dobavit-adsense-v-seredinu-zapisi-wordpress.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Thu, 05 Feb 2015 10:00:24 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=2003</guid>

					<description><![CDATA[При создании сайта, если вы собираетесь его в дальнейшем монетизировать, следует обратить внимание и продумать места для размещения рекламы в будущем. И я говорю не только о Google Adsense, но и про другие рекламные блоки. Одними из популярных мест для размещения рекламных блоков является шапка сайта (начало статьи, страницы), но разместить там код рекламного баннера [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>При создании сайта, если вы собираетесь его в дальнейшем монетизировать, следует обратить внимание и продумать места для размещения рекламы в будущем. И я говорю не только о Google Adsense, но и про другие рекламные блоки.</p>
<p><img loading="lazy" decoding="async" width="500" height="400" itemprop="image" class="aligncenter size-full wp-image-2052" src="http://nikita-sp.com.ua/wp-content/uploads/2015/02/adverts-in-post-text.png" alt="Как вставить рекламу в текст записи WordPress" srcset="https://nikita-sp.com.ua/wp-content/uploads/2015/02/adverts-in-post-text.png 500w, https://nikita-sp.com.ua/wp-content/uploads/2015/02/adverts-in-post-text-150x120.png 150w" sizes="auto, (max-width: 500px) 100vw, 500px" /></p>
<p>Одними из популярных мест для размещения рекламных блоков является шапка сайта (начало статьи, страницы), но разместить там код рекламного баннера достаточно просто, а <strong>как разместить код</strong> того же<strong> Google Adsense в тексте записи сайта на WordPress без плагинов</strong>?</p>
<p><span id="more-2003"></span></p>
<p>Итак, для того чтобы <strong>разместить код рекламного блока Google Adsense или других рекламных площадок</strong>, вам необходимо будет отредактировать файл functions.php в папке с вашей темой.</p>
<p>Добавим в код вашего файла (можно в конец файла) следующую функцию:</p>
<pre class="brush: php; title: Код:; notranslate">function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
	$closing_p = '&lt;/p&gt;';
	$paragraphs = explode( $closing_p, $content ); // разбиваем текст статьи по параграфам
	foreach ($paragraphs as $index =&gt; $paragraph) { // пробегаемся по параграфам
		if ( trim( $paragraph ) ) {
			$paragraphs[$index] .= $closing_p; // добавляем вырезанные на 3 строке закрывающие теги параграфа
		}
		if ( $paragraph_id == $index + 1 ) { // если номер текущего параграфа = номеру требуемого - добавляем код блока
			$paragraphs[$index] .= $insertion;
		}
	}

	return implode( '', $paragraphs ); // совмещаем все параграфы вместе и отдаем
}</pre>
<p>Данная функция позволяет разбивать текст (<em>$content</em>) ваших записей/постов блога на блоки по параграфам и вставляет после определенного номера (<em>$paragraph_id</em>) параграфа код, передаваемый в функцию в переменной <em>$insertion</em>.</p>
<p>Далее нам необходимо вызвать эту функцию при обращении к нашей записи. Для этого нам необходимо добавить строку с добавлением фильтра и функцию:</p>
<pre class="brush: php; title: Код:; notranslate">add_filter( 'the_content', 'prefix_insert_post_ads' ); // Добавляем обработку текста статьи
function prefix_insert_post_ads( $content ) { // В функцию передаем текст статьи
	$ad_code = 'Тут код вашего рекламного блока'; // Указываем код рекламного блока для вставки
	if ( is_single() &amp;&amp; ! is_admin() ) { // вызываем функцию для одиночной записи и не вызываем функцию если мы в администраторской панели
		return prefix_insert_after_paragraph( $ad_code, 2, $content ); // Если были соблюдены все правила возвращаем обработанный функцией исходный код статьи уже с кодом рекламного блока
		// передаются параметры: код рекламного блока, номер параграфа, после которого будет блок размещен, контент
	}
	return $content; // в противном случае возвращаем просто текст статьи
}
</pre>
<p>Вы можете настроить данный скрипт так как вам угодно, например вы можете скомпоновать все действия в одну функцию (мне кажется так будет удобнее и корректнее, зачем плодить функции?) таким образом:</p>
<pre class="brush: php; title: Код:; notranslate">
add_filter( 'the_content', 'prefix_insert_post_ads' );
function prefix_insert_post_ads( $content ) {
	$ad_code = 'Тут код вашего рекламного блока';
	if ( is_single() &amp;&amp; ! is_admin() ) {
		$closing_p = '&lt;/p&gt;';
		$paragraphs = explode( $closing_p, $content );
		foreach ($paragraphs as $index =&gt; $paragraph) {
			if ( trim( $paragraph ) ) {
				$paragraphs[$index] .= $closing_p;
			}
			if ( X == ($index + 1) ) { // X = номер параграфа
				$paragraphs[$index] .= $ad_code;
			}
		}
		return implode( '', $paragraphs ); // совмещаем все параграфы вместе и отдаем
	}
	return $content;
}
</pre>
<p>Если вы хотите <strong>добавить несколько рекламных баннеров в текст вашей статьи</strong>, то вам необходимо добавить просто еще одно условие, например такое:</p>
<pre class="brush: php; title: Код:; notranslate">
add_filter( 'the_content', 'prefix_insert_post_ads' );
function prefix_insert_post_ads( $content ) {
	$ad_code = 'Тут код вашего рекламного блока';
	/* Добавляем второй рекламный блок */
	$ad_code = 'Тут код вашего второго рекламного блока';
	/* Добавили второй рекламный блок */
	if ( is_single() &amp;&amp; ! is_admin() ) {
		$closing_p = '&lt;/p&gt;';
		$paragraphs = explode( $closing_p, $content );
		foreach ($paragraphs as $index =&gt; $paragraph) {
			if ( trim( $paragraph ) ) {
				$paragraphs[$index] .= $closing_p;
			}
			if ( X == ($index + 1) ) { // X = номер параграфа
				$paragraphs[$index] .= $ad_code;
			}
			/* Добавляем второе условие */
			if ( X2 == ($index + 1) ) { // X2 = номер второго параграфа
				$paragraphs[$index] .= $another_ad_code;
			}
			/* Добавили второе условие */
		}
		return implode( '', $paragraphs ); // совмещаем все параграфы вместе и отдаем
	}
	return $content;
}
</pre>
<p>А если вы хотите <strong>добавить рекламный блок в конец записи на сайте на WordPress</strong>, то просто добавьте условие:</p>
<pre class="brush: php; title: Код:; notranslate">
add_filter( 'the_content', 'prefix_insert_post_ads' );
function prefix_insert_post_ads( $content ) {
	$ad_code = 'Тут код вашего рекламного блока';
	if ( is_single() &amp;&amp; ! is_admin() ) {
		$closing_p = '&lt;/p&gt;';
		$paragraphs = explode( $closing_p, $content );
		$count_p = count($paragraphs);
		foreach ($paragraphs as $index =&gt; $paragraph) {
			if ( trim( $paragraph ) ) {
				$paragraphs[$index] .= $closing_p;
			}
			if ( $count_p == ($index + 1) ) {
				$paragraphs[$index] .= $ad_code;
			}
		}
		return implode( '', $paragraphs );
	}
	return $content;
}
</pre>
<p>Таким же образом вы можете <strong>добавить блок рекламных объявлений к любым</strong> другим тегам, которые вы используете при размете ваших <strong>записей на вашем сайте на CMS WordPress</strong>, которые у вас встречаются в тексте записи.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2015/02/dobavit-adsense-v-seredinu-zapisi-wordpress.html/feed</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title>Создание позиции вывода модулей в OpenCart</title>
		<link>https://nikita-sp.com.ua/2014/11/sozdanie-pozitsii-vyivoda-moduley-v-opencart.html</link>
					<comments>https://nikita-sp.com.ua/2014/11/sozdanie-pozitsii-vyivoda-moduley-v-opencart.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Sun, 16 Nov 2014 00:07:27 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[OpenCart]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[интернет магазин]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=1715</guid>

					<description><![CDATA[При создании интернет магазинов дизайн играет немаловажную роль. И случается так, что возможностей по выводу модулей OpenCart не хватает. Например вам необходимо вывести модуль в низу страницы (футере) или в другом месте, которое не указано в стандартных расположениях (верх и низ страницы, левая и правая колонка &#8212; position). Для решения данной проблемы необходимо создать новое расположение. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>При создании интернет магазинов дизайн играет немаловажную роль. И случается так, что возможностей по выводу модулей OpenCart не хватает. Например вам необходимо вывести модуль в низу страницы (футере) или в другом месте, которое не указано в стандартных расположениях (верх и низ страницы, левая и правая колонка &#8212; position).</p>
<p>Для решения данной проблемы необходимо создать новое расположение. Сделать это очень просто следуя инструкции.<span id="more-1715"></span></p>
<p>1. Создать файл шаблона для вашей позиции (расположения). Для этого можете скопировать любой уже имеющийся шаблон и переименовать его согласно желаемому названию, например <em>content_category_filter.tpl</em>.</p>
<p>&nbsp;</p>
<p>2. Создать контроллер для вашей позиции. Опять таки можете скопировать любой уже имеющийся контроллер, однако тут придется его отредактировать. В первую очередь необходимо изменить класс в нашем случае на <em>ControllerCommonContentCategoryFilter</em>. Далее найти строку вида:</p>
<pre class="brush: php; title: Код:; notranslate">if ($module['layout_id'] == $layout_id &amp;&amp; $module['position'] == 'content_top' &amp;&amp; $module['status']) {</pre>
<p>Как видите в данной строке отсеиваются включенные модули которые определены к выводу в верхней части страницы, на что указывает <em>content_top</em>, соответственно заменяем на <em>content_category_filter</em> и получаем следующий вид строки:</p>
<pre class="brush: php; title: Код:; notranslate">if ($module['layout_id'] == $layout_id &amp;&amp; $module['position'] == 'content_category_filter' &amp;&amp; $module['status']) {</pre>
<p>Далее также заменяем имя шаблона для вывода в строках 69-72, указывая на шаблон, созданный в п.1. Получаем вот такой кусок кода:</p>
<pre class="brush: php; title: Код:; notranslate">if (file_exists(DIR_TEMPLATE . $this-&gt;config-&gt;get('config_template') . '/template/common/content_category_filter.tpl')) {
$this-&gt;template = $this-&gt;config-&gt;get('config_template') . '/template/common/content_category_filter.tpl';
} else {
$this-&gt;template = 'default/template/common/content_category_filter.tpl';}</pre>
<p>&nbsp;</p>
<p>3. Теперь необходимо подключить нашу позицию для вывода на страницы, где будут выводиться модули, находящиеся в этой позиции. Для этого откройте контроллер любой страницы, например категорий (category.php) и найдите строки:</p>
<pre class="brush: php; title: Код:; notranslate">$this-&gt;children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);</pre>
<p>Сюда нам необходимо добавить подключение нашей позиции. Просто впишите ее в массив. <strong>Обратите внимание</strong>: если вы подключите ее последним элементом (добавите в конец массива, после common/header), то скрипты и стили не будут подключены! Рекомендуется подключать свою позицию исключительно перед footer и header! Например:</p>
<pre class="brush: php; title: Код:; notranslate">$this-&gt;children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/content_category_filter',
'common/footer',
'common/header'
);</pre>
<p>&nbsp;</p>
<p>4. Подключив позицию в контроллере нам необходимо вывести ее в шаблоне. Сделать это достаточно просто, вписав в нужное место в шаблоне страницы название переменной позиции, например:</p>
<pre class="brush: php; title: Код:; notranslate">&lt;?php echo $content_category_filter; ?&gt;</pre>
<p>&nbsp;</p>
<p>5. Теперь перейдем к административной части. Чтобы мы могли указать нашу позицию какому-нибудь модулю нам необходимо открыть файл (администраторского) шаблона данного модуля, например admin/view/template/module/category.tpl и найти строки, содержащие выпадающий список позиций. Для этого просто ищите по документу строку <em>[position]</em> или <em>content_bottom</em>.</p>
<p>В стандартных шаблонах данная переменная встречается 2 раза:</p>
<ol>
<li>При выводе уже имеющихся модулей в html;</li>
<li>При добавлении нового модуля в JavaScript.</li>
</ol>
<p>В прочих модулях количество вхождений может быть больше. После того как вы нашли нужный select просто добавьте ему новую опцию со значением новой позиции, например:</p>
<pre class="brush: php; title: Код:; notranslate">&lt;?php if ($module['position'] == 'content_category_filter') { ?&gt;
&lt;option value=&quot;content_category_filter&quot; selected=&quot;selected&quot;&gt;content_category_filter&lt;/option&gt;
&lt;?php } else { ?&gt;
&lt;option value=&quot;content_category_filter&quot;&gt;content_category_filter&lt;/option&gt;
&lt;?php } ?&gt;</pre>
<p>Тоже самое необходимо проделать и с JS частью, например:</p>
<pre class="brush: jscript; title: Код:; notranslate">html += '      &lt;option value=&quot;content_category_filter&quot;&gt;content_category_filter&lt;/option&gt;';</pre>
<p>После этого при редактировании модуля вам будет доступна новая позиция.</p>
<p><a href="http://nikita-sp.com.ua/wp-content/uploads/2014/11/create_new_position_opencart.jpg" rel="lightbox[1715]" data-wpel-link="internal"><img loading="lazy" decoding="async" width="600" height="54" itemprop="image" class="aligncenter size-medium wp-image-1754" src="http://nikita-sp.com.ua/wp-content/uploads/2014/11/create_new_position_opencart-600x54.jpg" alt="Create new position opencart" srcset="https://nikita-sp.com.ua/wp-content/uploads/2014/11/create_new_position_opencart-600x54.jpg 600w, https://nikita-sp.com.ua/wp-content/uploads/2014/11/create_new_position_opencart-960x87.jpg 960w, https://nikita-sp.com.ua/wp-content/uploads/2014/11/create_new_position_opencart-150x13.jpg 150w, https://nikita-sp.com.ua/wp-content/uploads/2014/11/create_new_position_opencart.jpg 1831w" sizes="auto, (max-width: 600px) 100vw, 600px" /></a></p>
<p>Позиция создана, модуль выведен. Действия 3 и 4 необходимо проделать со всеми страницами, на которых вам необходимо вывести позицию. Все файлы вы можете найти с помощью поиска по содержимому файлов если искать например <em>content_top</em> или <em>content_bottom</em> &#8212; это нативные (стандартные) позиции. Также действие 5 необходимо повторить для каждого из модулей отдельно.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2014/11/sozdanie-pozitsii-vyivoda-moduley-v-opencart.html/feed</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>Fatal error: Call to undefined function wpcf7_add_shortcode()</title>
		<link>https://nikita-sp.com.ua/2014/09/fatal-error-call-to-undefined-function-wpcf7_add_shortcode.html</link>
					<comments>https://nikita-sp.com.ua/2014/09/fatal-error-call-to-undefined-function-wpcf7_add_shortcode.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Wed, 03 Sep 2014 21:59:40 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[модули и плагины]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=1570</guid>

					<description><![CDATA[После очередного обновления небезызвестного плагина WordPress Contact Form 7 вылетела ошибка Fatal error: Call to undefined function wpcf7_add_shortcode(). В поисках решения этой проблемы я обратился к поисковым системам, но к сожалению, ни коим образом информация, найденная на официальном форуме WordPress мне не помогла. Как же все таки предотвратить эту ошибку? Решение более чем простое и предельно [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>После очередного обновления небезызвестного плагина <strong>WordPress Contact Form 7</strong> вылетела ошибка <strong>Fatal error: Call to undefined function wpcf7_add_shortcode()</strong>. В поисках решения этой проблемы я обратился к поисковым системам, но к сожалению, ни коим образом информация, найденная на официальном форуме WordPress мне не помогла. Как же все таки предотвратить эту ошибку?</p>
<p><span id="more-1570"></span></p>
<p>Решение более чем простое и предельно ясное. При обновлении плагина он сначала отключается, скачиваются новые файлы, и потом он заново активируется. И если у вас в каком-то файле темы без специальной проверки присутствует функция, существующая в файлах плагина, то естественно в случае отключения плагина она не будет доступна &#8212; имеем ошибку, и плагин не может заново активироваться после обновления.</p>
<p>Что же делать? Все просто! Найдите строку с вызовом данной функции (файл и строка указаны в тексте ошибки), и добавьте дополнительную проверку на существование функции:</p>
<pre class="brush: php; title: Код:; notranslate">if(function_exists(&quot;wpcf7_add_shortcode&quot;)){
wpcf7_add_shortcode('hidden', 'hidden', true);
}</pre>
<p>В этом случае, если плагин деактивирован, функция function_exists() вернет false и скрипт будет работать дальше, а если активирован &#8212; вызовет данную функцию с указанными параметрами.</p>
<p>Не знаю, возможно кому-то данная статья покажется ненужной или же слишком простой, но если она вам помогла, буду рад узнать об этом увидев инкремент счетчика лайков <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2014/09/fatal-error-call-to-undefined-function-wpcf7_add_shortcode.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Создать скрытые поля для Contact Form 7</title>
		<link>https://nikita-sp.com.ua/2014/08/sozdat-skryityie-polya-dlya-contact-form-7.html</link>
					<comments>https://nikita-sp.com.ua/2014/08/sozdat-skryityie-polya-dlya-contact-form-7.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Sat, 09 Aug 2014 01:58:08 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=1318</guid>

					<description><![CDATA[Плагин Contact Form 7 является одним из самых популярных модулей для WordPress для создания формы обратной связи. Тут просто создаются и редактируются поля, настраивается формат письма и многое другое. НО! К сожалению, не знаю почему, разработчики решили не добавлять скрытый тип поля (&#60;input type=&#187;hidden&#187; &#8230;&#62;). Для чего он нужен? Ну например чтобы передавать данные о [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Плагин <strong>Contact Form 7</strong> является одним из самых популярных модулей для <strong>WordPress</strong> для создания формы обратной связи. Тут просто создаются и редактируются поля, настраивается формат письма и многое другое. НО! К сожалению, не знаю почему, разработчики решили не добавлять скрытый тип поля (<em>&lt;input type=&#187;hidden&#187; &#8230;&gt;</em>).</p>
<p>Для чего он нужен? Ну например чтобы передавать данные о пользователе (IP, браузер и т.п.), данные о странице откуда отправили форму, или откуда перешли чтобы отправить форму (какая страница поспособствовала переходу в раздел контактов) и еще куча возможных применений!</p>
<p>Все это вы можете себе позволить, написав просто обработку нового <em>shortcode</em> (тега, шорт кода) в шаблоне контактной формы. По-умолчанию существуют такие теги как <em>text</em>, <em>email</em>, <em>textarea</em>, которые также сопровождаются параметрами: обязательное или не обязательное поле и многое другое.<span id="more-1318"></span></p>
<p>Теперь мы создадим новый тег <em>hidden</em> и в шаблоне добавим его как обычный тег с именем <em>[hidden inputName]</em>. Само имя тега <em>inputName</em> мы внесем в тело нашего сообщения. И остается только в файле functions.php прописать следующий код для обработки <strong>shortcode</strong>&#8216;а:</p>
<pre class="brush: php; title: Код:; notranslate">
// Register new shortcode for getting pages where contact form was send
function hidden($tag) {
    if ( ! is_array( $tag ) )
        return '';

if($tag['name'] == &quot;referer&quot;){
    $pageURL = 'http';
    if ($_SERVER[&quot;HTTPS&quot;] == &quot;on&quot;) {
        $pageURL .= &quot;s&quot;;
    }
    $pageURL .= &quot;://&quot;;
    if ($_SERVER[&quot;SERVER_PORT&quot;] != &quot;80&quot;) {
        $pageURL .= $_SERVER[&quot;SERVER_NAME&quot;].&quot;:&quot;.$_SERVER[&quot;SERVER_PORT&quot;].$_SERVER[&quot;REQUEST_URI&quot;];
    } else {
        $pageURL .= $_SERVER[&quot;SERVER_NAME&quot;].$_SERVER[&quot;REQUEST_URI&quot;];
    }
    $html = '&lt;input type=&quot;'.$tag['basetype'].'&quot; name=&quot;' . $tag['name'] . '&quot; value=&quot;'.$pageURL.'&quot; /&gt;';
}else{
    $html = '&lt;input type=&quot;'.$tag['basetype'].'&quot; name=&quot;' . $tag['name'] . '&quot; value=&quot;&quot; /&gt;';
}
    return $html;
}
if(function_exists(&quot;wpcf7_add_shortcode&quot;)){
    wpcf7_add_shortcode('hidden', 'hidden', true);
}</pre>
<p>В данном примере функции рассмотрен вариант отправки адреса страницы, откуда была отправлена форма, в случае если поле называется <em>referer</em>, в противном случае будет выводиться пустое скрытое поле, таким образом вы можете подвязать для себя по названию несколько скрытых полей.</p>
<p>На этом вроде все, если возникают вопросы &#8212; пишите в раздел вопросов и ответов, пишите комментарии, ставьте лайки!<br />
Удачного коддинга!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2014/08/sozdat-skryityie-polya-dlya-contact-form-7.html/feed</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Get dropdown options для Magic Fields 2</title>
		<link>https://nikita-sp.com.ua/2014/08/get-dropdown-options-dlya-magic-fields-2.html</link>
					<comments>https://nikita-sp.com.ua/2014/08/get-dropdown-options-dlya-magic-fields-2.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Sat, 09 Aug 2014 01:31:37 +0000</pubDate>
				<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[Magic Fieds]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[модули и плагины]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=1314</guid>

					<description><![CDATA[Плагин Magic Fields является достаточно популярным плагином для WordPress. Этот плагин позволяет создавать разные типы записей (custom post types) и дополнительные поля к ним. Популярен этот плагин ввиду своей простоты и гибкости. Зачастую Magic Fields применяется для создания каталогов записей определенного типа. Это может быть портфолио, каталог товаров, каталог заведений, чего угодно. Как и в [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Плагин <strong>Magic Fields</strong> является достаточно популярным плагином для <strong>WordPress</strong>. Этот плагин позволяет создавать разные типы записей (<em>custom post types</em>) и дополнительные поля к ним. Популярен этот плагин ввиду своей простоты и гибкости.</p>
<p>Зачастую <strong>Magic Fields</strong> применяется для создания каталогов записей определенного типа. Это может быть портфолио, каталог товаров, каталог заведений, чего угодно. Как и в любом каталоге пользователю было бы удобнее найти требуемую ему единицу благодаря поиску или фильтру по параметрам этих записей. Для этого нужно вывести фильтр &#8212; вывести все варианты значений, которые могут принимать параметры, для того чтобы с ними работал посетитель. Для полей типа input конечно варианты значений в фильтр не выводят, а вот для <strong>select</strong> (<strong>dropdown list</strong>) вывести их необходимо, но к сожалению, нативными средствами плагина <strong>Magic Fields 2</strong> тут не обойдешься.<span id="more-1314"></span></p>
<p>В своем старом посте <a title="Реализуем поиск для Magic Fields 2" href="http://nikita-sp.com.ua/2012/02/realizuem-poisk-dlya-magic-fields-2.html" data-wpel-link="internal">Реализуем поиск для Magic Fields 2</a> я рассматривал вариант SQL запроса прямо в шаблоне, но так делать не красиво, и вот, спустя время был обнаружен еще один способ!</p>
<p>Для того чтобы <strong>получить опции выпадающего списка дополнительного поля Magic Fields</strong> достаточно просто в файле <strong>functions.php</strong> создать нужную функцию и к ней обращаться в любом месте шаблона. Вот собственно и сама функция:</p>
<pre class="brush: php; title: Код:; notranslate">

// Magic Field get dropdown options
function get_field_options( $field, $post_type = NULL ) {
global $wpdb, $post;
static $field_options_cache = array();

if ( !$post_type ) { $post_type = get_post_type( $post-&gt;ID ); }

if ( !array_key_exists( $post_type, $field_options_cache ) ) {
$field_options_cache[$post_type] = array();

$sql = sprintf(
&quot;SELECT name, options FROM %s WHERE post_type = '%s'&quot;,
MF_TABLE_CUSTOM_FIELDS, $post_type );

$results = $wpdb-&gt;get_results( $sql, ARRAY_A );
foreach ( $results as $result ) {
$field_options_cache[$post_type][$result['name']] = unserialize( $result['options'] );
}
}

return $field_options_cache[$post_type][$field];
}

</pre>
<p>Вот таким нехитрым способом мы можем получить список опций для данного дополнительного поля, где среди прочих настроек будет хранится строка с опциями выпадающего списка разделенных через <em>\n</em> &#8212; т.е. новой строкой, как вы вводите эти данные в админке при создании поля.</p>
<p>На этом все. Удачного вам коддинга!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2014/08/get-dropdown-options-dlya-magic-fields-2.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SEO пагинация для Opencart</title>
		<link>https://nikita-sp.com.ua/2014/08/seo-pagination-for-opencart.html</link>
					<comments>https://nikita-sp.com.ua/2014/08/seo-pagination-for-opencart.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Tue, 05 Aug 2014 12:41:38 +0000</pubDate>
				<category><![CDATA[Плагины и модули]]></category>
		<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[OpenCart]]></category>
		<category><![CDATA[модули и плагины]]></category>
		<category><![CDATA[раскрутка сайта]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=1308</guid>

					<description><![CDATA[OpenCart очень мощный движек для разработки интернет магазина, но многие моменты с точки зрения SEO оптимизации в нем не реализованы. Сегодня мы поговорим про постраничную навигацию в категориях (пагинация, pagination) и в производителях. OpenCart генерирует страницы категорий в зависимости от количества товаров, находящихся в ней. И по-умолчанию эти страницы являются практически идентичными: одинаковые значение тега [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>OpenCart очень мощный движек для разработки интернет магазина, но многие моменты с точки зрения SEO оптимизации в нем не реализованы. Сегодня мы поговорим про <strong>постраничную навигацию</strong> в категориях (<strong>пагинация, pagination</strong>) и в производителях.</p>
<p>OpenCart генерирует страницы категорий в зависимости от количества товаров, находящихся в ней. И по-умолчанию эти страницы являются практически идентичными:</p>
<ul>
<li>одинаковые значение тега <em>h1</em>;</li>
<li>одинаковые значение <em>meta keywords</em>;</li>
<li>одинаковые значение <em>meta description</em>;</li>
<li>одинаковые значение <em>title</em>.</li>
</ul>
<p><span id="more-1308"></span></p>
<p>Это не лучшим образом сказывается на <strong>СЕО продвижении интернет-магазина</strong>. В связи, с этим мною был разработан небольшой и простой скрипт, позволяющий сделать уникальными значения этих параметров.</p>
<p>Скрипт банально добавляет в вашу локализацию фразу &#171;страница номер&#187;, которую в дальнейшем использует для генерации описания или заголовков для страниц, которые расположены дальше первой, по следующему принципу: &#171;Ваше описание категории или производителя страница номер [_номер_страницы_]&#187;.</p>
<p>Мод написан под vQmod 2.4 и скачать его можно тут: <a href="http://nikita-sp.com.ua/wp-content/uploads/2014/08/nikita_sp_seo_cats.zip" data-wpel-link="internal">nikita_sp_seo_cats.zip</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2014/08/seo-pagination-for-opencart.html/feed</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>SEO urls для Pav Blog News Module под OpenCart</title>
		<link>https://nikita-sp.com.ua/2014/08/seo-urls-dlya-pav-blog-news-module-pod-opencart.html</link>
					<comments>https://nikita-sp.com.ua/2014/08/seo-urls-dlya-pav-blog-news-module-pod-opencart.html#disqus_thread</comments>
		
		<dc:creator><![CDATA[Nikita_Sp]]></dc:creator>
		<pubDate>Tue, 05 Aug 2014 12:22:35 +0000</pubDate>
				<category><![CDATA[Плагины и модули]]></category>
		<category><![CDATA[Статьи о php]]></category>
		<category><![CDATA[OpenCart]]></category>
		<category><![CDATA[модули и плагины]]></category>
		<category><![CDATA[раскрутка сайта]]></category>
		<guid isPermaLink="false">http://nikita-sp.com.ua/?p=1303</guid>

					<description><![CDATA[Создавая интернет-магазины, часто выбирают CMS OpenCart как основу для разработки. Зачастую возникает необходимость создать раздел &#171;Новости&#187; в разрабатываемом интернет-магазине. Для решения данной задачи существует очень много модулей и альтернатив. В данной статье я предлагаю SEO решение для урлов под модуль Pav Blog News Module под OpenCart. Для работы вам будут необходимы следующие продукты: CMS OpenCart &#8212; сам движок [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Создавая интернет-магазины</strong>, часто выбирают <strong>CMS OpenCart</strong> как основу для разработки. Зачастую возникает необходимость создать раздел &#171;Новости&#187; в <strong>разрабатываемом интернет-магазине</strong>. Для решения данной задачи существует очень много модулей и альтернатив. В данной статье я предлагаю <strong>SEO решение для урлов под модуль Pav Blog News Module под OpenCart</strong>.</p>
<p>Для работы вам будут необходимы следующие продукты:</p>
<ul>
<li>CMS OpenCart &#8212; сам движок</li>
<li>Pav Blog News Module &#8212; собственно новостной плагин (freeware, бесплатный)</li>
<li>SEO PRO &#8212; плагин сео урлов для OpenCart</li>
</ul>
<p>Когда все установлено и настроено, переходим к правке кода модуля SEO PRO (catalog/controller/common/seo_pro.php), который собственно генерирует и обрабатывает наши ссылки. Нам необходимо будет сделать несколько вставок в исходный код модуля.<span id="more-1303"></span></p>
<p>Перед (~81 line):</p>
<pre class="brush: php; title: Код:; notranslate">if (isset($queries[$parts[0]])) {</pre>
<p>&nbsp;</p>
<p>Вставляем:</p>
<pre class="brush: php; title: Код:; notranslate">
/** BEGIN PROCESSING TO DECORD REQUET SEO URL FOR PAVO BLOG MODULE **/
 if( isset($url) &amp;&amp; count($url) == 2 &amp;&amp; ( preg_match( &quot;#pavblog#&quot;, $url[0] )) ){
 unset($this-&gt;request-&gt;get['pavblog/category']);
 unset($this-&gt;request-&gt;get['pavblog/blog']);
 unset($queries);
 $this-&gt;request-&gt;get['route'] = $url[0];
 $this-&gt;request-&gt;get['id'] = $url[1];
 } /** END OF PROCESSING TO DECORD REQUET SEO URL FOR PAVO BLOG MODULE **/
</pre>
<p>Ищем (~140 line):</p>
<pre class="brush: php; title: Код:; notranslate">case 'product/product/review':</pre>
<p>Перед этой строкой вставляем:</p>
<pre class="brush: php; title: Код:; notranslate">
 // Nikita_SP MOD FOR PAV BLOGS
 case 'pavblog/category':
 break;
 case 'pavblog/blog':
 $isblog = 1;
 break;
 // END NIKITA_SP MOD
</pre>
<p>Ищем цикл <em>SWITCH</em> на ~173 строке:</p>
<pre class="brush: php; title: Код:; notranslate">switch ($key) {</pre>
<p>И находим <em>default</em>. Перед ним вставляем:</p>
<pre class="brush: php; title: Код:; notranslate">
 // Nikita_SP MOD FOR PAV BLOGS
 case 'id':
 if(isset($isblog)){
 if ($this-&gt;config-&gt;get('config_seo_url_include_path')) {
 $blogpath = $this-&gt;getPathByBlog($value);
 if($blogpath){
 $categories = explode('_', $blogpath);
 foreach ($categories as $category) {
 $queries[] = 'pavblog/category=' . $category;
 }
 }
 }
 $queries[] = 'pavblog/blog=' . $value;
 $postfix = 1;
 }else{
 $category = $value;
 $blogpath = $this-&gt;getPathByBlogCat($category);
 if($blogpath){
 $categories = explode('_', $blogpath);
 foreach ($categories as $category) {
 $queries[] = 'pavblog/category=' . $category;
 }
 }
 }
 unset($data[$key]);
 break;
 // END NIKITA_SP MOD
</pre>
<p>Находим ~272 строку:</p>
<pre class="brush: php; title: Код:; notranslate">private function getPathByProduct($product_id) {</pre>
<p>И перед ней добавляем функции:</p>
<pre class="brush: php; title: Код:; notranslate">
 // Nikita_SP MOD FOR PAV BLOG
 private function getPathByBlog($blog_id) {
 $blog_id = (int)$blog_id;
 if ($blog_id &lt; 1) return false;

 static $path = null;
 if (!is_array($path)) {
 $path = $this-&gt;cache-&gt;get('blog.seopath');
 if (!is_array($path)) $path = array();
 }

 if (!isset($path[$blog_id])) {
 $query = $this-&gt;db-&gt;query(&quot;SELECT category_id FROM &quot; . DB_PREFIX . &quot;pavblog_blog WHERE blog_id = '&quot; . $blog_id . &quot;' ORDER BY category_id DESC LIMIT 1&quot;);

 $path[$blog_id] = $this-&gt;getPathByBlogCat($query-&gt;num_rows ? (int)$query-&gt;row['category_id'] : 0);

 $this-&gt;cache-&gt;set('blog.seopath', $path);
 }

 return $path[$blog_id];
 }

 private function getPathByBlogCat($category_id) {
 $category_id = (int)$category_id;
 if ($category_id &lt; 1) return false;

 static $path = null;
 if (!is_array($path)) {
 $path = $this-&gt;cache-&gt;get('blogcat.seopath');
 if (!is_array($path)) $path = array();
 }

 if (!isset($path[$category_id])) {
 $max_level = 2;

 $sql = &quot;SELECT CONCAT_WS('_'&quot;;
 for ($i = $max_level-1; $i &gt;= 0; --$i) {
 $sql .= &quot;,t$i.category_id&quot;;
 }
 $sql .= &quot;) AS path FROM &quot; . DB_PREFIX . &quot;pavblog_category t0&quot;;
 for ($i = 1; $i &lt; $max_level; ++$i) {
 $sql .= &quot; LEFT JOIN &quot; . DB_PREFIX . &quot;pavblog_category t$i ON (t$i.category_id = t&quot; . ($i-1) . &quot;.parent_id)&quot;;
 }
 $sql .= &quot; WHERE t0.category_id = '&quot; . $category_id . &quot;'&quot;;

 $query = $this-&gt;db-&gt;query($sql);

 $path[$category_id] = $query-&gt;num_rows ? $query-&gt;row['path'] : false;

 $this-&gt;cache-&gt;set('blogcat.seopath', $path);
 }

 return $path[$category_id];
 }
 // END NIKITA_SP MOD
</pre>
<p>После внесения этих правок в файле кеша SEO PRO вы увидите ваши СЕО УРЛЫ для блога, прописанные в админке.</p>
<p>Скачать файл со всеми изменениями можно <a href="http://nikita-sp.com.ua/wp-content/uploads/2014/08/seo_pro.zip" data-wpel-link="internal">тут</a>.</p>
<p>Для генерации SEO url категорий необходимо еще добавить вручную в базе данных или с помощью <a href="https://opencartforum.com/files/file/554-seo-manager-%D0%B4%D0%BB%D1%8F-ocstore-v153-%D0%B8-v1541/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="ext-link wpel-icon-right">SEO Manager<span class="wpel-icon wpel-image wpel-icon-6"></span></a> два сео урл: для основной категории блога с ID=1 и для самого блога. Вместо ключа &#171;blog&#187; вы можете использовать любое другое слово, оно будет использоваться как база для блога: http://text1.ru/your-base/category/post.html</p>
<p><a href="http://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo.jpg" rel="lightbox[1303]" data-wpel-link="internal"><img loading="lazy" decoding="async" width="600" height="317" itemprop="image" class="aligncenter size-medium wp-image-1634" src="http://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-600x317.jpg" alt="SEO url для PavBlog 1.1 on Opencart 1.5.4.1 - SEO manager update" srcset="https://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-600x317.jpg 600w, https://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-960x507.jpg 960w, https://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo.jpg 1864w" sizes="auto, (max-width: 600px) 100vw, 600px" /></a></p>
<p><a href="http://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-database.jpg" rel="lightbox[1303]" data-wpel-link="internal"><img loading="lazy" decoding="async" width="600" height="206" itemprop="image" class="aligncenter size-medium wp-image-1633" src="http://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-database-600x206.jpg" alt="SEO url для PavBlog 1.1 on Opencart 1.5.4.1 - Database update" srcset="https://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-database-600x206.jpg 600w, https://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-database-960x330.jpg 960w, https://nikita-sp.com.ua/wp-content/uploads/2014/08/pavblogseo-database.jpg 1050w" sizes="auto, (max-width: 600px) 100vw, 600px" /></a></p>
<p>На этом все, пользуйтесь, благодарите, пишите комментарии, ставьте лайки!<br />
Всем спасибо за внимание, всегда ваш Nikita_Sp.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nikita-sp.com.ua/2014/08/seo-urls-dlya-pav-blog-news-module-pod-opencart.html/feed</wfw:commentRss>
			<slash:comments>47</slash:comments>
		
		
			</item>
	</channel>
</rss>
