WordPress как на ладони
wordpress jino

sanitize_post() WP 2.3.0

Очищает каждое поле указанного объекта/массива поста.

Функция очищает очень легко, например при типе очистке db экранирующие слэши не ставятся.

Если тип очистки указан как "raw", то очистка будет минимальной: только некоторые из числовых полей будут превращены в число: 'ID', 'post_parent', 'menu_order', 'ancestors'. Все остальное вернется как передано.

post_content очищается от тегов при фильтрах edit, display на основе доступных тегов для прав текущего пользователя.

При очистке типом db функция не экранирует символы.

Работает на основе: sanitize_post_field()
✈ 1 раз = 0.000089с = очень быстро | 50000 раз = 3.16с = быстро

Хуков нет.

Возвращает

Объект/WP_Post/массив. Очищенный объект/массив данных переданный в $post.

Использование

sanitize_post( $post, $context );
$post(объект/WP_Post/массив) (обязательный)
Данные записи (поста), которые нужно очистить.
$context(строка)

Тип очистки данных. Может быть:

  • raw - для использования в строке;

  • edit - для дальнейшего редактирования;

  • db - для использования в запросе;

  • display - для вывода на экран;

  • attribute - для использования в атрибуте;
    По умолчанию: 'display'

Примеры

#1 Пример очистки

Допустим мы получаем данные записи в $_POST запросе и прежде чем выводить каждое из них на экран, нам нужно их очистить. Это можно сделать по-отдельности, но гораздо быстрее будет прогнать данные через эту функцию, так:

$post_data = $_POST['post_data'];
$post_data = sanitize_post( $post_data );

// Или для использования в SQL запросе:
$post_data = sanitize_post( $post_data, 'db'); // результат не защищен от sql инъекций

#3 Очистка перед добавление в БД

Пример из функции wp_inser_post(), в примере я убрал очень много кода, чтобы показать только суть очистки:

$postarr = $_POST['post_data'];

// удаляем данные о предыдущей очистке
unset( $postarr[ 'filter' ] );

// очищаем
$postarr = sanitize_post($postarr, 'db');

// собираем $data из параметров $postarr .........

// Убираем слэши, их вставит $wpdb->insert
$data = wp_unslash( $data );

// вставляем
$wpdb->insert( $wpdb->posts, $data );

#3 Как чистятся данные:

// пусть в $_POST['post_data'] были следующие данные:

$post_data = array(
	'ID'             => '6129',
	'post_author'    => '1',
	'post_date'      => '2015-09-03 01:36:12',
	'post_content'   => 'Контент " кавычка. <br> <foo>foo</foo> <script>нечто</script> ',
	'post_title'     => 'wp_get_post_revision',
	'post_status'    => 'publish',
	'comment_status' => 'open',
	'post_name'      => 'wp_get_post_revision',
	'post_content_filtered' => '',
	'post_parent'    => '0',
	'menu_order'     => '0',
	'post_type'      => 'func',
	'comment_count'  => '0'
);

// выводим
foreach( $post_data as $k => $v ){
	echo "$k = (", gettype($v) ,") ". htmlspecialchars($v) ."\n";
}

/* Получаем:
ID = (string) 6129
post_author = (string) 1
post_date = (string) 2015-09-03 01:36:12
post_content = (string) Контент " кавычка. <br> <foo>foo</foo> <script>нечто</script> 
post_title = (string) wp_get_post_revision
post_status = (string) publish
comment_status = (string) open
post_name = (string) wp_get_post_revision
post_content_filtered = (string) 
post_parent = (string) 0
menu_order = (string) 0
post_type = (string) func
comment_count = (string) 0
*/

Теперь давайте посмотрим как выглядят данные после очистки, обращаем внимание на типы:

$post_data = sanitize_post( $post_data, 'raw' ); // raw ----------------

/*
ID = (integer) 6129
post_author = (string) 1
post_date = (string) 2015-09-03 01:36:12
post_content = (string) Контент " кавычка. <br> <foo>foo</foo> <script>нечто</script> 
post_title = (string) wp_get_post_revision
post_status = (string) publish
comment_status = (string) open
post_name = (string) wp_get_post_revision
post_content_filtered = (string) 
post_parent = (integer) 0
menu_order = (integer) 0
post_type = (string) func
comment_count = (string) 0
filter = (string) raw
*/

$post_data = sanitize_post( $post_data, 'edit' ); // edit ----------------

/*
ID = (string) 6129
post_author = (string) 1
post_date = (string) 2015-09-03 01:36:12
post_content = (string) Контент " кавычка. <br> <foo>foo</foo> <script>нечто</script> 
post_title = (string) wp_get_post_revision
post_status = (string) publish
comment_status = (string) open
post_name = (string) wp_get_post_revision
post_content_filtered = (string) 
post_parent = (string) 0
menu_order = (string) 0
post_type = (string) func
comment_count = (string) 0
filter = (string) edit
*/

$post_data = sanitize_post( $post_data, 'db' ); // db ----------------

/*
ID = (integer) 6129
post_author = (string) 1
post_date = (string) 2015-09-03 01:36:12
post_content = (string) Контент " кавычка. <br> <foo>foo</foo> <script>нечто</script> 
post_title = (string) wp_get_post_revision
post_status = (string) publish
comment_status = (string) open
post_name = (string) wp_get_post_revision
post_content_filtered = (string) 
post_parent = (integer) 0
menu_order = (integer) 0
post_type = (string) func
comment_count = (string) 0
filter = (string) db
*/

$post_data = sanitize_post( $post_data, 'display' ); // display ----------------

/*
ID = (integer) 6129
post_author = (string) 1
post_date = (string) 2015-09-03 01:36:12
post_content = (string) Контент " кавычка. <br> <foo>foo</foo> <script>нечто</script> 
post_title = (string) wp_get_post_revision
post_status = (string) publish
comment_status = (string) open
post_name = (string) wp_get_post_revision
post_content_filtered = (string) 
post_parent = (integer) 0
menu_order = (integer) 0
post_type = (string) func
comment_count = (string) 0
filter = (string) display
*/

$post_data = sanitize_post( $post_data, 'attribute' ); // attribute ----------------

/*
ID = (string) 6129
post_author = (string) 1
post_date = (string) 2015-09-03 01:36:12
post_content = (string) Контент &quot; кавычка. &lt;br&gt; &lt;foo&gt;foo&lt;/foo&gt; &lt;script&gt;нечто&lt;/script&gt; 
post_title = (string) wp_get_post_revision
post_status = (string) publish
comment_status = (string) open
post_name = (string) wp_get_post_revision
post_content_filtered = (string) 
post_parent = (string) 0
menu_order = (string) 0
post_type = (string) func
comment_count = (string) 0
filter = (string) js
*/

Код sanitize post: wp-includes/post.php WP 4.9

<?php
function sanitize_post( $post, $context = 'display' ) {
	if ( is_object($post) ) {
		// Check if post already filtered for this context.
		if ( isset($post->filter) && $context == $post->filter )
			return $post;
		if ( !isset($post->ID) )
			$post->ID = 0;
		foreach ( array_keys(get_object_vars($post)) as $field )
			$post->$field = sanitize_post_field($field, $post->$field, $post->ID, $context);
		$post->filter = $context;
	} elseif ( is_array( $post ) ) {
		// Check if post already filtered for this context.
		if ( isset($post['filter']) && $context == $post['filter'] )
			return $post;
		if ( !isset($post['ID']) )
			$post['ID'] = 0;
		foreach ( array_keys($post) as $field )
			$post[$field] = sanitize_post_field($field, $post[$field], $post['ID'], $context);
		$post['filter'] = $context;
	}
	return $post;
}

Cвязанные функции

Из метки: sanitize_ (очистка)

Еще из раздела: Остальное

sanitize_post 2 комментария
  • Pavel cайт: plance.in.ua @

    А почему WP, сам добавляет слэши к POST данным?
    Могу догадаться что-то в целях какой-то безопасности. Но все же?

    p.s. Спасибо за "wp_unslash(...)" smile

    Ответить2 года назад #
    • Kama4662

      Это базовая защита от инъекций при обработке SQL запроса, а если передать строку уже "заслэшенную", то могут получиться двойные слэши.

      Ответить2 года назад #

Здравствуйте, !

Ваш комментарий