WP Cron не сохраняет <iframe> или <объект> в почтовом теле

Я использую wp_cron для автоматического захвата сообщений с удаленного сайта и сохраняю их в своем wp db.

ВНИМАНИЕ! Я выполняю свой код из своего плагина, а не из моего шаблона functions.php или где-то еще. У меня есть своя собственная проверка захваченного контента, чтобы предотвратить вредоносный код и т. Д., Поэтому отключение проверки безопасности в WordPress не является проблемой в моем случае, но будьте осторожны, если у вас нет собственной проверки захваченного контента. Всегда проверяйте захваченные значения, если это возможно!

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

но тогда у меня есть функция wp_cron которая выполняется для тестирования каждые две минуты (если кто-то нажимает на мою страницу, конечно;), и вот проблема.

Обратите внимание, что код идентичен, просто вместо get_user_id() я установил его вручную в 1 . это, вероятно, единственное изменение между этими двумя кодами.

И проблема в том, что все хранится как ожидалось, включая время, заголовок, slug (он даже захватывает и понижает нагрузку и правильно устанавливает отображаемое изображение для сообщения), теги, категории и дополнительную таксономию. Так что хорошо.

Единственное, что отсутствует, – это основной текст (содержание) сообщения.

При загрузке с администратора вручную. Это что-то вроде:

 <iframe width="650" scrolling="no" height="450" frameborder="0" src="http://example.com/embedframe/3843634"></iframe> 

или

 <object height="450" width="650" ><param name="movie" ... bla bla bla ... shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" height="450" width="650" /></object> 

Итак, это потому, что он отфильтрован и разбит на полоску, я имею в виду object и iframe когда вы не вошли в систему как администратор?

Если да, то как я могу отключить его в своем плагине?

Или что-то еще?

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

РЕДАКТИРОВАТЬ:

Это определенно что-то с защитой WP . Когда я задал в своей переменной содержимого функции auto cron вручную значение «Тестирование автоматического сохранения». сохраняется в обычном режиме. Но когда я устанавливаю его в <iframe>something</iframe> или <object>blablabal</object> это НЕ.

Как отключить эту «проверку», поэтому я могу сохранить свой код с помощью cron?

Есть идеи?

Solutions Collecting From Web of "WP Cron не сохраняет <iframe> или <объект> в почтовом теле"

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

Когда вы вошли в систему и запустили процесс вручную, вы вошли в систему и, таким образом, используете свои учетные данные и используете свои разрешения. Я уверен, что вы являетесь администратором на сайте. У вас есть разрешение на публикацию файла unfiltered_html, что означает, что вы можете отправлять iframes и объекты и все, что вам нравится.

Когда ваше задание cron запускается, у него нет ваших учетных данных. Таким образом, он не получает те же разрешения. Таким образом, фильтры безопасности включаются, и такие вещи, как iframe и такие, блокируются.

Чтобы исправить это, вам нужно изменить свой процесс, чтобы не отключать фильтры, а запускать как вы . Поэтому найдите свой идентификационный номер пользователя в базе данных и непосредственно перед тем, как ваш процесс будет выполнять операции импорта, добавьте этот код:

wp_set_current_user( 123 );

Где «123» – это номер вашего идентификатора пользователя. Тогда код теперь будет «вы» и может делать то же, что и вы. Эти фильтры не будут вступать в силу, поскольку разрешения правильны для текущего пользователя.

Примечание. Это не безопаснее, BTW. Вы по-прежнему позволяете удаленному веб-сайту вставлять на ваш сайт опасные вещи. Поэтому ты доверяешь им, чтобы ты не виноват здесь. Просто помните об этом. Этот метод просто проще, чем ручная работа с фильтрами.

ПРЕДУПРЕЖДЕНИЕ !!!

Всегда проверяйте данные, которые вы сохраняете в базе данных! Этот ответ ниже предполагает, что вы проверяете содержание своего сообщения внутри своей пользовательской функции, которую вы запускаете через cron!

Я нахожу решение этой проблемы обрезки iframe и тегов объектов.

ВНИМАНИЕ! Поместите это только в код функции вашего плагина, который запускается через wp cron. Не помещайте его в свой файл functions.php в свой шаблон или в других местах.

 // before saving post remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); // save code here // after saving post add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); 

ВАЖНЫЙ! Используя префикс content_ мы ограничиваем remove filter -> save our data -> add_filter только содержимое, а не commetns, выдержку и т. Д.

Используйте короткие коды, например, создайте короткий код iframe, затем вы сможете:

 [iframe]example.com[/iframe] 

Вот код для реализации такого короткого кода:

 add_shortcode('iframe', array('iframe_shortcode', 'shortcode')); class iframe_shortcode { function shortcode($atts, $content=null) { extract(shortcode_atts(array( 'url' => '', 'scrolling' => 'no', 'width' => '100%', 'height' => '500', 'frameborder' => '0', 'marginheight' => '0', ), $atts)); if (empty($url)) return '<!-- Iframe: You did not enter a valid URL -->'; return '<iframe src="'.$url.'" title="" width="'.$width.'" height="'.$height.'" scrolling="'.$scrolling.'" frameborder="'.$frameborder.'" marginheight="'.$marginheight.'"><a href="'.$url.'" target="_blank">'.$url.'</a></iframe>'; } } 

Применение:

 [iframe url="http://wpsnipp.com" width="100" height="100" scrolling="yes" frameborder="1" marginheight="2"] 

Источник:

http://wpsnipp.com/index.php/functions-php/iframe-shortcode-for-posts-and-pages/

Если вам нужно вставить объекты, то что-то пошло не так. Используйте OEmbed или создайте короткий код

Пробовав все, это сработало для меня:

 global $allowedposttags; $allowedposttags['div'] = array('align' => array (), 'class' => array (), 'id' => array (), 'dir' => array (), 'lang' => array(), 'style' => array (), 'xml:lang' => array() ); $allowedposttags['iframe'] = array('src' => array () ); 

https://wordpress.org/support/topic/wp_update_post-strips-css-id-attribute?replies=7