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

);