Предотвращение удаления iframe в визуальном редакторе WordPress
В моем блоге часто возникает необходимость вставлять iframe в записи по разным причинам (не спрашивайте почему, просто поверьте мне!)
Когда я использую "визуальный" режим для редактирования записей, WYSIWYG постоянно удаляет мои iframe...
Я знаю, что могу сохранить iframe в записи, если буду использовать режим "html" и просматривать/сохранять только в режиме "html"... однако мне бы очень хотелось иметь возможность использовать обычный WYSIWYG для редактирования записей без необходимости переключаться в режим "html".
Есть ли способ отключить такое поведение? Я видел эту запись, где предлагается редактировать wp-includes/js/tinymce/tiny_mce_config.php
, но я бы предпочел избежать подобных действий, которые, вероятно, просто сломаются при обновлении!
Вы можете настроить фильтр TinyMCE, вот пример для использования тегов <iframe>
и других, чтобы вставить Google Maps в TinyMCE.
function fb_change_mce_options( $initArray ) {
// Строка с перечислением расширенных тегов через запятую.
// Строка с перечислением расширенных элементов через запятую.
$ext = 'pre[id|name|class|style],iframe[align|longdesc|name|width|height|frameborder|scrolling|marginheight|marginwidth|src]';
if ( isset( $initArray['extended_valid_elements'] ) ) {
$ext = ',' . $ext;
}
$initArray['extended_valid_elements'] = $ext;
// Возможно, установить параметр tiny verify_html
//$initArray['verify_html'] = false;
return $initArray;
}
add_filter( 'tiny_mce_before_init', 'fb_change_mce_options' );
Добавьте этот код в пользовательский плагин или файл functions.php темы. Также вы можете прочитать больше информации в моей статье: http://wpengineer.com/1963/customize-wordpress-wysiwyg-editor/

@bueltge - Отличный ответ. Я как раз сегодня был на вашем сайте и читал именно эту статью. Знаете, большинство примеров по TinyMCE в интернете не в контексте WordPress, а когда они в контексте WordPress - всё становится значительно сложнее. Вы явно хорошо в этом разбираетесь. Ещё столько можно рассказать про TinyMCE; не думали сделать серию постов в блоге на эту тему?

Если вы не хотите писать собственный код, существует плагин для встраивания <iframe>
:
Затем просто используйте шорткод следующим образом:
[iframe http://example.com 400 500]

Это действительно относится к моему вопросу, никакого "взлома" не требуется. Хотя всё ещё нужно использовать HTML-режим... Спасибо.

Плагин в этом ответе больше не актуален, но вот этот выглядит хорошей альтернативой: https://wordpress.org/plugins/iframe/

В мультисайтовой среде каждый пользователь, кроме суперадминистратора, получает фильтрацию HTML (из-за потенциальных уязвимостей безопасности). Основываясь на этом, вы можете добавить возможность unfiltered_html редакторам.
/**
* Включение возможности unfiltered_html для редакторов.
*
* @param array $caps Возможности пользователя.
* @param string $cap Название возможности.
* @param int $user_id ID пользователя.
* @return array $caps Возможности пользователя, с потенциально добавленной 'unfiltered_html'.
*/
function km_add_unfiltered_html_capability_to_editors( $caps, $cap, $user_id ) {
if ( 'unfiltered_html' === $cap && user_can( $user_id, 'editor' ) ) {
$caps = array( 'unfiltered_html' );
}
return $caps;
}
add_filter( 'map_meta_cap', 'km_add_unfiltered_html_capability_to_editors', 1, 3 );

Если вы не хотите использовать дополнительный плагин для решения с шорткодами, вы можете добавить что-то подобное в свою тему, плагин или functions.php, чтобы реализовать это вручную. При необходимости, возможно, потребуется добавить дополнительные ключи в массив keys.
add_shortcode( 'iframe' , 'mycustom_shortcode_iframe' );
function mycustom_shortcode_iframe($args, $content) {
$keys = array("src", "width", "height", "scrolling", "marginwidth", "marginheight", "frameborder");
$arguments = mycustom_extract_shortcode_arguments($args, $keys);
return '<iframe ' . $arguments . '></iframe>';
}
function mycustom_extract_shortcode_arguments($args, $keys) {
$result = "";
foreach ($keys as $key) {
if (isset($args[$key])) {
$result .= $key . '="' . $args[$key] . '" ';
}
}
return $result;
}
Тогда на странице записи использование будет выглядеть так:
[iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=New+York+City,+New+York,+USA&aq=0&oq=new+york&sll=51.238455,6.81435&sspn=0.373151,1.056747&ie=UTF8&hq=&hnear=New+York+City,+New+York,+Vereinigte+Staaten&t=m&z=11&iwloc=A&output=embed"]

Это не работает. Он просто публикует iframe как есть, без изменений

Я обнаружил, что использование плагина Fusion Editor для создания страниц в Wordpress работает отлично.
Это видео показывает, как использовать Fusion Builder (перейдите к 4:15 для части о добавлении контейнеров, колонок, элементов и блоков кода): https://www.youtube.com/watch?v=UDyNsnB_COA
Я нажимаю, чтобы добавить контейнер, затем нажимаю добавить элемент, и затем добавляю блок кода вместо текстового блока (текстовый блок удалит iframe, а блок кода — нет). В моем блоке кода я вставляю код iframe и публикую. Работает отлично, и мне не нужно изменять никакие PHP-файлы!
