Как обновить произвольные поля с помощью функции wp_insert_post()?

4 февр. 2011 г., 22:10:23
Просмотры: 81K
Голосов: 31

Функция WordPress используется для программного добавления данных. Стандартные поля для отправки включают контент, отрывок, заголовок, дату и многое другое.

В документации не описано, как отправлять данные в произвольное поле. Я знаю, что это возможно с помощью функции add_post_meta($post_id, $meta_key, $meta_value, $unique);

Но как включить это в стандартную функцию wp_insert_post?

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'], // заголовок формы бронирования
     'post_date' => $_SESSION['cal_startdate'], // дата начала
     'post_content' => 'Это моя запись.', 
     'post_status' => 'publish',
     'post_type' => 'booking',
  );
  wp_insert_post( $my_post );
  ?>
0
Все ответы на вопрос 5
10
35

Если вы читали документацию по функции wp_insert_post, то знаете, что она возвращает ID созданной записи.

Если объединить её со следующей функцией __update_post_meta (это пользовательская функция, которую я адаптировал с этого сайта)

/**
  * Обновляет мета-данные записи. Автоматически удаляет или добавляет значение для указанного поля
  *
  * @access     protected
  * @param      integer     ID записи, для которой обновляются мета-данные
  * @param      string      Название поля, которое обновляется/добавляется/удаляется
  * @param      string      [Опционально] Значение для обновления/добавления в поле. Если оставить пустым, данные будут удалены.
  * @return     void
  */
public function __update_post_meta( $post_id, $field_name, $value = '' )
{
    if ( empty( $value ) OR ! $value )
    {
        delete_post_meta( $post_id, $field_name );
    }
    elseif ( ! get_post_meta( $post_id, $field_name ) )
    {
        add_post_meta( $post_id, $field_name, $value );
    }
    else
    {
        update_post_meta( $post_id, $field_name, $value );
    }
}

То получится следующий код:

$my_post = array(
    'post_title' => $_SESSION['booking-form-title'],
    'post_date' => $_SESSION['cal_startdate'],
    'post_content' => 'Это моя запись.',
    'post_status' => 'publish',
    'post_type' => 'booking',
);
$the_post_id = wp_insert_post( $my_post );


__update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );
4 февр. 2011 г. 23:01:57
Комментарии

Большое спасибо. Не могли бы вы дать мне представление о внедрении. Т.е. какой именно код куда вставлять. Еще раз спасибо.

Robin I Knight Robin I Knight
4 февр. 2011 г. 23:13:58

Отлично сделано. Второй блок кода заменяет ваш, функция values - это пара ключ/значение пользовательского поля. Поместите функцию либо в начало скрипта, либо в отдельный .php файл, подключаемый в начале скрипта.

aendra aendra
4 февр. 2011 г. 23:37:11

Отмечу, что я использую ООП, поэтому перед "function" стоит модификатор public. Если вы подключаете саму функцию без помещения ее в класс, вам не нужно добавлять public

Zack Zack
5 февр. 2011 г. 05:13:38

Привет, Зак, Эндрю и Филипп. Всё работает прекрасно, однако я попытался применить это к запросу, но безрезультатно. Не совсем понимаю, почему. Вот ссылка, раз вы все знаете, как работало первоначальное создание поста с кастомными полями, думаю, вы сможете увидеть мою ошибку. http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fields

Robin I Knight Robin I Knight
5 февр. 2011 г. 19:22:23

@Зак - Отличный ответ. Но я бы постарался избегать использования подчёркиваний в начале названий функций, хотя бы потому, что имена с ведущими подчёркиваниями обычно используются разработчиками платформ, когда они хотят создать "зарезервированные" или (псевдо) "скрытые" функции, так что люди, видящие их, могут подумать, что это функции платформы, или, что хуже, они могут конфликтовать с будущими функциями ядра WordPress. Просто мысль.

MikeSchinkel MikeSchinkel
5 февр. 2011 г. 19:46:08

@MikeSchinkel: Изначально я использовал "__" для защищённых функций внутри класса, но затем изменил структуру своего плагина так, что функция должна была быть публичной. Я бы также назвал её просто "update_post_meta", но это точно вызвало бы конфликт с функциями ядра WordPress. Так что я не знал, как её назвать :(

Zack Zack
5 февр. 2011 г. 19:50:08

@Zack - Возможно zacks_update_post_meta()? :) Другая проблема с ведущими подчеркиваниями, которую я не упомянул, заключается в том, что кто-то другой, столь же креативный, может использовать то же соглашение в плагине и таким образом конфликтовать с вашим. Кстати, знали ли вы, что update_post_meta() добавляет метаданные, если они не существуют? add_post_meta() нужен только когда вы хотите добавить дублирующиеся ключи.

MikeSchinkel MikeSchinkel
5 февр. 2011 г. 20:01:08

@MikeSchinkel: Изначально я нашел эту функцию в другом месте на этом сайте, она мне понравилась, и я её рефакторил просто потому что я такой. Я также предполагал, что update_post_meta() уже это делает, но не был уверен. Когда я нашел эту функцию, я поспешил с выводами.

Zack Zack
5 февр. 2011 г. 20:04:00

@Zack - Изучение WordPress - это путешествие. Я думаю, у меня впереди еще как минимум 50% этого пути, если не больше!

MikeSchinkel MikeSchinkel
5 февр. 2011 г. 20:06:43

Я не могу добавить ответ, так как у меня нет достаточной репутации на wordpress.stackexchange. На сегодняшний день существует новый метод - вы можете просто передать массив в wp_insert_post следующим образом: meta_input => array(key=>value)

Frederik Witte Frederik Witte
15 окт. 2016 г. 12:59:23
Показать остальные 5 комментариев
0
17

Вы можете просто добавить 'add_post_meta' после 'wp_insert_post'

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );

$post_id = wp_insert_post($my_post);

add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true);
add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true);
?>
5 февр. 2011 г. 10:58:21
0

Вы можете добавить элемент 'meta_input' в параметры записи как массив значений произвольных полей, где ключами будут их имена

<?php 

$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',

    'meta_input' => array(
      'your_custom_meta_field_name' => $_SESSION['your_custom_meta_field_value']
    )
  );
  wp_insert_post( $my_post );
  ?>
21 сент. 2020 г. 02:44:33
4

Используйте фильтр save_post, затем вызовите add_post_meta в вашей функции-фильтре.

4 февр. 2011 г. 22:30:13
Комментарии

Бесполезно. $post->ID недоступен в wp_insert_post_data, что необходимо для создания пользовательских полей.

aendra aendra
4 февр. 2011 г. 22:40:01

@aendrew Действие save_post находится в самом конце функции, оно получает ID поста и его объект, ответ корректен.

Rarst Rarst
5 февр. 2011 г. 02:16:12

Я почти уверен, что это было отредактировано, Rarst. В любом случае, теперь это имеет смысл.

aendra aendra
5 февр. 2011 г. 04:04:54

@aendrew ах, извините - не заметил этого

Rarst Rarst
5 февр. 2011 г. 11:46:54
4

Я не думаю, что вы сможете использовать это с wp_insert_post().

Причина в том, как WordPress хранит эти два типа данных. Записи хранятся в одной большой монолитной таблице с дюжиной различных столбцов (wp_posts); произвольные поля хранятся в более простой таблице из 4 столбцов (wp_postmeta), состоящей в основном из мета-ключа и значения, связанных с записью.

Следовательно, вы не можете сохранить произвольные поля, пока у вас нет ID записи.

Попробуйте это:

function myplugin_insert_customs($pid){

    $customs = array(
    'post_id' => $pid,
    'meta_key' => 'Ваш мета-ключ',
    'meta_value' => 'Ваше мета-значение',
    );

    add_post_meta($customs);

}

add_action('save_post', 'myplugin_insert_customs', 99);

Эта статья из Codex помогла — она вроде как противоположность тому, что вы делаете (т.е. удаление строки из БД при удалении записи): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

4 февр. 2011 г. 22:31:37
Комментарии

В таком случае, единственное решение, которое я вижу — это использовать сессию. Будет ли это правильным подходом?

Robin I Knight Robin I Knight
4 февр. 2011 г. 22:42:46

Не обязательно; я предполагаю, что ваш плагин пытается добавить произвольные поля в момент сохранения записи, верно? Думаю, вам нужно подключиться к WP после сохранения записи, получить её новый ID и передать его в add_post_meta() для создания произвольных полей. Сейчас обновлю свой ответ, добавив немного кода.

aendra aendra
4 февр. 2011 г. 22:48:58

Спасибо за помощь. Кстати, это не плагин. Я написал его, чтобы можно было максимально кастомизировать под наши нужды. (но не думайте, что я хорошо разбираюсь в PHP — просто методом проб и ошибок).

Robin I Knight Robin I Knight
4 февр. 2011 г. 22:52:01

Это тема, получается? Единственное реальное отличие в том, что в этом случае вы бы поместили это в functions.php.

aendra aendra
4 февр. 2011 г. 23:00:49