Предотвращение удаления iframe в визуальном редакторе WordPress

19 окт. 2010 г., 10:13:21
Просмотры: 26.1K
Голосов: 17

В моем блоге часто возникает необходимость вставлять iframe в записи по разным причинам (не спрашивайте почему, просто поверьте мне!)

Когда я использую "визуальный" режим для редактирования записей, WYSIWYG постоянно удаляет мои iframe...

Я знаю, что могу сохранить iframe в записи, если буду использовать режим "html" и просматривать/сохранять только в режиме "html"... однако мне бы очень хотелось иметь возможность использовать обычный WYSIWYG для редактирования записей без необходимости переключаться в режим "html".

Есть ли способ отключить такое поведение? Я видел эту запись, где предлагается редактировать wp-includes/js/tinymce/tiny_mce_config.php, но я бы предпочел избежать подобных действий, которые, вероятно, просто сломаются при обновлении!

6
Комментарии

В посте, на который вы сослались, также есть решение с нередактируемым фильтром от Otto. Вы пробовали его?

Rarst Rarst
19 окт. 2010 г. 10:25:25

Чтобы уточнить немного больше, я бы предпочел не править PHP-код для этого (я могу забыть об этом, обновить и сломать что-то)... Если есть настройка (даже если она в PHP) или что-то, что можно сделать, например, обернув код вокруг моего iframe, это тоже подойдет. Скорее всего, я просто буду использовать JavaScript, но это кажется неопрятным решением.

Justin Jenkins Justin Jenkins
19 окт. 2010 г. 10:28:37

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

Jan Fabry Jan Fabry
19 окт. 2010 г. 11:58:59

@Jan, Надеюсь, что есть кто-то, кто знает что-то, чего мы не знаем... Если нет, то спасибо. Странно, что это дыра в безопасности только в визуальной части, а не в HTML? Понимаю, что в визуальном режиме проще протащить что-то незаметно... Но всё же.

Justin Jenkins Justin Jenkins
19 окт. 2010 г. 12:38:02

iframes полезны для встраивания видео. Метод <object> использует flash, тогда как метод <iframe>, который поддерживается большинством видеохостингов в наши дни, позволяет использовать HTML5 видео.

TRiG TRiG
23 июн. 2011 г. 19:47:36

У меня та же проблема, но контент удаляется и в HTML-режиме. Это стандартное поведение WordPress или мой сайт страдает от какой-то ошибки?

User User
3 янв. 2013 г. 19:41:23
Показать остальные 1 комментариев
Все ответы на вопрос 6
2
23

Вы можете настроить фильтр 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/

19 окт. 2010 г. 22:40:57
Комментарии

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

MikeSchinkel MikeSchinkel
21 окт. 2010 г. 11:49:11

моя главная проблема - время; но у меня есть ещё один пост на эту тему в черновиках, и возможно я опубликую его в ближайшие недели. Спасибо за вашу оценку.

bueltge bueltge
23 окт. 2010 г. 11:38:27
3

Если вы не хотите писать собственный код, существует плагин для встраивания <iframe>:

Затем просто используйте шорткод следующим образом:

[iframe http://example.com 400 500]
21 окт. 2010 г. 06:15:29
Комментарии

@Ethan Seifert - Отличный ответ!

MikeSchinkel MikeSchinkel
21 окт. 2010 г. 11:47:22

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

Justin Jenkins Justin Jenkins
29 окт. 2010 г. 11:40:01

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

Tim Malone Tim Malone
12 апр. 2016 г. 10:11:56
0

Мне пришлось обновить WordPress до версии 3.2.1, а затем установить плагин Embed Iframe, и он отлично заработал.

Теги iframe больше не удаляются при переключении между режимами HTML и Визуальным редактором в WordPress.

26 окт. 2011 г. 09:04:41
0

В мультисайтовой среде каждый пользователь, кроме суперадминистратора, получает фильтрацию 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 );
7 нояб. 2017 г. 14:09:11
2

Если вы не хотите использовать дополнительный плагин для решения с шорткодами, вы можете добавить что-то подобное в свою тему, плагин или 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&amp;source=s_q&amp;hl=de&amp;geocode=&amp;q=New+York+City,+New+York,+USA&amp;aq=0&amp;oq=new+york&amp;sll=51.238455,6.81435&amp;sspn=0.373151,1.056747&amp;ie=UTF8&amp;hq=&amp;hnear=New+York+City,+New+York,+Vereinigte+Staaten&amp;t=m&amp;z=11&amp;iwloc=A&amp;output=embed"]
27 мая 2013 г. 19:58:53
Комментарии

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

Ankit Agrawal Ankit Agrawal
17 дек. 2018 г. 14:28:21

Я не знаю, что именно вы хотите, чтобы код делал, но публикация iframe в контенте в том виде, как вы его написали, - это именно то, что код должен делать. Так что если iframe отображается на фронтенде, значит всё работает как и задумано.

SunnyRed SunnyRed
18 дек. 2018 г. 01:32:15
0

Я обнаружил, что использование плагина Fusion Editor для создания страниц в Wordpress работает отлично.

Это видео показывает, как использовать Fusion Builder (перейдите к 4:15 для части о добавлении контейнеров, колонок, элементов и блоков кода): https://www.youtube.com/watch?v=UDyNsnB_COA

Я нажимаю, чтобы добавить контейнер, затем нажимаю добавить элемент, и затем добавляю блок кода вместо текстового блока (текстовый блок удалит iframe, а блок кода — нет). В моем блоке кода я вставляю код iframe и публикую. Работает отлично, и мне не нужно изменять никакие PHP-файлы!

1 окт. 2018 г. 23:32:59