Вопрос или проблема
Я создал эти две функции, чтобы переключаться между первым абзацем контента и всем остальным, кроме первого абзаца, так что когда пользователь выбирает ‘Больше’, статья плавно разворачивается, не заменяя уже отображаемый первый абзац, который является отрывком.
Однако, если в тексте есть шорткод, он отображается как синтаксис шорткода, а не правильно. Я понимаю, почему он не отображается, но я хотел бы заменить любые шорткоды в тексте, чтобы они просто отображались как текст, а не как синтаксис шорткода, заключённый в скобки.
function get_first_paragraph(){
global $post;
$str = wpautop( str_replace( 'src="http://', 'src="https://', get_the_content() ));
$str = substr( $str, 0, strpos( $str, '</p>' ) + 4 );
$str = strip_tags($str, '<a><strong><em>');
return '<p>' . $str . '</p>';
}
function get_the_post(){
global $post;
$str = wpautop( str_replace( 'src="http://', 'src="https://', get_the_content() ));
$str = substr( $str, (strpos( $str, '</p>')));
return $str;
}
Проверьте $str
с помощью get_shortcode_regex()
. Если $match
возвращается, вам нужно проанализировать $str
с помощью do_shortcode()
, а затем вернуть его, в противном случае продолжайте с false.
ОБНОВЛЕНИЕ
После сна, исследуя ваш комментарий, has_shortcode()
должен быть заменён на get_shortcode_regex()
, что я и сделал в своем оригинале выше.
Ответ или решение
Для решения вашей проблемы с заменой шорткодов в тексте, чтобы они отображались как текст, а не в виде синтаксиса шорткодов, вы можете использовать функцию do_shortcode()
. Это позволит обработать шорткоды и вывести их результат вместо синтаксиса. Вот как можно модифицировать ваши функции get_first_paragraph
и get_the_post
для достижения желаемого результата.
Обновленный Код
function get_first_paragraph() {
global $post;
// Получаем контент и заменяем http на https
$str = wpautop(str_replace('src="http://', 'src="https://', get_the_content()));
// Извлекаем первый абзац
$str = substr($str, 0, strpos($str, '</p>') + 4);
// Удаляем ненужные теги, оставляя только указанные
$str = strip_tags($str, '<a><strong><em>');
// Обрабатываем шорткоды для их корректного отображения
if (has_shortcode($post->post_content, 'shortcode_name')) { // Замените 'shortcode_name' на имя вашего шорткода
$str = do_shortcode($str);
}
return '<p>' . $str . '</p>';
}
function get_the_post() {
global $post;
// Получаем контент и заменяем http на https
$str = wpautop(str_replace('src="http://', 'src="https://', get_the_content()));
// Извлекаем текст, начиная со второго абзаца
$str = substr($str, strpos($str, '</p>'));
// Обрабатываем шорткоды для их корректного отображения
if (has_shortcode($post->post_content, 'shortcode_name')) { // Замените 'shortcode_name' на имя вашего шорткода
$str = do_shortcode($str);
}
return $str;
}
Объяснение Изменений
-
Использование
do_shortcode()
: В обеих функциях добавлена проверка наличия шорткода черезhas_shortcode()
. В случае его наличия, содержимое будет обработано функциейdo_shortcode()
, позволяющей корректно отобразить результат. -
Фильтрация контента: Вы все еще используете
strip_tags()
для удаления ненужных HTML-тегов, что позволяет сохранить форматирование текста. -
Корректное извлечение абзацев: Вы обрабатываете текст, извлекая его с помощью функции
substr()
, сохраняя при этом главный абзац и остальную часть контента.
Заключение
Теперь, при использовании этих обновленных функций, вы можете извлечь первый абзац и весь контент, и при этом шорткоды будут обработаны и отображены корректно. Не забудьте протестировать изменения и заменить shortcode_name
на конкретное имя шорткода, который вы используете в вашем контенте.