WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

delete_post_meta() WP 1.5.0

Удалят все произвольные поля (метаполя) с указанным ключом у указанной записи (поста).

Работает на основе: delete_metadata()

Хуков нет.

Возвращает

true/false. true при успешном удалении, false в противном случае.

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

delete_post_meta( $post_id, $key, $value );
$post_id(число) (обязательный)
ID поста, произвольные поля которого нужно удалить.
$key(строка) (обязательный)
Ключ произвольного поля, которое нужно удалить.
$value(строка)
Значения произвольного поля, которое нужно удалить. Указание этого параметра может пригодится, когда у поста имеются несколько произвольных полей с одинаковыми ключами. Если оставить поле пустым, то все произвольные поля с указанным ключом будут удалены.
По умолчанию: нет

Примеры

#1. Удалим произвольное поле my_key, со значением Steve, у поста 76:

delete_post_meta( 76, 'my_key', 'Steve' );

#2. Удаление указанных метаполей (произвольных полей)

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

Плагин создавал поля с ключами: keys related_posts и post_inspiration

Чтобы удалить все эти произвольные поля, можно воспользоваться таким кодом:

$allposts = get_posts( 'numberposts=-1&post_type=post&post_status=any' );

foreach( $allposts as $postinfo) {
	delete_post_meta( $postinfo->ID, 'related_posts' );
	delete_post_meta( $postinfo->ID, 'post_inspiration' );
}

#3 Удаление произвольных полей с исключениями

Допустим, нужно удались все произвольные поля post_inspiration, кроме тех, значение которых равно Sherlock Holmes, используем такой код:

$allposts = get_posts( 'numberposts=-1&post_type=post&post_status=any' );

foreach( $allposts as $postinfo ) {
	$inspiration = get_post_meta( $postinfo->ID, 'post_inspiration' );

	foreach( $inspiration as $value ) {
		if( $value != 'Sherlock Holmes' )
			delete_post_meta( $postinfo->ID, 'post_inspiration', $value );
	}
}

#4 Пример удаления всех метаполей у определенного поста

Вариант 1:

$post_id = 25;
foreach ( get_post_meta( $post_id ) as $key => $val ) {
	delete_post_meta( $post_id, $key );
}

Вариант 2 (быстрее - одним запросом и без лишних операций):

$post_id = 25;
global $wpdb;
$wpdb->delete( $wpdb->postmeta, [ 'post_id'=>$post_id ] );
clean_post_cache( $post_id );

#5 Другие примеры

Еще примеры смотрите здесь.

Список изменений

С версии 1.5.0 Введена.

Код delete post meta: wp-includes/post.php WP 5.4.2

<?php
function delete_post_meta( $post_id, $meta_key, $meta_value = '' ) {
	// Make sure meta is added to the post, not a revision.
	$the_post = wp_is_post_revision( $post_id );
	if ( $the_post ) {
		$post_id = $the_post;
	}

	return delete_metadata( 'post', $post_id, $meta_key, $meta_value );
}

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

Из метки: metadata (метаданные)

6 комментов
  • @ Михаил29 trapeznaya.ucoz.ru

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

    Ответить3.4 года назад #
    • Kama7770

      Можно удалить прямым запросом к таблице wp_postmeta по ключу поля:

      Например, нужно удалить метаполя pole1 и pole_2:

      global $wpdb;
      $for_del = array('pole1','pole_2');
      foreach( $for_del as $meta_key ){
      	$wpdb->delete( $wpdb->postmeta, array('meta_key'=>$meta_key) );
      }

      Насчет старых тегов не понял... Метки? Из проще руками из админки удалить...

      1
      Ответить3.4 года назад #
  • Думаю будет полезен пример удаления всех метаполей у определенного поста:

    $all_post_meta = get_post_meta( $post_id );
    foreach ($all_post_meta as $key => $val) {
    	delete_post_meta( $post_id, $key );
    }
    1
    Ответитьмесяц назад #
    • Kama7770

      Да, действительно такого примера тут явно не хватает. Добавил этот пример и еще вариант туда подкинул. Спасибо! thank_you

      Ответить17 дней назад #
  • @ Roma

    Большое спасибо за пост, очень полезно оказалось, однако в процессе столкнулся с проблемой, когда ключи метаполей сгенерированны случайным набором цифр, как к примеру

    _lyte_itjx6dvKS_A, _lyte_wajf9Pu8zZY и тд

    Как можно их отыскать по началу названия ключа и удалить в этом случае?

    Спасибо.

    Ответить12 дней назад #