Сделайте так, чтобы WordPress WYSIWYG не удалялся из iframe

16

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

Когда я использую «визуальный» вид для редактирования своих сообщений, WYSIWYG постоянно удаляет мои фреймы ...

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

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

Джастин Дженкинс
источник
Публикация, на которую вы ссылаетесь, также имеет не редактируемое решение от Отто. Вы пробовали это?
Первый
Чтобы уточнить немного, я бы предпочел не взламывать какой-то PHP, чтобы сделать это (я бы, вероятно, забыл о, обновить и сломать вещи) ... если это вещь настройки (даже если это в PHP) или что-то, что я могу сделать, скажем, обернув немного кода вокруг моего iframe, который тоже сработает. На данный момент я, вероятно, собираюсь просто использовать JavaScript, чтобы сделать это, но это кажется грязным.
Джастин Дженкинс
1
Для этого нет никакой конфигурации, и нет возможности кодировать ее в редакторе (это было бы дырой в безопасности, если бы существовал обходной путь). Поместить упомянутый код в плагин - лучший способ сделать это, и он также переживет обновления (плагины не удаляются при обновлении).
Ян Фабри
@ Ян, Надеюсь, есть кто-то, кто знает что-то, чего мы не знаем ... Если нет, спасибо. Кажется странным, что это дыра в сексе только в визуальной части, а не в HTML? Я понимаю, что легче подсовывать вещи под нос в визуальном режиме ... Но все же.
Джастин Дженкинс
iframesполезны для встраивания видео. Этот <object>метод основан на использовании флэш-памяти, тогда как <iframe>метод, который в настоящее время поддерживается большинством сайтов для обмена видео, позволяет использовать HTML5-видео.
TRiG

Ответы:

9

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

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

[iframe http://example.com 400 500]
Этан Сейферт
источник
@Ethan Seifert - Хороший ответ!
MikeSchinkel
Это действительно относится к моему вопросу, никакого «взлома» не требуется. Пока еще нужно использовать вид HTML ... Спасибо.
Джастин Дженкинс
Плагин в этом ответе больше не актуален, но вместо этого выглядит хорошо: wordpress.org/plugins/iframe
Тим Мэлоун
23

Вы можете настроить фильтр TinyMCE, см. Следующий пример для <iframe>s и других тегов, чтобы использовать Google Maps внутри TinyMCE.

function fb_change_mce_options( $initArray ) {

    // Comma separated string od extendes tags.
    // Command separated string of extended elements.
    $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;

    // Maybe, set tiny parameter 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
источник
@bueltge - Хороший ответ. Я только что на вашем сайте читал тот самый пост сегодня утром. Вы знаете, большинство примеров в Интернете для TinyMCE не в контексте WordPress, а когда в контексте WordPress это значительно сложнее. Вы четко это понимаете. Вы можете рассказать намного больше о TinyMCE; Вы думали сделать серию постов в блоге?
MikeSchinkel
моя самая большая проблема - время; но у меня есть еще одно сообщение об этой теме в моих черновиках, и, возможно, я опубликую это в ближайшие недели. Спасибо за вашу дань.
Бюлтге
1

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

Теги iframe больше не удалялись при переключении с html на Visual в WordPress.

WordpressDude
источник
1

В многосайтовой среде каждый пользователь, кроме superadmin, получает html-фильтрацию (из-за потенциальных уязвимостей безопасности ). Исходя из этого, вы можете добавить функцию Добавить unfiltered_html в редакторы.

/**
 * Enable unfiltered_html capability for Editors.
 *
 * @param  array  $caps    The user's capabilities.
 * @param  string $cap     Capability name.
 * @param  int    $user_id The user ID.
 * @return array  $caps    The user's capabilities, with 'unfiltered_html' potentially added.
 */
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 );
докер
источник
0

Если вам не нравится использовать дополнительный плагин для решения шорткода, вы можете добавить что-то вроде этого в свою тему, плагин или functions.php, чтобы добавить его вручную. При необходимости вам может понадобиться добавить еще несколько ключей в массив ключей.

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"]
SunnyRed
источник
это не работает. Это просто публикация iframe с тем же контентом
Ankit Agrawal
Я не знаю, что вы хотите, чтобы код делал, но публикация iframe в контенте, как вы его написали, - это то, что код должен делать. Таким образом, если iframe появляется в вашем веб-интерфейсе, все работает как положено.
SunnyRed
0

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

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

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

Брэндон Барни
источник