Показать контент после первого и второго абзаца
Функция ниже используется для отображения определенного контента после первого абзаца. Мне нужно показывать 'контент X' после 1-го абзаца и 'контент Y' после 2-го абзаца.
<?php
$paragraphAfter = 1; //отобразить после первого абзаца
$content = apply_filters('the_content', get_the_content());
$content = explode("</p>", $content);
for ($i = 0; $i <count($content); $i++ ) {
if ($i == $paragraphAfter) { ?>
<div>Вставьте контент здесь</div>
<?php }
echo $content[$i] . "</p>";
} ?>
Буду благодарен за любую помощь.

Мой способ сделать это (см. обновление ниже):
function addParagraphs($content) {
// можно добавить столько, сколько нужно:
$additions = array(
'<p>После первого абзаца</p>',
'<p>После второго абзаца</p>'
);
$content = get_the_content();
$output = ''; // определяем переменную, чтобы избежать предупреждений PHP
$parts = explode("</p>", $content);
$count = count($parts); // вызываем count() только один раз, это быстрее
for($i=0; $i<$count; $i++) {
$output .= $parts[$i] . '</p>' . $additions[$i]; // отсутствующие дополнения не добавляются
}
return $output;
}
add_filter('the_content','addParagraphs');
Ответ обновлён согласно последующим комментариям:
$paragraphAfter[1] = '<div>ПОСЛЕ ПЕРВОГО</div>'; // отображать после первого абзаца
$paragraphAfter[3] = '<div>ПОСЛЕ ТРЕТЬЕГО</div>'; // отображать после третьего абзаца
$paragraphAfter[5] = '<div>ПОСЛЕ ПЯТОГО</div>'; // отображать после пятого абзаца
$content = apply_filters( 'the_content', get_the_content() );
$content = explode("</p>", $content);
$count = count($content);
for ($i = 0; $i < $count; $i++ ) {
if ( array_key_exists($i, $paragraphAfter) ) {
echo $paragraphAfter[$i];
}
echo $content[$i] . "</p>";
}

Спасибо @Max Yudin, но, к сожалению, мне это не подходит. Я хотел бы показывать, например, после 1-го и 5-го параграфа, а не обязательно после 1-го и 2-го.

@Michael, ты хочешь использовать это для каждого поста отдельно?

Да, @Max Yudin, я хочу выводить контент после определенных постов в цикле на главной странице.

@Michael, должно ли содержимое быть одинаковым после одного абзаца и таким же после других?
И ты используешь это в functions.php
или в шаблоне?

@Michael, добавлена ещё одна версия решения на основе твоего кода для использования в шаблоне.

// Добавляем фильтр для вставки рекламы в контент
add_filter( 'the_content', 'prefix_insert_post_ads' );
function prefix_insert_post_ads( $content ) {
$ad_code = '<div>Код рекламы здесь</div>';
// Вставляем рекламу только в одиночных записях и не в админке
if ( is_single() && ! is_admin() ) {
return prefix_insert_after_paragraph( $ad_code, 2, $content );
}
return $content;
}
// Основная функция для вставки контента после указанного абзаца
function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
$closing_p = '</p>';
// Разбиваем контент на абзацы
$paragraphs = explode( $closing_p, $content );
foreach ($paragraphs as $index => $paragraph) {
// Добавляем закрывающий тег, если абзац не пустой
if ( trim( $paragraph ) ) {
$paragraphs[$index] .= $closing_p;
}
// Вставляем контент после указанного абзаца
if ( $paragraph_id == $index + 1 ) {
$paragraphs[$index] .= $insertion;
}
}
// Собираем контент обратно
return implode( '', $paragraphs );
}

Я знаю, что это старый вопрос, но этот ответ должен помочь тем, кто все еще ищет решение.
Этот плагин отлично работает с любой темой.
https://wordpress.org/plugins/insert-post-ads
Вы можете выбрать первое/второе или любое другое место для отображения вашей рекламы.

Я искал способ использовать get_template и делюсь им здесь, вдруг кому-то пригодится
<?php
$paragraphAfter[1] = "get_template_part( 'part-related', 'ad-first' );";
$paragraphAfter[3] = "get_template_part( 'part-related', 'ad-third' );"; // отображать после пятого параграфа
$paragraphAfter[5] = "get_template_part( 'part-related', 'ad-fifth' );";
$content = apply_filters( 'the_content', get_the_content() );
$content = explode("</p>", $content);
$count = count($content);
for ($i = 0; $i < $count; $i++ ) {
if ( array_key_exists($i, $paragraphAfter) ) {
$string = eval($paragraphAfter[$i]); // Выполнить строку как код
echo $string;
}
echo $content[$i] . "</p>";
}
?>
