Wordpress - 使用insert_post时的db_insert_error

jos*_*nte 2 php csv wordpress genesis

我目前正在使用每天自动更新的CSV文件,以便为客户的网站创建或更新Wordpress帖子.CSV具有列表的地址,城市,州等的标题,每行是另一个列表.目前,CSV中有大约220个属性.除了其中三个之外的所有内容都是作为帖子创建的,但其中有三个不是,而且我得到的是像这样的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"
 }
Run Code Online (Sandbox Code Playgroud)

我知道插件至少可以工作,因为所有其他插件都已发布,但似乎这三个由于某种原因正在出现此错误.它们中没有任何特殊字符或其他数据可以将它们与其他行区分开来.这是我用来创建新帖子的数组和代码:

$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']);
Run Code Online (Sandbox Code Playgroud)

$title地址,城市和州的预加入字符串在哪里.

if (!get_page_by_title( $new_post['post_title'], 'OBJECT', 'listing') && $pricecheck != "") {
    $id = wp_insert_post($new_post, true);
}
Run Code Online (Sandbox Code Playgroud)

我知道上面的字段或变量都不是空的,它会变wp_insert_post()好,但不会插入.任何帮助将不胜感激!

Ger*_*der 8

我今天遇到了类似的问题,所以我将分享导致我解决方案的问题(解决方案可能与您不同,但方式会有所帮助).

我得到了相同的错误消息,绝对没有有用的文本,所以我挖了WordPress源代码并开始调试.

wp_insert_post()$wpdb->insert()返回false 时,错误仅在一个地方抛出:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

$wpdb->insert()在进行插入之前进行一些健全性检查,使用process_fields()in 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;
}
Run Code Online (Sandbox Code Playgroud)

我开始var_dump($data)在每个检查和以下if子句之间添加,以查看错误的来源.

在我的情况下问题是在strip_invalid_text()电话会议之后,这导致了我的问题的原因:

我正在读取要从其他数据库插入的数据,并且它的编码错误.添加charset=utf8mb4到我的PDO构造函数后,所有数据都在utf8中,wp_insert_post()并立即工作.

很难说在你的情况下是什么导致了问题,它可能是一个错误的字符集,一个错误的格式,一个太长的字段...... WordPress并没有真正披露出什么问题.找到它你真的要仔细看.