Как автоматически вставить рекламу в статьи Joomla и Wordpress

"Все аспекты самостоятельного создания и продвижения сайтов
от практика с многолетним опытом." — блог Рудь Сергея
info@site-on.net
Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!
14.06.2014

Поздравляю всех с очередным прекрасным летним днём! Сегодня я расскажу вам, как автоматически добавить рекламу или любой другой код прямо в текст ваших статей 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);

Результат:

Именно этим универсальным методом я добавляю рекламу на все свои сайты, без использования сторонних плагинов и замедления сайтов. Спасибо за внимание. Не пропустите новые статьи, подписывайтесь!

С уважением, .
Пожалуйста, оцените эту статью
Средняя оценка: 4.63 из 5 (проголосовало: 16)
Статья оказалась вам полезной? Подпишитесь, чтобы не пропустить новые!

Ваш email:
Вы можете помочь развитию проекта, сделав всего 1 клик:
Спасибо!
Пожалуйста, прокомментируйте, как Вам моя статья?
Имя:
Комментарий:

Если Вы хотите вставить код, пожалуйста, заключайте его в [code][/code]

Подписаться на новые комментарии:

E-mail:


Защита от спама: пожалуйста, напишите слово "сел" справа налево
Ответ:
Подписаться на новые комментарии без комментирования - Email:
Защита от спама: пожалуйста, напишите слово "сел" справа налево
Ответ:

09.07.2014 12:34:55 Kiryan:
Огромное спасибо! Отлично работает c K2 на joomla 2.5
<?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->fulltext = addContent($this->item->fulltext,'<div>любой код</div>',5);

echo $this->item->fulltext;
?>

Ответить на комментарий


08.09.2014 16:40:53 Андрей:
Сергей,а как выводить рекламу в Joomla именно в описании категорий? Можете показать тот участок в коде, который надо заменить.

Ответить на комментарий


24.09.2014 03:02:57 Анатолий:
Зачастую бывает, что абзацы в разных статьях не равны и было бы здорово, если бы можно было указать кол-во знаков текста, после которого искать нужный тег и вставлять рекламу.

Ответить на комментарий


04.11.2014 18:18:50 Антон:
А как вместо кода вставить в это место модуль?
10.11.2014 22:27:56 Сергей отвечает:
Модуль внутри компонента (а не шаблона), можно вставить с помощью, например, такого кода:

<?php
jimport( 'joomla.application.module.helper' );
$module = JModuleHelper::getModules('viewed');
$attribs['style'] = 'xhtml';
echo JModuleHelper::renderModule($module[0], $attribs);
?>


Почитайте документацию, чтобы разобраться. А так вам остаётся додумать, как поместить данный код в середину статьи. Если хотите использовать код из данной статьи, то первое что приходит мне в голову, отрендерите модуль в буфер, поместите буфер в переменную, а далее всё по инструкции.

Вот о чём я:

<?php
jimport( 'joomla.application.module.helper' );
$module = JModuleHelper::getModules('viewed');
$attribs['style'] = 'xhtml';
ob_start();
echo JModuleHelper::renderModule($module[0], $attribs);
$add = ob_get_clean();
?>
11.11.2014 18:49:58 Антон отвечает:
Спасибо. Пока остановился на таком варианте:

<?php

//отрисовка рекламы в статьях
function addContent($addTo, $add, $cntRep, $position ,$after = '</p>', $openTag = '<div>', $closeTag = '</div>'){
$posAfter = 0;
for ($i=0; $i < $cntRep; $i++) {
$pos = stripos($addTo, $after, $posAfter);
$posAfter = $pos+strlen($after);
if($pos===FALSE){
return $addTo;
}
}

$document = &JFactory::getDocument();
$renderer = $document->loadRenderer('modules');
$options = array('style' => 'table');
$addmodule = $renderer->render($position, $options, null);

$beforeAdding = substr($addTo, 0, $posAfter);
$afterAdding = substr($addTo, $posAfter);
$result = $beforeAdding . $openTag . $addmodule . $add . $closeTag . $afterAdding;
return $result;
}
// конец addContent

$this->item->text = addContent($this->item->text, '' , 10, 'tm1', '</p>','<div align="right">', '</div>');
$this->item->text = addContent($this->item->text, '' , 16, 'user56');

echo $this->item->text;

?>

Джумла помещает возникающую в статье позицию в таблицу. И присваевает ей определенные свойства, которые тоже хочу изменить. Сижу. Думаю ))

Ответить на комментарий


31.01.2015 09:38:23 Костя:
Спасибо, второй день ищу как это сделать и вот сделал.
огромное спасибо, репост и оценка 5

Ответить на комментарий


12.06.2015 17:05:56 Николай:
Сверх благодарен вам за эту статью, уже дважды помогает мне.

Огромное спасибо, подписался.

Ответить на комментарий


27.08.2015 15:38:26 Всеволод:
Скажите, а что произойдет, если я хочу, чтобы блок выводился после 10 </p>, а их всего 8, например?
Спасибо.
28.08.2015 16:16:45 Сергей отвечает:
По идеи ничего не произойдет. Статья останется без изменений.
05.10.2016 12:40:37 Валерий отвечает:
Попробовал выводить после 10-го при наличии всего 8-ми.
Блок просто не показывается.

Ответить на комментарий


14.01.2016 16:31:34 Руслан:
Отличная функция! Подскажите, а как сделать, чтобы добавить текст перед </p>?

Ответить на комментарий


10.04.2016 18:01:12 Андрей:
Здравствуйте! А как вставить рекламный блок сразу после текста статьи joomla, чтобы вперёд него не лезли плагины соцсетей, которые размещаются сразу после текста?
Спасибо.

Ответить на комментарий


15.04.2016 16:54:51 Алина:
Друзья, я не очень хорошо разбираюсь в PHP. Поставила код в нужном месте, рекламный блок отображается в статье после первого абзаца. Не могу понять, как указать значение $cntRep чтобы блок появлялся, например, после 4 или 5 </p>. Подскажите, пожалуйста! :)
05.10.2016 12:43:48 Валерий отвечает:
Найдите в коде: >любой код</div>',2);
Двойка - это и есть искомая Вами цифра, которую замените на нужную 4 или 5.

Ответить на комментарий


24.05.2016 22:49:47 Deni:
Знаете. У меня уже как-то интересно сложилось с вашим сайтом. Как только появляется задача, я начинаю искать решение. Когда прочту весь хлам в нете по теме, неожиданно натыкаюсь на в закладках на ваш сайт и на тебе готовое решение. Вы прямо как чувствуете, что нужно. ОГРОМНОЕ Вам спасибо за труд. Вы мне уже помогли не один раз. 5 с меня, подписка и репост.

Вот только возник вопрос. А как сделать в этой функции, что бы код выводился после определенного class?

Ответить на комментарий

Использую для работы
Мои расширения
Свежие статьи
Рекомендую
Горячо обсуждаемые
Подписка
  • Следовать в twitter:
  • Подписаться по RSS:
  • Подписаться по E-mail:
  • Следить ВКонтакте:
  • Следить на Facebook:
Пользовательское соглашение об условиях использования сайта и Политика конфиденциальности
Перепечатывание или копирование материалов сайта (текста, изображений и другого содержимого) для их публичного или коммерческого использования в сети Интернет, либо в печатных изданиях строго запрещены. При нарушении данного правила, с нашей стороны будут предприняты соответствующие меры, вплоть до судебной жалобы.
© site-on.net
Шрифт: +стандартно-