Вопрос или проблема
В моей установке я использую одну пользовательскую страницу. Здесь я добавляю одно текстовое поле и редактор 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
в ваш пост, сохраняя при этом уровень безопасности, необходимый для предотвращения атак через вредоносный код.