wp_insert_post() — функция позволяет создать новую запись / страницу или обновить уже существующую

Функция вставляет посты (записи, страницы, произвольные типы постов) в базу данных WordPress. В случае успеха возвращает ID поста, в случае неудачи либо 0 либо объект WP_Error ( в зависимости от значения второго параметра ).

Если же вам нужно сделать несколько записей, то просто запустите эту функцию в цикле PHP.

wp_insert_post( $postarr, $wp_error = false )
$postarr
(массив) содержит информацию о посту.

ID
ID поста, который нужно обновить. При создании нового поста этот параметр указывать не нужно.
post_content
Содержимое поста (контент).
post_name
Ярлык (если не указан, то берется из заголовка).
post_title
Собственно заголовок.
post_status
Статус поста.

Если установлено future (запланированная публикация в будущем), то время публикации post_date (этот параметр дан ниже) должно быть соответствующим.

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

post_type
Тип поста. Например post — запись (по умолчанию), page — страница.
post_author
Автор поста, а точнее его ID (по умолчанию — текущий пользователь, который авторизован).
ping_status
Пингбэки и трэкбеки:

  • open — разрешены,
  • closed — запрещены.

По умолчанию — значение get_option('default_ping_status') (находится в Настройки > Обсуждение, скриншот ниже).

Значение ping_status по умолчанию в функции wp_insert_post()
post_parent
ID родительского поста.
menu_order
Порядок в меню (применимо для страниц и не применимо для записей).
to_ping
Список URL сервисов обновления, разделенных пробелом, либо каждый URL — с новой строки (нужны для ускоренной индексации постов, подробнее про сервисы обновления в Настройки > Написание). Пример:

http://rpc.weblogs.com/RPC2
http://bing.com/webmaster/ping.aspx
pinged
Список URL сервисов обновления, на которые уже был отправлен запрос.
post_password
Пароль к посту.
post_excerpt
Поле «Цитата», анонс поста.
post_date
Когда пост был (или должен быть) опубликован Y-m-d H:i:s, по умолчанию текущая дата.
post_date_gmt
в GMT.
comment_status
Разрешить open или запретить closed комментирование этого поста.
post_category, tags_input, tag_input
Для того, чтобы присвоить посту рубрики, метки или элементы какой-либо произвольной таксономии, используйте функцию wp_set_object_terms().
page_template
Название файла шаблона, например template-portfolio.php.

Если тип поста — не страницы page, значение этого параметра будет проигнорировано.

$wp_error
true — возвращать объект WP_Error в случае неудачи (по умолчанию — false).

Примеры

Создаем пост и присваиваем ему рубрики и метки

$my_postarr = array(
	'post_title'    => 'Новый пост',
	'post_content'  => 'Это мой новый пост.', // контент
	'post_status'   => 'publish' // опубликованный пост
);
 
// добавляем пост и получаем его ID 
$my_post_id = wp_insert_post( $my_postarr );
 
// присваиваем рубрику к посту (ссылка на документацию wp_set_object_terms() дана чуть выше)
wp_set_object_terms( $my_post_id, 5, 'category' );
 
// присваиваем метки
wp_set_object_terms( $my_post_id, array(7, 8), 'post_tag' );

Как изменить заголовок поста через функцию?

Этим способом вы также сможете изменить и другие параметры поста, упомянутые в статье.

$updated_post_arr = array(
	'ID'		=> 500, // допустим, ID поста, заголовок которого нужно изменить, равен 500
	'post_title'    => 'Новый заголовок' // заголовок
);
 
// обновляем пост (все остальные его параметры останутся прежними)
wp_insert_post( $updated_post_arr );

Комментарии 22

  • Анна19 декабря 2014 в 00:12 #

    Добрый вечер. спасибо за ваш блог - очень познавательно. Подскажите пожалуйста в моем вопросе - если это вас не затруднит. Мне нужно реализовать присвоение всем кастомным типам постов в момент их публикации дефолтной кастомной таксономии. На мой взгляд описанный пример №1 в этой статье должен был мне помочь. Но увы. Я его взяла в чистом виде и добавила себе в файл плагина. Предварительно создав категорию 5 (как в примере). Посты у меня создались, целых 3 шт а вот категория им присвоилась как обычно uncategorized(((
    Заранее спасибо)

    • Миша19 декабря 2014 в 07:12 #

      Доброе утро!
      Возможно категории просто не поддерживаются вашим кастомным типом поста? Рекомендую почитать здесь.

  • Анна19 декабря 2014 в 09:12 #

    спасибо за такую оперативную реакцию. но все дело в том что ваш кусочек кода я вставляю сперва в неизменном виде-чтобы проверить как он отработает у меня. а потом планирую подстраивать под себя. Таким образом он должен у меня просто создать пост и присвоить ему категорию №5(обычные посты - категории поддерживают), игнорируя значение категории по умолчанию, указанной в общих настройках. Или может я неправильно растолковала назначение вашего кода?
    Вот что пишется у меня на экране после вставки этого кода:
    Notice: Trying to get property of non-object in /home/pau/www/tryd/wp-includes/post.php on line 3676

    Fatal error: Call to undefined function is_user_logged_in() in /home/pau/www/tryd/wp-includes/post.php on line 2315

    • Миша20 декабря 2014 в 08:12 #

      Очень странные ошибки, никак не связанные с функцией вставки поста.

      То есть они появляются именно после вставки кода из первого примера? Который вы вставляете в functions.php?

  • Максим11 февраля 2015 в 19:02 #

    Здравствуйте Михаил хочу задать вам все таки свой вопрос по api woocommerce тем более, что я решил почти свой вопрос? Остались моменты с BD да с самим WP. Я думаю Вы сможете мне помочь .
    У меня есть код который проверяет существует ли некая переменная в текстовом поле, если она есть, то создает произвольный пост shop_coupon. Вопрос, как можно проверить, что в базе данных существует данная переменная и если она существует не создавать пост заново, а обновить его . У меня пока получается, только создавать новый купон когда я изменяю в текстовом поле текст, а не изменить его. Я попытался использовать get_page_by_title, но встала загвоздка получить заголовок, а может так и не получится, вообщем надеюсь, что вы мне поможете. Вот код.

       if (isset($_POST['my_cart'];)){
    		if (!$_POST['my_cart']; == ''){  	
                    $coupon_code = $_POST['my_cart'];
     
    		$post_obj = get_page_by_title( 'Здесь какая то переменная, что бы получить заголовок из базы и получить ID? ', OBJECT, 'shop_coupon' );
    		$post_id = $post_obj->ID;
    		$amount = '5'; // Amount
    		$discount_type = 'percent'; // Type: fixed_cart, percent, fixed_product, percent_product
    		$data10 = 'm@yandex.ru';
    		$coupon = array(
    		'post_title' => $coupon_code,
    		'post_content' => '',
    		'post_status' => 'publish',
    		'post_author' => 1,
    		'post_type'     => 'shop_coupon'
    );
     
     if(!isset($post_id)){
                    $new_coupon_id = wp_insert_post( $coupon );
    		update_post_meta( $new_coupon_id, 'discount_type', $discount_type );
    		update_post_meta( $new_coupon_id, 'coupon_amount', $amount );
    		update_post_meta( $new_coupon_id, 'individual_use', 'yes' );
    		update_post_meta( $new_coupon_id, 'product_ids', '' );
    		update_post_meta( $new_coupon_id, 'exclude_product_ids', '' );
    		update_post_meta( $new_coupon_id, 'usage_limit', '' );
    		update_post_meta( $new_coupon_id, 'expiry_date', '' );
    		update_post_meta( $new_coupon_id, 'apply_before_tax', 'no' );
    		update_post_meta( $new_coupon_id, 'free_shipping', 'no' );
    		update_post_meta( $new_coupon_id, 'customer_email',$data10 ) ;
        }else{
    		$id = wp_update_post( array( 'ID' => intval( $post_id ), 'post_title' => $coupon_code) );
     
     
     
    	}
     
     
     
    			}
    		}
    • Миша12 февраля 2015 в 09:02 #

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

      который проверяет существует ли некая переменная в текстовом поле,

      как можно проверить, что в базе данных существует данная переменная

      Нужно больше конкретики.

  • Максим12 февраля 2015 в 09:02 #

    Этот код весит при регистрации пользователя в моем пользовательском поле
    Мне нужно, как то проверить создана ли у меня запись в shop_coupon с заголовком из $coupon_code = $_POST['my_cart']; и если, такая запись там есть, то проверить ее в базе и если она существует, то при редактировании $coupon_code = $_POST['my_cart'] изменить заголовок на новый, а не создавать всегда при редактировании заголовка новые записи в shop_coupon?

  • Максим13 февраля 2015 в 16:02 #

    Михаил я тут попробовал реализовать тоже самое без WooCommerce .
    И возникла та же проблема, может без WC вы сможете мне, что подсказать.
    У меня через хуки wp подключено дополнительное поле при регистрации. $_POST['my_field'], но дело в том, что мне надо, что бы это поле дополнительно отправляло дополнительные данные в мой пользовательский тип данных. Этот код, как раз демонстрирует ту часть кода, где я отправляю пользовательские данные. Все хорошо работает, но есть одно но. Я не могу понять, как сделать проверку этих данных. Если данные отправлены и поле создано, не создавать его еще раз, а перезаписать существующие данные. Знаю есть методы wp_update_post() ,update_post_meta,но там надо знать ID его, как раз я получить и не могу?

     if (isset($_POST['my_field'])){    
                $my_code = $_POST['my_field'];
                $my_data = array(
                'post_title' => $my_code,
                'post_content' => '',
                'post_status' => 'publish',
                'post_author' => 1,
                'post_type'     => 'my_code'
        );
                $code_id = wp_insert_post( $my_data );
     
         }
    • Миша14 февраля 2015 в 08:02 #

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

      $post_object = get_page_by_title( $my_code, 'OBJECT', 'my_code' );
      $post_id = $post_object->ID;

      Ну а зная ID, уже можно делать что угодно :)

  • Максим14 февраля 2015 в 09:02 #

    Да Михаил я так уже пробовал я тоже думал, что должно работать, но получается следующие.
    Делаю проверку через wp_update_post так

     if (isset($_POST['my_field'])){    
                $my_code = $_POST['my_field'];
                $post_object = get_page_by_title( $my_code, 'OBJECT', 'my_code' );
                $post_id = $post_object->ID;
                $my_data = array(
                'ID' => $post_id ,
                'post_title' => $my_code,
                'post_content' => '',
                'post_status' => 'publish',
                'post_author' => 1,
                'post_type'     => 'my_code'
        );
                $code_id = wp_update_post( $my_data );
     
         }

    Если я все сделал правильно то вроде должно быть так . И он должен брать текущий заголовок из моего поля my_field находить по нему ID сравнивая его с my_code (пользовательский тип поста) соответственно подставлять его в массив и обновлять заголовок. Но это не работает он создает новые посты подобно тому, что не видит 'ID' => $post_id ,. Или я еще, что то не сделал ?

    • Миша14 февраля 2015 в 13:02 #

      Тут нужно тестить каждый шаг, например:

      1. Проверить, что содержит переменная $my_code, сравнить, совпадают ли заголовки.
      2. Проверить, что содержит переменная $post_id.

      Проверять можно тупо через echo.

      • Максим14 февраля 2015 в 15:02 #

        Михаил не совсем понятно, где смотреть

        Проверять можно тупо через echo.

        Я же в
        functions.php, как можно вывести и, где посмотреть через какой нибудь хук?

  • Миша15 февраля 2015 в 07:02 #

    На тестовом сайте используйте:

    echo $my_code; exit;

    Это поломает сайт (временно конечно), зато вы сможете выяснить пару вещей.

    • Максим15 февраля 2015 в 14:02 #

      Михаил Здравствуйте.
      Делаю как выговорите. Добавляю

      echo $my_code; exit;

      functions.php в конце после функции и он, так не работает. Там все переменные пустые. Да оно и понятно за функцией они не живут.
      Пробовал и в конце до закрывающихся скобок функции, но там он вообще ни, как не реагирует и не проявляет себя на сайте?
      Вот примеры как я делал
      Так все переменные пустые.

       if (isset($_POST['my_field'])){    
                  $my_code = $_POST['my_field'];
                  $post_object = get_page_by_title( $my_code, 'OBJECT', 'my_code' );
                  $post_id = $post_object->ID;
                  $my_data = array(
                  'ID' => $post_id ,
                  'post_title' => $my_code,
                  'post_content' => '',
                  'post_status' => 'publish',
                  'post_author' => 1,
                  'post_type'     => 'my_code'
          );
                  $code_id = wp_update_post( $my_data );
      echo $my_code; exit;
       
           }

      Так вообще ни какой реакции.

       if (isset($_POST['my_field'])){    
                  $my_code = $_POST['my_field'];
                  $post_object = get_page_by_title( $my_code, 'OBJECT', 'my_code' );
                  $post_id = $post_object->ID;
                  $my_data = array(
                  'ID' => $post_id ,
                  'post_title' => $my_code,
                  'post_content' => '',
                  'post_status' => 'publish',
                  'post_author' => 1,
                  'post_type'     => 'my_code'
          );
                  $code_id = wp_update_post( $my_data );
           }
      echo $my_code; exit;

      Я что то делаю не так?

      • Миша15 февраля 2015 в 19:02 #

        Здравствуйте!
        Ну значит $_POST['my_field'] пустой и проблему надо искать на странице с формой.

  • Максим15 февраля 2015 в 19:02 #

    Так проверять все таки правильно, как в функции или за функцией?

  • Максим15 февраля 2015 в 19:02 #

    Я это спрашиваю потому, что если взять и создать переменную $my_code2 = 10; с числом
    10 строка echo $my_code2; exit; ведет себя ровно одинаково, как в предыдущем примере. Но она же не может быть пустая Михаил? Там заданно число 10 низменное. Почему его оно тоже не показывает поэтому я и задал вопрос выше.

  • Максим16 февраля 2015 в 08:02 #

    Да пробовал через Ctrl + U даже, так echo 'слово ='. $my_code2; exit; "слово" Специально задавал, что бы проще найти было. И находит когда echo 'слово ='. $my_code2; exit; в не функции естественно переменная пустая вот так текст = 'пусто', а в функции не где не показывает . Искал везде и адмнке и на сомом сайте. Экспериментировал на голом WP 4.1 в денвере. Работает только если вот, так продублировать переменную в не функции, но как я понял это не то ,так не проверить какие надо переменные ?

    $my_code2= 10;
    echo 'слово ='. $my_code2; exit
    • Миша16 февраля 2015 в 09:02 #

      Короче говоря хватит нам вслепую гадать, надо бы мне глянуть на сайт. Он у вас только на денвере? Можете залить в инет и потом отписать мне по email?

  • Максим16 февраля 2015 в 10:02 #

    Хорошо Михаил так и сделаю

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...