За последние 24 часа нас посетили 17769 программистов и 1718 роботов. Сейчас ищут 962 программиста ...

Публикация записи в Wordpess с попощью wp_insert_post

Тема в разделе "Wordpress", создана пользователем alex1753, 18 ноя 2024.

  1. alex1753

    alex1753 Новичок

    С нами с:
    25 июл 2022
    Сообщения:
    3
    Симпатии:
    0
    Уважаемые пользователи форума!

    Столкнулся с такой проблемой.
    При публикации записей с помощью функции wp_insert_post(), в html код записи мне необходимо добавить javascript код.
    Публикация происходит с помощью cron задания в Wordpress.

    После процесса публикации, теги <javascript>, </javascript> исчезают, исчезает также javascript код внедренный в теги (onclick='код скрипта').
    Есть ли возможность, чтобы javascript код не удалялся?

    Код php:
    Код (Text):
    1.         $htmlTitle = 'Пробный';
    2.         $html = '<div onclick=\'alert("Ok")\'> Отзывы </div> <script> alert("Ok"); </script>';
    3.  
    4.         $post_data = array( //Сохраняем запись
    5.             'ping_status'       =>  'closed',
    6.             'post_title' => $htmlTitle,
    7.             'post_content' => $html,
    8.             'post_status' => 'publish',
    9.             'post_author' => 1,
    10.             'post_category' => array(0),
    11.             'post_excerpt'  => 'Это минитекст'
    12.         );
    13.  
    14.         $post_id = wp_insert_post($post_data, true);
    Код html в записи:

    Код (Text):
    1. <div> Отзывы </div>
    2. <p>  alert(«Ok»); </p>
     
  2. wphelpru

    wphelpru Гость

    С нами с:
    5 май 2025
    Сообщения:
    3
    Симпатии:
    2
    Адрес:
    Москва
    Добрый день! Попробовали разобраться с Вашей проблемой. Чтобы сохранить JavaScript-код и обработчики событий при вставке поста через `wp_insert_post()`, необходимо временно отключить фильтрацию контента WordPress. Вот как это можно сделать:

    $htmlTitle = 'Пробный';
    $html = '<div onclick=\'alert("Ok")\'> Отзывы </div> <script> alert("Ok"); </script>';

    $post_data = array(
    'ping_status' => 'closed',
    'post_title' => $htmlTitle,
    'post_content' => $html,
    'post_status' => 'publish',
    'post_author' => 1,
    'post_category' => array(0),
    'post_excerpt' => 'Это минитекст'
    );

    // Отключаем фильтрацию контента
    kses_remove_filters();

    // Вставляем пост
    $post_id = wp_insert_post($post_data, true);

    // Восстанавливаем фильтрацию
    kses_init_filters();


    Пояснения:

    1. ‘kses_remove_filters()’ — отключает систему фильтрации KSES, которая удаляет «небезопасные» HTML-теги и атрибуты.
    2. `wp_insert_post()’ — вставляет пост с исходным HTML, включая `<script>` и атрибуты вроде `onclick`.
    3. `kses_init_filters()` — включает фильтрацию обратно после вставки.

    Важно!
    - Убедитесь, что код выполняется в безопасном контексте (скрипт генерирует доверенный контент).
    - Если вы работаете в админ-панели, проверьте права пользователя на `unfiltered_html`.

    Альтернативный способ через фильтр:

    Если нужно разрешить только определенные теги/атрибуты глобально, добавьте:

    add_filter('wp_kses_allowed_html', 'custom_kses_rules', 10, 2);
    function custom_kses_rules($tags, $context) {
    if ($context === 'post') {
    $tags['script'] = array( 'type' => true );
    $tags['div']['onclick'] = true;
    }
    return $tags;
    }

    Этот код разрешает тег `<script>` и атрибут `onclick` для `<div>` в контенте постов.