Как обновить произвольные поля с помощью функции wp_insert_post()?
Функция 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 );
?>

Если вы читали документацию по функции 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' );

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

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

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

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

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

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

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

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

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

Вы можете просто добавить '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);
?>

Вы можете добавить элемент '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 );
?>

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

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

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

Я не думаю, что вы сможете использовать это с 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

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

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

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