Wordpress - 使用 insert_post 时 db_insert_error
Wordpress - db_insert_error when using insert_post
我目前正在使用 CSV 文件(每天 auto-updated)为客户的网站创建或更新 Wordpress post。 CSV 中有 headers 用于列表的地址、城市、州等,每一行都是另一个列表。目前,CSV 中大约有 220 个属性。除了三个之外,所有其他都被创建为 posts,但其中 3 个不是,我得到一个 WP_Error 像这样 -->
WP_Error {
"errors"=> array{ ["db_insert_error"]=>
array{ [0]=> "Could not insert post into the database" }}
"error_data"=> array { }
"ID"=> int(0)
"filter"=> "raw"
}
我知道该插件至少可以工作,因为所有其他插件都得到了 posted,但似乎这三个插件出于某种原因出现了此错误。它们中没有任何特殊字符或其他可将它们与其他行区分开来的数据。这是我用来创建新 post:
的数组和代码
$new_post = array(
'post_title' => $title,
'post_content' => wpautop(convert_chars($data['csv_post_post'])),
'post_status' => $opt_draft,
'post_type' => 'listing',
'post_date' => $this->parse_date($data['csv_post_date']),
'post_excerpt' => '....',
'post_name' => $data['csv_post_slug'],
'post_author' => $this->get_auth_id($data['csv_post_author']),
'tax_input' => $this->get_taxonomies($data),
'post_parent' => $data['csv_post_parent'],
);
$pricecheck = trim($data['_listing_price']);
其中 $title
是地址、城市和州的 pre-joined 字符串。
if (!get_page_by_title( $new_post['post_title'], 'OBJECT', 'listing') && $pricecheck != "") {
$id = wp_insert_post($new_post, true);
}
我知道上面的none个字段或变量是空的,到wp_insert_post()
就可以了,但是不会插入。任何帮助将不胜感激!
我今天遇到了类似的问题,所以我将分享导致我找到解决方案的原因(解决方案可能对您有所不同,但方法会有所帮助)。
我得到了完全没有帮助的文本的相同错误消息,所以我深入研究了 WordPress 源代码并开始调试。
当$wpdb->insert()
returns false:
时,wp_insert_post()
中只有一个地方抛出错误
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;
}
}
$wpdb->insert()
makes some sanity checks before doing the insert, using process_fields()
在 wp-includes/wp-db.php
.
protected function process_fields( $table, $data, $format ) {
$data = $this->process_field_formats( $data, $format );
if ( false === $data ) {
return false;
}
$data = $this->process_field_charsets( $data, $table );
if ( false === $data ) {
return false;
}
$data = $this->process_field_lengths( $data, $table );
if ( false === $data ) {
return false;
}
$converted_data = $this->strip_invalid_text( $data );
if ( $data !== $converted_data ) {
return false;
}
return $data;
}
我开始在每个检查和以下 if 子句之间添加 var_dump($data)
以查看错误的来源。
在我的例子中,问题出在 strip_invalid_text()
调用之后,这让我找到了问题的原因:
我正在读取要从不同数据库插入的数据,但它的编码有误。将 charset=utf8mb4
添加到我的 PDO 构造函数后,所有数据都在 utf8 中并且 wp_insert_post()
立即工作。
很难说是什么导致了您的问题,可能是错误的字符集、错误的格式、太长的字段……WordPress 并没有真正揭示问题所在。要找到它,你真的必须仔细观察。
我遇到了类似的问题,原因是post_status
参数超过了20个字符。
https://codex.wordpress.org/Post_Status
希望对您有所帮助!
确保正在更新的数据的编码匹配。在我的例子中,我需要在传递给 wp_update_post 或 wp_insert_post
的数组上将 ISO-8859-1 数据转换为 UTF-8 多字节
$post_update_array = array(
'ID' => $post_id,
'post_title' => mb_convert_encoding($post->post_title, 'UTF-8', 'auto'),
'post_content' => mb_convert_encoding($post->post_content, 'UTF-8', 'auto'),
'post_category' => $categories_ids
);
我目前正在使用 CSV 文件(每天 auto-updated)为客户的网站创建或更新 Wordpress post。 CSV 中有 headers 用于列表的地址、城市、州等,每一行都是另一个列表。目前,CSV 中大约有 220 个属性。除了三个之外,所有其他都被创建为 posts,但其中 3 个不是,我得到一个 WP_Error 像这样 -->
WP_Error {
"errors"=> array{ ["db_insert_error"]=>
array{ [0]=> "Could not insert post into the database" }}
"error_data"=> array { }
"ID"=> int(0)
"filter"=> "raw"
}
我知道该插件至少可以工作,因为所有其他插件都得到了 posted,但似乎这三个插件出于某种原因出现了此错误。它们中没有任何特殊字符或其他可将它们与其他行区分开来的数据。这是我用来创建新 post:
的数组和代码$new_post = array(
'post_title' => $title,
'post_content' => wpautop(convert_chars($data['csv_post_post'])),
'post_status' => $opt_draft,
'post_type' => 'listing',
'post_date' => $this->parse_date($data['csv_post_date']),
'post_excerpt' => '....',
'post_name' => $data['csv_post_slug'],
'post_author' => $this->get_auth_id($data['csv_post_author']),
'tax_input' => $this->get_taxonomies($data),
'post_parent' => $data['csv_post_parent'],
);
$pricecheck = trim($data['_listing_price']);
其中 $title
是地址、城市和州的 pre-joined 字符串。
if (!get_page_by_title( $new_post['post_title'], 'OBJECT', 'listing') && $pricecheck != "") {
$id = wp_insert_post($new_post, true);
}
我知道上面的none个字段或变量是空的,到wp_insert_post()
就可以了,但是不会插入。任何帮助将不胜感激!
我今天遇到了类似的问题,所以我将分享导致我找到解决方案的原因(解决方案可能对您有所不同,但方法会有所帮助)。
我得到了完全没有帮助的文本的相同错误消息,所以我深入研究了 WordPress 源代码并开始调试。
当$wpdb->insert()
returns false:
wp_insert_post()
中只有一个地方抛出错误
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;
}
}
$wpdb->insert()
makes some sanity checks before doing the insert, using process_fields()
在 wp-includes/wp-db.php
.
protected function process_fields( $table, $data, $format ) {
$data = $this->process_field_formats( $data, $format );
if ( false === $data ) {
return false;
}
$data = $this->process_field_charsets( $data, $table );
if ( false === $data ) {
return false;
}
$data = $this->process_field_lengths( $data, $table );
if ( false === $data ) {
return false;
}
$converted_data = $this->strip_invalid_text( $data );
if ( $data !== $converted_data ) {
return false;
}
return $data;
}
我开始在每个检查和以下 if 子句之间添加 var_dump($data)
以查看错误的来源。
在我的例子中,问题出在 strip_invalid_text()
调用之后,这让我找到了问题的原因:
我正在读取要从不同数据库插入的数据,但它的编码有误。将 charset=utf8mb4
添加到我的 PDO 构造函数后,所有数据都在 utf8 中并且 wp_insert_post()
立即工作。
很难说是什么导致了您的问题,可能是错误的字符集、错误的格式、太长的字段……WordPress 并没有真正揭示问题所在。要找到它,你真的必须仔细观察。
我遇到了类似的问题,原因是post_status
参数超过了20个字符。
https://codex.wordpress.org/Post_Status
希望对您有所帮助!
确保正在更新的数据的编码匹配。在我的例子中,我需要在传递给 wp_update_post 或 wp_insert_post
的数组上将 ISO-8859-1 数据转换为 UTF-8 多字节$post_update_array = array(
'ID' => $post_id,
'post_title' => mb_convert_encoding($post->post_title, 'UTF-8', 'auto'),
'post_content' => mb_convert_encoding($post->post_content, 'UTF-8', 'auto'),
'post_category' => $categories_ids
);