WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Рекламный блок в тексте статьи

Самое лучшее в книге то, что она не обрывается на самом интересном месте для рекламной вставки...

Реклама внутри статьи

Знаю, что это самый изощренный и пожалуй, ненавистный со стороны пользователя способ вставлять рекламный блок в текст статьи, но в некоторых, редких, случаях брезгать таким способом глупо, впрочем, это только лишь мое мнение.

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

А теперь по теме: как вставить рекламу в контент

Представляю хак для WordPress, благодаря которому можно легко установить рекламный блок в текст статьи, например, рекламный блок Google AdSense или ЯДирект.

Уже не помню где, но где-то я видел реализацию этой задачи, только было описано как вставить рекламный блок в текст статьи после тега <!--more-->. А как быть если на сайте автор в принципе не пользуется этим тегом, как тогда вставить рекламу на все страницы? Ответ на этот вопрос — такой вот мой код:

<?php

/**
 * Вставляет рекламный блок в первый перенос строки или первый закрывающий тег </p> или </table>
 * спустя определенное количество символов.
 *
 * @param number $nu - спустя сколько символов искать перенос строки и вставлять рекламу? 400 - по умолчанию.
 *
 * version: 0.2
 */
add_filter('the_content', 'kama_content_advertise', -10 );
function kama_content_advertise( $text, $num = false ){
	if( ! is_singular() ) return $text; // убедимся что мы на отдельной странице

	if( ! $num ) $num = 400;

	// Код рекламы
	ob_start();
	?>

	<div class="kama-inline-ads" style="float:right; margin:0 0 1em 1.5em;">
	здесь рекламный код 
	</div>    

	<?php
	$adsense = ob_get_clean();

	// Раскомментируйте, если нужно вставить блок сразу перед тегом <!--more-->
	# return str_replace('<!--more-->', $adsense.'<!--more-->', $text);

	return preg_replace('~[^^]{'. $num .'}.*?(?:\r?\n\r?\n|</p>|</table>)~su', "\${0}$adsense", trim( $text ), 1);
}

Код вставляет рекламный блок  в первый попавшейся перенос строки или закрывающий тег </p> или тег </table> спустя определенное количество символов (задается в переменной $nu). Т.е. в данном случае в тексте статьи будет пропущено 400 символов, после которых будет найден первый перенос строки (или тег </p>) и перед ним будет вставлен рекламный блок.

Думаю не нужно акцентировать внимание на том, что фразу "здесь рекламный код" нужно заменить на, этот самый, рекламный код? smile

Если нужно вставить рекламный блок перед тегом more

Так же на всякий, пожарный случай я предусмотрел случай, когда нужно вставлять рекламный блок перед тегом <!--more-->, для этого, просто раскомментируйте предпоследнюю строку:

return str_replace('<!--more-->', $adsense.'<!--more-->', $text);
	// return preg_replace('@([^^]{'.$nu.'}.*?)(\r?\n\r?\n|</p>)@', "\\1$adsense\\2", trim($text), 1);

Реклама только для старых постов

Если есть необходимость показывать рекламу только для постов срок давности которых, скажем, 7 дней, то используйте такой код:

add_filter('the_content', 'kama_content_advertise', -10);
function kama_content_advertise( $text ){
	$days = 7; // через сколько дней, спустя дату публикации поста, показывать рекламу.
	$nu = 400; //спустя сколько символов искать перенос строки и вставлять рекламу?

	$offset = (int) time() - (int) strtotime($GLOBALS['post']->post_date);
	if($offset < (3600*24*$days) ) return $text;

	//Код рекламы
	$adsense = '
		<div style="float:right;margin:0 0 10px 15px;">
		здесь рекламный код
		</div>
	';

	return preg_replace('@([^^]{'.$nu.'}.*?)(\r?\n\r?\n|</p>)@', "\\1$adsense\\2", trim($text), 1);
}

Размещать рекламу таким образом может быть удобно, когда вы не хотите отвлекать своих постоянных читателей рекламой в новых статьях. Ведь именно постоянные читатели в первую очередь заходят прочесть ваш очередной шедевр.

103 коммента
Полезные 10 Вопросы 2 Все
  • Сергей

    Привет, Тимур. Напиши, пожалуйста, код для вставки рекламного кода в статью только после первого заголовка H2. Чтобы, если в стать несколько заголовков H2, реклама выводилась только после первого H2.

    Соответственно, если в статье нет заголовков H2, тогда не выводить рекламный блок.

    Спасибо.

    Ответить12.Июн.2015 01:03 #
    • Kama7721
      <?php
      ## Выводит рекламу только после первого заголовка h2, если он есть
      function kama_content_advertise( $text ){
      	if( ! is_singular() )
       return $text; // убедимся что мы на отдельной странице
      
      	ob_start();
      	?>
      
      	<div class="kama-inline-ads" style="float:right; margin:0 0 1em 1.5em;">
      	здесь рекламный код 
      	</div>    
      
      	<?php
      	$adsense = ob_get_clean();
      
      	// Раскомментируйте, если нужно вставить блок сразу перед тегом <!--more-->
      	# return str_replace('<!--more-->', $adsense.'<!--more-->', $text);
      
      	return preg_replace('/<\/h2>/i', "\${0}$adsense", trim( $text ), 1);
      }
      add_filter('the_content', 'kama_content_advertise', -10 );
      ?>
      1
      Ответить14.Июн.2015 08:07 #
      • Максим

        Супер, почти то, что я искал. Но, как переделать этот код, чтобы он выводил рекламу только после 2-го H2 в статье?

        Т.е. если в статье только 1 заголовок H2 или его нет вообще - рекламу не выводим.

        Если в статье 2, 3 и т.д. заголовков H2 - показываем рекламу только после второго.

        Спасибо.

        Ответить15.Июн.2015 12:29 #
        • Kama7721

          Замените ругулярку в конце функции на эту

          return preg_replace('/<\/h2>.*?<\/h2>/is', "\${0}$adsense", trim( $text ), 1);
          2
          Ответить1.Ноя.2015 02:42 #
      • Александр

        Подскажите, что изменить, чтобы блок выводился не после h2, а перед? Заранее спасибо

        Ответить13.Июн.2018 09:35 #
  • Иван

    Доброго Вам времени суток! А как заставить работать эту штуку в мобильной версии сайта, например созданную плагином wptouch?

    Ответить23.Июн.2015 08:42 #
    • campusboy3529 www.youtube.com/c/wpplus

      Привет! wptouch использует свои темы, они хранятся вроде как в папке с самим плагином. Так что открывайте тему, которую используете в wptouch и добавляйте код как обычно.

      Ответить23.Июн.2015 09:00 #
  • Марат

    Сегодня яндекс новости начал требовать что бы в feed не было постороннего кода. код рекламы как раз получается лишним.
    как сделать чтобы код объявление не показывался в feed ?

    Ответить2.Фев.2016 19:55 #
    • Kama7721

      Используйте проверку if( is_feed() ){}:

      if( ! is_singular() || is_feed() ) return $text; // убедимся что мы на отдельной странице
      Ответить2.Фев.2016 20:24 #
  • Василий

    Здравствуйте, Kama! Столкнулся с проблемой: код необходимо вставить не в the_content, в в произвольное поле the_field('description').

    add_filter('the_content', 'kama_content_advertise', -10);
    function kama_content_advertise($text){
    	global $post;
    
    	if( $post->post_type != 'post' )
    		return;
    
    	echo $text;
    	?>
    	ТЕСТОВЫЙ КОД
    	<?php
    }

    Подскажите, пожалуйста, как правильно это реализовать?

    Ответить7.Мар.2016 00:57 #
  • Евгений hozobzor.com

    Подскажите в какой файл вставлять этот код?

    Ответить6.Июн.2016 20:51 #
    • campusboy3529 www.youtube.com/c/wpplus

      В файл functions.php Вашей темы, например в самый его конец перед закрывающим ?>. Если закрывающего нет, то просто в конец и всё.

      Ответить7.Июн.2016 03:06 #
  • Виктор

    Подскажите, а как вставить код после первого изображения поста? Есть ведь там такая функция $first_img

    Ответить29.Авг.2016 17:11 #
    • Kama7721

      В регулярке добавь <img[^>]+>, замени (?:\r?\n\r?\n|</p>|</table>) на (?:<img[^>]+>|\r?\n\r?\n|</p>|</table>).

      Правда тут если картинка находится в A теге будет косяк, или если картинка является caption шорткодом... Это очень простое решение...

      1
      Ответить29.Авг.2016 17:21 #
  • Борода

    Ваш код работает- спасибо, что поделились, однако выводится и на страницах и на записях. Как это исправить?

    Ответить27.Окт.2016 17:51 #
    • Kama7721

      Заменяешь

      if( ! is_singular() ) return $text; // убедимся что мы на отдельной странице

      На

      if( ! is_singular('page') ) return $text; // только для страниц
      
      // или 
      
      if( ! is_singular('post') ) return $text; // только для постов
      1
      Ответить28.Окт.2016 22:34 #
  • PHouse6 poweredhouse.ru

    Есть ли похожая реализация с выводом блока через определенное количество постов в архивах?

    Ответить29.Ноя.2016 20:42 #
  • Роман

    Скажите пожалуйста Как убрать рекламу на некоторых страницах сайта?

    function kama_content_advertise($text){
    //спустя сколько символов искать перенос строки и вставлять рекламу?
    	$nu = 700;
    //Код рекламы
    	$adsense = <<<HTML
    код адсенс
    HTML;
    	//    return str_replace('<!--more-->', $adsense.'<!--more-->', $text);
    	return preg_replace('@([^^]{'.$nu.'}.*?)(\r?\n\r?\n|
    )@', "\\1$adsense\\2", trim($text), 1);
    }
    add_filter('the_content', 'kama_content_advertise', -10);
    Ответить12.Июн.2019 01:59 #