2013-12-06 4 views
6

Мне нужно внести несколько незначительных изменений на веб-сайт, созданный в WordPress, и я столкнулся с некоторыми проблемами с функцией wp_insert_content. Эта функция санатизирует ввод, полностью исключая некоторые HTML-теги (например) и удаляя атрибуты других. Я хотел бы, чтобы переключить это прочь, и везде я нахожу ссылку на http://pp19dd.com/2010/06/unfiltered-wp_insert_post/ где решение добавитьОстановить фильтрацию WordPress function wp_insert_post

'filter' => true 

на сообщения входного массива.

Эта статья с 2010 года, и из того, что я нашел, добавлена ​​дополнительная линия в 2011 году (http://web.archiveorange.com/archive/v/TDTh42SUwDEc1GFmSrvU). Эта строка гласит:

unset($postarr[ 'filter' ]); 

и вызывается сразу после объединения ввода с параметрами по умолчанию, и перед дезинфицировать. Мне кажется, что эта строка отменяет приведенный выше оператор 'filter' => true. Действительно, дезинфекция происходит, если линия есть, и исчезает, если линия вынимается.

Таким образом, простым решением было бы добавить 'filter' => true и удалить дополнительную строку в функции. Проблема в том, что я понятия не имею, где еще используется эта функция, и мне интересно, не стоит ли вообще взламывать код WP. Обновление WP в любом случае восстановит его. Итак ... есть ли другой способ остановить эту функцию от дезинфекции входа?

+1

От имени анонимного пользователя ... ** Редактировать ** Это похоже на трюк: 'kses_remove_filters(); wp_insert_post ($ my_post); kses_init_filters(); 'Задача решена! –

+0

Так и не работал для меня. – urok93

+0

Я тестирую последний Wordpress, и он позволяет мне вставлять html-теги (изображения, iframes). Какой тег он точно удаляет? В вашем примере выше ваш пример был удален! – nowhere

ответ

6

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

remove_all_filters("content_save_pre"); 
$post_id = wp_insert_post($post); 

Другие теги можно фильтров:

  • pre_content
  • pre_post_content
  • content_pre Попробуйте их один б y тоже, если он не работает.
+0

это решило вашу проблему? или любой другой вопрос? – Dharmang

+1

Это может сработать, но удаление всех фильтров - действительно очень плохая идея. Существуют фильтры, которые помещают PHP в базу данных, поэтому вы должны найти правильный фильтр для удаления и использовать 'remove_filter()' –

+0

. Я согласен с вами. – Dharmang

0

Я также в процессе импорта сообщений с s в теле контента. Я искал все утро для решения, были некоторые дискуссии по этой теме. до сих пор

kses_remove_filters(); 

ничего не сделал для меня, и не сделал, комментируя эти две строки:

unset($postarr[ 'filter' ]); // overrides 'filter' => true since 3.0 i guess 
$postarr = sanitize_post($postarr, 'db'); 

в wp_insert_post() в Post.php (по умолчанию в строке 2704).

есть еще один интересный бит в строке 2874:

$data = apply_filters('wp_insert_post_data', $data, $postarr); 

, который кажется, что может быть источником наших бед, но я слишком много новичков, чтобы понять это самостоятельно.

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

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

$wpdb->update($wpdb->posts, array("post_content"=>$content->content), array("ID"=>$postid), array("%s"), array("%d")); 

во всяком случае,

remove_all_filters("content_save_pre"); 

сделал трюк!

+1

Повторное повторение того, что я сказал, на другом ответе: Удаление всех фильтров - действительно очень плохая идея , Существуют фильтры, которые помещают PHP в базу данных, поэтому вы должны найти правильный фильтр для удаления и использовать 'remove_filter()' –

Смежные вопросы