wp_update_post() WP 1.0.0

Оновлює запис (пост) у базі даних WordPress.

Для того, щоб функція працювала правильно, необхідно вказати ідентифікатор (ID) посту, який оновлюватиметься.

Функція чекає на екрановані дані. Тобто. не можна використовувати wp_slash() .

Ця функція є обгорткою для wp_insert_post() .

Відмінність цієї функції від wp_insert_post() в тому, що тут немає необхідності передавати всі дані, можна вказати тільки ті, які потрібно оновити, решта даних буде скопійована з наявних у базі даних.

Якщо ревізії записів увімкнені, при оновленні попередні дані не видаляються, а стають ревізією. При цьому всі зв’язки (з довільними полями, категоріями, мітками) переходять до основного запису.

Категорії

Категорії потрібно передватсья як масиву чисел (ID категорій яких буде прикріплена запис). Це стосується і випадків, коли вказується лише одна категорія для запису – все одно передаємо так: array(1).

Увага – нескінченний цикл

Якщо потрібно використовувати wp_update_post() (оновити запис) під час хука save_post , обов’язково зробіть перевірку на тип поста – щоб він не був revision. Справа в тому, що коли wp_update_post() використовується під час хука save_post (наприклад, довільних метаблоків), зазвичай створюється нескінченний цикл. Це виходить тому, що save_post викликається двічі, якщо включені ревізії: вперше при створенні ревізії, вдруге при оновленні основного посту. У результаті цикл замикається і створюється безліч ревізій.

Те саме відбувається під час спрацьовування хука edit_attachment , якщо під час нього викликається функція wp_update_post() з параметром ID, що відноситься до вкладення (attachment).

Ось приклад, що показує, як потрібно діяти в ситуації, коли wp_update_post() викликає помилку при використанні його під час хука save_post :

add_action( 'save_post', 'my_function');
function my_function( $post_id ){
	if ( ! wp_is_post_revision( $post_id ) ){
		// видаляємо цей хук, щоб він не створював нескінченного циклу
		remove_action('save_post', 'my_function');

		// оновлюємо піст, коли знову викличеться хук save_post
		wp_update_post($ my_args);

		// знову вішаємо хук
		add_action('save_post', 'my_function');
	}
}
Майбутня публікація посту

Якщо ви плануєте публікацію чернетки в майбутньому і використовуєте для цього функцію wp_update_post() , то функція не працюватиме, якщо не вказати параметр $my_post->edit_date = true. WP ігнорує параметр post_date, якщо оновлюється чернетка, але не у випадку, коли вказано параметр edit_date = true.

нотатки

Використовує: wp_restore_post_revision()

Працює на основі:
wp_insert_post()

Хуків немає.

Повертає

int|WP_Error.

  • ID оновленого запису – при вдалій операції.
  • 0 або WP_Error (якщо увімкнено $wp_error) — якщо оновити запис не вдалося.

Використання

wp_update_post($post, $wp_error, $fire_after_hooks);
$post
(масив/об’єкт)

Асоціативний масив даних містить дані про пост, які потрібно оновити. Ключі масиву ідентичні полям таблиці wp_postsв базі даних WordPress.

Вказувати ID у масиві обов’язково! (Приклад: $my_post['ID'] = 37;).

Розуміє всі параметри, які можна передати wp_insert_post() .
За замовчуванням: array()

$wp_error
(true/false)
true – включає повернення об’єкта WP_Error при помилці.


Типово: false
$fire_after_hooks
(логічний) (WP 5.6)
Чи потрібно запускати функцію
wp_after_insert_post() , яка запускає хуки наприкінці роботи функції.


Типово: true

Приклади

0

#1 Оновимо контент у запису 37

// Створюємо масив даних
$my_post = [
	'ID' => 37,
	'post_content' => 'Тут новий контент запису',
];

// Оновлюємо дані у БД
wp_update_post(wp_slash($ my_post));

Поля, які можна змінити

Це масив полів, які містять будь-які записи WordPress.

WP_Post Object (
	[ID] => 1
	[post_author] => 1
	[post_date] => 2010-03-26 09:27:40
	[post_date_gmt] => 2010-03-26 05:27:40
	[post_content] => Контент запису...
	[post_title] => Назва запису
	[post_excerpt] =>
	[post_status] => publish
	[comment_status] => open
	[ping_status] => open
	[post_password] =>
	[post_name] => post_name
	[to_ping] =>
	[pinged] => http://wp-kama.ru/dopolnitelnyie-knopki
	[post_modified] => 2014-02-10 10:31:17
	[post_modified_gmt] => 2014-02-10 06:31:17
	[post_content_filtered] =>
	[post_parent] => 0
	[guid] => http://wp-kama.ru/post_name
	[menu_order] => 0
	[post_type] => post
	[post_mime_type] =>
	[comment_count] => 41
	[filter] => raw
)
0

#2 Оновимо мета-поля у запису 37

У цю функцію також як і wp_insert_post() можна вказати масив метаполів які потрібно додати або оновити.

// Створюємо масив даних
$my_post = [
	'ID' => 37,
	'meta_input' => [
		'meta_key_1' => 'Meta value 1',
		'meta_key_2' => 'Meta value 2',
	],
];

// Оновлюємо
wp_update_post(wp_slash($my_post));

список змін

З версії 1.0.0Введено.
З версії 3.5.0Added $wp_error parameter to allow a WP_Error для того, щоб відновити на failure.
З версії 5.6.0Added the $fire_after_hooks parameter.

Код wp_update_post() WP 6.0.2

function wp_update_post( $postarr = array(), $wp_error = false, $fire_after_hooks = true ) {
	if ( is_object( $postarr ) ) {
		// Non-escaped post was passed.
		$postarr = get_object_vars($postarr);
		$postarr = wp_slash($postarr);
	}

	// First, get all of the original fields.
	$post = get_post( $postarr['ID'], ARRAY_A );

	if ( is_null( $post ) ) {
		if ( $wp_error ) {
			return new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) );
		}
		return 0;
	}

	// Escape data pulled from DB.
	$post = wp_slash($post);

	// Passed post category list overwrites existing category list if not empty.
	if ( isset( $postarr['post_category'] ) && is_array( $postarr['post_category'] )
		&& count( $postarr['post_category'] ) > 0
	) {
		$post_cats = $postarr['post_category'];
	} else {
		$post_cats = $post['post_category'];
	}

	// Drafts не повинно бути визначено в терміні explicitly done so by the user.
	if ( isset( $post['post_status'] )
		&& in_array( $post['post_status'], array( 'draft', 'pending', 'auto-draft' ), true )
		&& empty( $postarr['edit_date'] ) && ( '0000-00-00 00:00:00' === $post['post_date_gmt'] )
	) {
		$clear_date = true;
	} else {
		$clear_date = false;
	}

	// Merge old and new fields with new fields overwriting old ones.
	$postarr = array_merge($post, $postarr);
	$postarr['post_category'] = $post_cats;
	if ( $clear_date ) {
		$postarr['post_date'] = current_time( 'mysql' );
		$postarr['post_date_gmt'] = '';
	}

	if ( 'attachment' === $postarr['post_type'] ) {
		return wp_insert_attachment( $postarr, false, 0, $wp_error );
	}

	// Discard 'tags_input' parameter if it's the same as existing post tags.
	if ( isset( $postarr['tags_input'] ) && is_object_in_taxonomy( $postarr['post_type'], 'post_tag' ) ) {
		$tags = get_the_terms( $postarr['ID'], 'post_tag');
		$tag_names = array();

		if ( $tags && ! is_wp_error( $tags ) ) {
			$tag_names = wp_list_pluck( $tags, 'name');
		}

		if ( $postarr['tags_input'] === $tag_names ) {
			unset($postarr['tags_input']);
		}
	}

	return wp_insert_post( $postarr, $wp_error, $fire_after_hooks );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *