Поздравляю всех с очередным прекрасным летним днём! Сегодня я расскажу вам, как автоматически добавить рекламу или любой другой код прямо в текст ваших статей Joomla, Wordpress или в любом другом движке.
Казалось бы, такая простая и нужная функция: вставить в середину статьи блок с рекламой (рекламное объявление от Google или Яндекс - не важно), или не в середину, а, например, после первого абзаца каждой статьи. Но стандартно её, увы, нет. Поэтому я написал готовое, универсальное решение (собственную функцию) на чистом PHP, которое можно использовать на любом движке и даже на самописных сайтах.
В конце статьи я подробно покажу, что и как нужно делать, на примере обычной статьи в Joomla 2.5, на примере описания товара в VirtueMart 2, и на примере поста в Wordpress.
Возможности функции
Вставляет любой код (например, рекламу Google Adsense или рекламу Яндекс.Директа) после указанного тега. Мы задаём после скольких указанных тегов нужно вывести код. Например, можно вывести после первого параграфа (абзаца) или после третьей таблицы (тег table).
Тело функции
Итак, пошло самое горячее, обнажим тело функции:
//отрисовка рекламы в статьях function addContent($addTo, $add, $cntRep, $after = '</p>', $openTag = '<div align="center">', $closeTag = '</div>'){ $posAfter = 0; for ($i=0; $i < $cntRep; $i++) { $pos = stripos($addTo, $after, $posAfter); $posAfter = $pos+strlen($after); if($pos===FALSE){ return $addTo; } } $beforeAdding = substr($addTo, 0, $posAfter); $afterAdding = substr($addTo, $posAfter); $result = $beforeAdding . $openTag . $add . $closeTag . $afterAdding; return $result; } // конец addContent
Как пользоваться
Аргументы функции.
Те, кто читал мою статью про функции в PHP, могли заметить, что данная функция принимает 6 аргументов, три из которых имеют значение по умолчанию, то есть их не обязательно указывать при вызове функции.
Аргумент $addTo – это текст, внутри которого мы желаем поместить рекламу или любой другой код. То есть сюда нужно указывать PHP переменную, в которой содержится основной текст статьи, или текст описания товара, или что-нибудь другое (что угодно). Пример покажу чуть позже.
Аргумент $add – код, который вы хотите добавить. В нашем случае код рекламы, но ограничений нет, можете добавлять любой HTML, JavaScript, просто текст и тд.
$cntRep – после скольких тегов нужно добавить. Например, после шестого заданного тега. Здесь просто указываем цифру.
$after – после какого тега добавляем код. По умолчанию: после закрывающегося тега параграфа.
$openTag и $closeTag – это обёртка вашего вставляемого кода. Можно было и не делать эти два аргумента, тогда бы вы вписывали их (если бы они вам понадобились) внутри аргумента $add (в самом начале и самом конце). Но я сам часто пользуюсь этой функцией и мне почему-то показалось, что так гораздо удобней.
Вызов функции.
Держите живой пример:
addContent($text,'<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- 728*90 --> <ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-5153xxxxxxxx3278" data-ad-slot="738xxxx145"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>',5);
Этот код взят с сайта, который вы сейчас читаете :) В примере выше я добавляю в переменную $text скрипт рекламы от Google AdSense после пятого параграфа.
Пример использования функции в Joomla 2.5
Для того, чтобы внедрить мою функцию в любую CMS, всё что вам нужно знать: в каком файле находиться переменная с текстом статьи, и как эта переменная называется. Рассмотрим на примере стандартной статьи в Джумла, то есть на примере компонента com_content.
Заходим в файл /templates/ваш_шаблон/html/com_content/article/default.php. Если в вашем шаблоне нет такого файла, тогда в /components/com_content/views/article/tmpl/default.php
Ищем следующее PHP свойство: $this->item->text Именно внутри него храниться текст статьи. Вот как это выглядит (у меня это 99 строка в default.php):
<?php echo $this->item->text; ?>
Дописываем:
<?php $this->item->text = addContent($this->item->text,'<div style="border:3px solid red;color:white;font-size:30px;background:black;">любой код</div>',2); echo $this->item->text; ?>
Тело функции можете разместить в самом верху файла index.php, который находится в корне сайта. Но в нашем случае лучше размещать тело функции перед первым её вызовом, прямо в том же самом файле, что и сам вызов. То есть в нашем примере будет так:
<?php //отрисовка рекламы в статьях function addContent($addTo, $add, $cntRep, $after = '</p>', $openTag = '<div align="center">', $closeTag = '</div>'){ $posAfter = 0; for ($i=0; $i < $cntRep; $i++) { $pos = stripos($addTo, $after, $posAfter); $posAfter = $pos+strlen($after); if($pos===FALSE){ return $addTo; } } $beforeAdding = substr($addTo, 0, $posAfter); $afterAdding = substr($addTo, $posAfter); $result = $beforeAdding . $openTag . $add . $closeTag . $afterAdding; return $result; } // конец addContent $this->item->text = addContent($this->item->text,'<div style="border:3px solid red;color:white;font-size:30px;background:black;">любой код</div>',2); echo $this->item->text; ?>
Всё в одном файле, и тело функции и её вызов. Результат:
Пример для VirtueMart 2
Суть такая же. Чтобы вставить рекламу (например, от Рекламной Сети Яндекса - РСЯ) внутрь описания товаров, открываем файл /templates/ваш_шаблон/html/com_virtuemart/productdetails/default.php или если такого у вас нет, тогда /components/com_virtuemart/views/productdetails/tmpl/default.php.
Ищем свойство $this->product->product_desc и вызываем нашу функцию. Было:
<?php echo $this->product->product_desc; ?>
Стало:
<?php //отрисовка рекламы в статьях function addContent($addTo, $add, $cntRep, $after = '</p>', $openTag = '<div align="center">', $closeTag = '</div>'){ $posAfter = 0; for ($i=0; $i < $cntRep; $i++) { $pos = stripos($addTo, $after, $posAfter); $posAfter = $pos+strlen($after); if($pos===FALSE){ return $addTo; } } $beforeAdding = substr($addTo, 0, $posAfter); $afterAdding = substr($addTo, $posAfter); $result = $beforeAdding . $openTag . $add . $closeTag . $afterAdding; return $result; } // конец addContent $this->product->product_desc = addContent($this->product->product_desc,'<div style="border:3px solid red;color:white;font-size:30px;background:black;">любой код</div>',2); echo $this->product->product_desc; ?>
Результат:
Пример использования функции в Wordpress
И долгожданный Wordpress. С ним всё сложнее, потому что Wordpress менее гениален, чем Джумла, и там ребята кодят без ООП. И в один прекрасный день они решили, что вывод содержимого статьи с помощью функции – это клёво. Я говорю о функции the_content(), именно её вы должны найти в файле /wp-content/themes/ваш_шаблон/single.php.
Теперь нам придётся поймать работу этой функции в буфер, прежде чем проделать всё тоже самое, что и в случае с Джумлой. Звучит заумно и сложно, но всё гениальное просто! Было:
<?php the_content(); ?>
Сделаем:
<?php ob_start(); the_content(); $siteOnText = ob_get_clean(); //отрисовка рекламы с статьях function addContent($addTo, $add, $cntRep, $after = '</p>', $openTag = '<div align="center">', $closeTag = '</div>'){ $posAfter = 0; for ($i=0; $i < $cntRep; $i++) { $pos = stripos($addTo, $after, $posAfter); $posAfter = $pos+strlen($after); if($pos===FALSE){ return $addTo; } } $beforeAdding = substr($addTo, 0, $posAfter); $afterAdding = substr($addTo, $posAfter); $result = $beforeAdding . $openTag . $add . $closeTag . $afterAdding; return $result; } // конец addContent $siteOnText = addContent($siteOnText,'<div style="border:3px solid red;color:white;font-size:30px;background:black;">любой код</div>',2); echo $siteOnText; ?>
Результат:
Как разместить несколько блоков с рекламой в одной статье?
Опять-таки вопрос очень простой, но чтобы разобрались новички любого уровня, я объясню. Возьмём на рассмотрение пример с Wordpress. Ключевая строка:
$siteOnText = addContent($siteOnText,'<div style="border:3px solid red;color:white;font-size:30px;background:black;">любой код</div>',2);
Мы присваиваем придуманной нами переменной $siteOnText результат работы нашей функции addContent(). Если мы хотим добавить ещё блок кода, мы просто должны сделать тоже самое ещё раз. Например, мы хотим вставить блоки кода после 2 и 4 абзаца:
$siteOnText = addContent($siteOnText,'<div style="border:3px solid red;color:white;font-size:30px;background:black;">любой код</div>',2); $siteOnText = addContent($siteOnText,'<div style="border:3px solid black;font-size:30px;background:white;width:300px;float:right;">Ещё один рекламный блок</div>',4);
Результат: