wp_insert_post iframe отсутствует

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

В моей установке я использую одну пользовательскую страницу. Здесь я добавляю одно текстовое поле и редактор fck. Это для заголовка и содержимого. Мне нужно вставить это на страницу.

Я использую следующий код

$my_post = array(
    'post_title'    => $_POST['title'],
    'post_content'  => $_POST['content'],
    'post_type'       => 'page',
    'post_status'   => 'publish',
    'post_author'   => 1,
    'menu_order'    => 10,
);

// Вставка поста в базу данных
$post_ID = wp_insert_post( $my_post );  

В поле содержимого я вставляю контент с некоторыми iframe видео. Страница успешно вставляется, но теги iframe не обновляются. Они удаляются при обновлении или вставке содержимого.

remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
 
$id = wp_insert_post( $my_post );
 
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');

// Удаляет все фильтры KSES для ввода контента.
kses_remove_filters();
 
$id = wp_insert_post( $my_post );
 
// Добавляет все фильтры KSES для ввода контента.
kses_init_filters();

Ответ или решение

Чтобы решить проблему с тем, что теги <iframe> теряются при вставке или обновлении контента в WordPress с помощью функции wp_insert_post, необходимо понимать, что WordPress применяет фильтры безопасности, такие как wp_kses, которые предназначены для защиты сайта от вредоносного контента. Эти фильтры автоматически удаляют теги HTML, которые могут быть потенциально опасными, включая теги <iframe>. Для решения этой проблемы можно воспользоваться несколькими подходами.

1. Удаление фильтров wp_kses

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

remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');

$my_post = array(
    'post_title'    => $_POST['title'],
    'post_content'  => $_POST['content'], // Здесь ваше содержимое с iframe
    'post_type'     => 'page',
    'post_status'   => 'publish',
    'post_author'   => 1,
    'menu_order'    => 10,
);

// Вставляем пост в базу данных
$post_ID = wp_insert_post($my_post);

add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');

2. Использование kses_remove_filters

Эта функция позволяет вам временно удалить все фильтры KSES, что может быть полезно, но, опять же, вызывает вопросы безопасности.

kses_remove_filters();

$my_post = array(
    'post_title'    => $_POST['title'],
    'post_content'  => $_POST['content'],
    'post_type'     => 'page',
    'post_status'   => 'publish',
    'post_author'   => 1,
    'menu_order'    => 10,
);

$post_ID = wp_insert_post($my_post);

kses_init_filters();

3. Настройка wp_kses для разрешения iframe

Другой подход — это настройка функции wp_kses для разрешения определенных атрибутов и тегов, таких как <iframe>. Для этого следует добавить собственную функцию kses в файл functions.php вашей темы.

function custom_allowed_html() {
    return array(
        'iframe' => array(
            'src'   => array(),
            'width' => array(),
            'height' => array(),
            'frameborder' => array(),
            'allow' => array(),
            'allowfullscreen' => array(),
        ),
        // добавьте другие разрешенные теги по необходимости
    );
}
add_filter('wp_kses_allowed_html', 'custom_allowed_html', 10, 2);

// После этого используйте wp_kses при сохранении поста
$my_post['post_content'] = wp_kses($_POST['content'], custom_allowed_html());

Заключение

Рекомендую подход, при котором вы явно указываете, какие элементы HTML разрешены, чтобы избежать случайного внесения небезопасного контента. Так вы защитите свой сайт и одновременно позволите использовать необходимые теги, такие как <iframe>. Помните, что любые изменения, касающиеся фильтров контента, требуют внимательного подхода, особенно в контексте безопасности.

Это решение предоставит вам возможность вставлять содержимое с iframe в ваш пост, сохраняя при этом уровень безопасности, необходимый для предотвращения атак через вредоносный код.

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

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