Замените шорткод в подстроке

Вопрос или проблема

Я создал эти две функции, чтобы переключаться между первым абзацем контента и всем остальным, кроме первого абзаца, так что когда пользователь выбирает ‘Больше’, статья плавно разворачивается, не заменяя уже отображаемый первый абзац, который является отрывком.

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

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.

  1. GetShortCodeRegEx
  2. DoShortCode

ОБНОВЛЕНИЕ

После сна, исследуя ваш комментарий, 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;
}

Объяснение Изменений

  1. Использование do_shortcode(): В обеих функциях добавлена проверка наличия шорткода через has_shortcode(). В случае его наличия, содержимое будет обработано функцией do_shortcode(), позволяющей корректно отобразить результат.

  2. Фильтрация контента: Вы все еще используете strip_tags() для удаления ненужных HTML-тегов, что позволяет сохранить форматирование текста.

  3. Корректное извлечение абзацев: Вы обрабатываете текст, извлекая его с помощью функции substr(), сохраняя при этом главный абзац и остальную часть контента.

Заключение

Теперь, при использовании этих обновленных функций, вы можете извлечь первый абзац и весь контент, и при этом шорткоды будут обработаны и отображены корректно. Не забудьте протестировать изменения и заменить shortcode_name на конкретное имя шорткода, который вы используете в вашем контенте.

Оцените материал
Добавить комментарий

Капча загружается...