Описание
Вставляет запись (пост) в Базу Данных.
Функция делает некоторые проверки передаваемых данных, тем самым не давая ввести данные, которые могут повредить БД. Так же функция заполняет пустые данные (которые не были переданы), например, если не передать дату поста, то дата будет сгенерирована автоматически.
wp_insert_post() передает данные предварительно очистив и проверив их функцией sanitize_post().
В качестве аргумента функции нужно передавать ассоциативный массив данных, в случае удачной вставки данных, функция вернет ID новой записи, если данные вставить не удалось, то будет возвращен 0.
Использование
<?php wp_insert_post( $post, $wp_error ); ?>
Параметры
- $post (массив) (обязательный)
- Массив данных, которые нужно вставить в Базу Данных. Ключи массива в точности равны полям таблицы wp_posts, передаваемые значения ключей будут вставлены в значение полей таблицы.ВАЖНО! Параметр ID не должен быть указать в массиве, если нужно создать новую запись. Если передать параметр ID, то будет отредактирована уже существующая запись с таким же ID, т.е. при указании параметра ID, мы обновляем запись, а не создаем новую.Параметры, которые могут входить в массив:
$post = array( 'ID' => [ <post id> ] // Вы обновляете существующий пост? 'menu_order' => [ <order> ] // Если запись "постоянная страница", установите её порядок в меню. 'comment_status' => [ 'closed' | 'open' ] // 'closed' означает, что комментарии закрыты. 'ping_status' => [ 'closed' | 'open' ] // 'closed' означает, что пинги и уведомления выключены. 'pinged' => [ ? ] //? 'post_author' => [ <user ID> ] // ID автора записи 'post_category' => [ array(<category id>, <...>) ] // Категория к которой относится пост. 'post_content' => [ <the text of the post> ] // Полный текст записи. 'post_date' => [ Y-m-d H:i:s ] // Время, когда запись была создана. 'post_date_gmt' => [ Y-m-d H:i:s ] // Время, когда запись была создана в GMT. 'post_excerpt' => [ <an excerpt> ] // Цитата (пояснительный текст) записи. 'post_name' => [ <the name> ] // Альтернативное название записи (slug) будет использовано в УРЛе. 'post_parent' => [ <post ID> ] // ID родительской записи, если нужно. 'post_password' => [ ? ] // Пароль для просмотра записи. 'post_status' => [ 'draft' | 'publish' | 'pending'| 'future' | 'private' ] // Статус создаваемой записи. 'post_title' => [ <the title> ] // Заголовок (название) записи. 'post_type' => [ 'post' | 'page' | 'link' | 'nav_menu_item' | custom post type ] // Тип записи. 'tags_input' => [ '<tag>, <tag>, <...>' ] // Метки поста. 'to_ping' => [ ? ] //? );
ЗАМЕТКА! (10.1.2009) Поле таблицы page_template было удалено, теперь, шаблон для постоянной страницы задается в таблице wp_postmeta, для этого используйте функцию update_post_meta().
ЗАМЕТКА! Если указывается статус поста как future (запланированная запись), то обязательно нужно указать дату поста, чтобы WordPress знал, когда нужно опубликовать запись.
По умолчанию: нет - $wp_error (логический)
- Позволяет получить WP_Error объект, в случае ошибки.
По умолчанию: false
1.1. Параметры, передаваемые по умолчанию:
$defaults = array(
'post_status' => 'draft',
'post_type' => 'post',
'post_author' => $user_ID,
'ping_status' => get_option('default_ping_status'),
'post_parent' => 0,
'menu_order' => 0,
'to_ping' => '',
'pinged' => '',
'post_password' => '',
'guid' => '',
'post_content_filtered' => '',
'post_excerpt' => '',
'import_id' => 0);
Примеры
Перед тем как использовать wp_insert_post нужно создать массив данных, который затем передать функции. В массиве, как минимум нужно указать заголовок записи (post_title) и её текст (post_content) иначе запись не создастся. Остальные поля, данные для которых не указаны, будут созданы автоматически, со значениями по умолчанию.
В массиве можно указать больше данных, чем это представлено ниже, ключи массива - это название полей таблицы wp_posts Базы Данных WordPress.
1. Простой пример вставки новой записи в Базу Данных WordPress:
// Создаем массив
$my_post = array(
'post_title' => 'Заголовок записи',
'post_content' => 'Здесь должен быть контент (текст) записи.',
'post_status' => 'publish',
'post_author' => 1,
'post_category' => array(8,39)
);
// Вставляем данные в БД
wp_insert_post( $my_post );
Категории нужно передавать в массиве, даже если указывается одна категория. Например: 'post_category' => array(8)
Смотрите также: wp_set_post_terms(), когда нужно установить произвольные таксономии для поста или типа записи.
На заметку
- Использует: wp_transition_post_status()
- Использует: _wp_put_post_revision()
- Использует: $user_ID
- Использует: $wpdb
- Использует: $wp_rewrite
- Использует: do_action() - edit_post, если производится обновление записи. Передаются ID и Данные.
- Использует: do_action() - save_post и wp_insert_post. Передаются ID и Данные.
- Использует: apply_filters() - wp_insert_post_data передает $data, $postarr с целью обновления/вставки данных в БД.
wp_insert_post()
из файла: /wp-includes/post.php WP 3.3.2function wp_insert_post($postarr, $wp_error = false) {
global $wpdb, $wp_rewrite, $user_ID;
$defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID,
'ping_status' => get_option('default_ping_status'), 'post_parent' => 0,
'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '',
'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => '', 'import_id' => 0,
'post_content' => '', 'post_title' => '');
$postarr = wp_parse_args($postarr, $defaults);
unset( $postarr[ 'filter' ] );
$postarr = sanitize_post($postarr, 'db');
// export array as variables
extract($postarr, EXTR_SKIP);
// Are we updating or creating?
$update = false;
if ( !empty($ID) ) {
$update = true;
$previous_status = get_post_field('post_status', $ID);
} else {
$previous_status = 'new';
}
$maybe_empty = ! $post_content && ! $post_title && ! $post_excerpt && post_type_supports( $post_type, 'editor' )
&& post_type_supports( $post_type, 'title' ) && post_type_supports( $post_type, 'excerpt' );
if ( apply_filters( 'wp_insert_post_empty_content', $maybe_empty, $postarr ) ) {
if ( $wp_error )
return new WP_Error( 'empty_content', __( 'Content, title, and excerpt are empty.' ) );
else
return 0;
}
if ( empty($post_type) )
$post_type = 'post';
if ( empty($post_status) )
$post_status = 'draft';
if ( !empty($post_category) )
$post_category = array_filter($post_category); // Filter out empty terms
// Make sure we set a valid category.
if ( empty($post_category) || 0 == count($post_category) || !is_array($post_category) ) {
// 'post' requires at least one category.
if ( 'post' == $post_type && 'auto-draft' != $post_status )
$post_category = array( get_option('default_category') );
else
$post_category = array();
}
if ( empty($post_author) )
$post_author = $user_ID;
$post_ID = 0;
// Get the post ID and GUID
if ( $update ) {
$post_ID = (int) $ID;
$guid = get_post_field( 'guid', $post_ID );
$post_before = get_post($post_ID);
}
// Don't allow contributors to set the post slug for pending review posts
if ( 'pending' == $post_status && !current_user_can( 'publish_posts' ) )
$post_name = '';
// Create a valid post name. Drafts and pending posts are allowed to have an empty
// post name.
if ( empty($post_name) ) {
if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
$post_name = sanitize_title($post_title);
else
$post_name = '';
} else {
// On updates, we need to check to see if it's using the old, fixed sanitization context.
$check_name = sanitize_title( $post_name, '', 'old-save' );
if ( $update && strtolower( urlencode( $post_name ) ) == $check_name && get_post_field( 'post_name', $ID ) == $check_name )
$post_name = $check_name;
else // new post, or slug has changed.
$post_name = sanitize_title($post_name);
}
// If the post date is empty (due to having been new or a draft) and status is not 'draft' or 'pending', set date to now
if ( empty($post_date) || '0000-00-00 00:00:00' == $post_date )
$post_date = current_time('mysql');
if ( empty($post_date_gmt) || '0000-00-00 00:00:00' == $post_date_gmt ) {
if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
$post_date_gmt = get_gmt_from_date($post_date);
else
$post_date_gmt = '0000-00-00 00:00:00';
}
if ( $update || '0000-00-00 00:00:00' == $post_date ) {
$post_modified = current_time( 'mysql' );
$post_modified_gmt = current_time( 'mysql', 1 );
} else {
$post_modified = $post_date;
$post_modified_gmt = $post_date_gmt;
}
if ( 'publish' == $post_status ) {
$now = gmdate('Y-m-d H:i:59');
if ( mysql2date('U', $post_date_gmt, false) > mysql2date('U', $now, false) )
$post_status = 'future';
} elseif( 'future' == $post_status ) {
$now = gmdate('Y-m-d H:i:59');
if ( mysql2date('U', $post_date_gmt, false) <= mysql2date('U', $now, false) )
$post_status = 'publish';
}
if ( empty($comment_status) ) {
if ( $update )
$comment_status = 'closed';
else
$comment_status = get_option('default_comment_status');
}
if ( empty($ping_status) )
$ping_status = get_option('default_ping_status');
if ( isset($to_ping) )
$to_ping = preg_replace('|\s+|', "\n", $to_ping);
else
$to_ping = '';
if ( ! isset($pinged) )
$pinged = '';
if ( isset($post_parent) )
$post_parent = (int) $post_parent;
else
$post_parent = 0;
// Check the post_parent to see if it will cause a hierarchy loop
$post_parent = apply_filters( 'wp_insert_post_parent', $post_parent, $post_ID, compact( array_keys( $postarr ) ), $postarr );
if ( isset($menu_order) )
$menu_order = (int) $menu_order;
else
$menu_order = 0;
if ( !isset($post_password) || 'private' == $post_status )
$post_password = '';
$post_name = wp_unique_post_slug($post_name, $post_ID, $post_status, $post_type, $post_parent);
// expected_slashed (everything!)
$data = compact( array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'guid' ) );
$data = apply_filters('wp_insert_post_data', $data, $postarr);
$data = stripslashes_deep( $data );
$where = array( 'ID' => $post_ID );
if ( $update ) {
do_action( 'pre_post_update', $post_ID );
if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) {
if ( $wp_error )
return new WP_Error('db_update_error', __('Could not update post in the database'), $wpdb->last_error);
else
return 0;
}
} else {
if ( isset($post_mime_type) )
$data['post_mime_type'] = stripslashes( $post_mime_type ); // This isn't in the update
// If there is a suggested ID, use it if not already present
if ( !empty($import_id) ) {
$import_id = (int) $import_id;
if ( ! $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE ID = %d", $import_id) ) ) {
$data['ID'] = $import_id;
}
}
if ( false === $wpdb->insert( $wpdb->posts, $data ) ) {
if ( $wp_error )
return new WP_Error('db_insert_error', __('Could not insert post into the database'), $wpdb->last_error);
else
return 0;
}
$post_ID = (int) $wpdb->insert_id;
// use the newly generated $post_ID
$where = array( 'ID' => $post_ID );
}
if ( empty($data['post_name']) && !in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
$data['post_name'] = sanitize_title($data['post_title'], $post_ID);
$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );
}
if ( is_object_in_taxonomy($post_type, 'category') )
wp_set_post_categories( $post_ID, $post_category );
if ( isset( $tags_input ) && is_object_in_taxonomy($post_type, 'post_tag') )
wp_set_post_tags( $post_ID, $tags_input );
// new-style support for all custom taxonomies
if ( !empty($tax_input) ) {
foreach ( $tax_input as $taxonomy => $tags ) {
$taxonomy_obj = get_taxonomy($taxonomy);
if ( is_array($tags) ) // array = hierarchical, string = non-hierarchical.
$tags = array_filter($tags);
if ( current_user_can($taxonomy_obj->cap->assign_terms) )
wp_set_post_terms( $post_ID, $tags, $taxonomy );
}
}
$current_guid = get_post_field( 'guid', $post_ID );
if ( 'page' == $data['post_type'] )
clean_page_cache($post_ID);
else
clean_post_cache($post_ID);
// Set GUID
if ( !$update && '' == $current_guid )
$wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post_ID ) ), $where );
$post = get_post($post_ID);
if ( !empty($page_template) && 'page' == $data['post_type'] ) {
$post->page_template = $page_template;
$page_templates = get_page_templates();
if ( 'default' != $page_template && !in_array($page_template, $page_templates) ) {
if ( $wp_error )
return new WP_Error('invalid_page_template', __('The page template is invalid.'));
else
return 0;
}
update_post_meta($post_ID, '_wp_page_template', $page_template);
}
wp_transition_post_status($data['post_status'], $previous_status, $post);
if ( $update ) {
do_action('edit_post', $post_ID, $post);
$post_after = get_post($post_ID);
do_action( 'post_updated', $post_ID, $post_after, $post_before);
}
do_action('save_post', $post_ID, $post);
do_action('wp_insert_post', $post_ID, $post);
return $post_ID;
}Ещё из раздела
Смотрите также: Функции WordPress и Теги Шаблона.
Вашей компании нужен сайт-визитка и вы мечитесь в поисках хорошего разработчика, чтобы сделал хороший сайт и при этом взял не дорого? Такая ситуация наблюдается у многих компаний сайт визитка недорого это реальность, более того найти того, кто создаст такой сайт за приемлемую цену и с хорошем качеством можно в сети, по рекомендациям.
А как добавить с постом значение в произвольное поле?
Функция вернет ID новой записи. а если у нас есть ID то нет ничего проще!
$id = wp_insert_post( $my_post ); if( $id ){ update_post_meta($id, 'название поля', 'значение поля'); }Не удается использовать объект типа WP_Error как массив бла бла бла((
Не подскажите, есть параметры при инсерте, чтобы контент поста не фильтровался?( вырезаются , checkbox'ы)
Или как это можно обойти? Читал про функцию remove_filter, но как её применить правильно, не понял?
object и в комменте вырезался )