Вставка кода после n-го абзаца или посередине статьи

Иногда возникает необходимость вставки рекламного кода (РСЯ, Адсенс и другие) или же какого-либо другого содержимого(блок, представление) внутрь содержимого статьи. При этом, вероятнее всего, код нужно вставить после определенного абзаца (параграфа) или же посередине статьи. Рассмотрим вставку рекламного кода внутрь содержимого текстового поля body для типа материала Статьи (Articles).

Подобный функционал лучше всего реализовывать в препроцессе ноды. Для вставки кода после определенного абзаца (тега p) добавим следующую функцию в файл template.php, используемой на сайте темы. Если функция препроцесса ноды уже там существует, то просто нужно скопировать содержимое функции и добавить к существующему:


function ИМЯТЕМЫ_preprocess_node(&$variables) {
  if (isset($variables['content']['body'])) {
    // Указываем номер абзаца, после которого будем выводить код
    $paragraph = 3;
    $body = $variables['content']['body'][0]['#markup'];
    $body = explode('</p>', $body);
    if (end($body) == "\n") {
      array_pop($body);
    }
    $content = '';
    foreach ($body as $id => $value) {
      if ($id == $paragraph) {
        // Добавляем нужный код 
        $content .= 'code';
      }
      $content .= $body[$id] . '</p>';
    }
    $variables['content']['body'][0]['#markup'] = $content;
  }
}

Чтобы вставить нужный код посередине статьи, нужно добавить следующий код:


function ИМЯТЕМЫ_preprocess_node(&$variables) {
  if (isset($variables['content']['body'])) {
    $body = $variables['content']['body'][0]['#markup'];
    $body = explode('</p>', $body);
    if (end($body) == "\n") {
      array_pop($body);
    }
    $content = '';
    foreach ($body as $id => $value) {
      if ($id == floor(count($body) / 2)) {
        // Добавляем нужный код
        $content .= 'code';
      }
      $content .= $body[$id] . '</p>';
    }
    $variables['content']['body'][0]['#markup'] = $content;
  }
}