2

我目前正在使用每天自动更新的 CSV 文件来为客户的网站创建或更新 Wordpress 帖子。CSV 包含列表地址、城市、州等的标题,每一行都是另一个列表。目前,CSV 中有大约 220 个属性。除了三个之外,所有这些都被创建为帖子,但其中 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"
 }

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

$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']);

Where$title是地址、城市和州的预连接字符串。

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

我知道上述字段或变量都不是空的,它可以wp_insert_post()正常工作,但不会插入。任何帮助将不胜感激!

4

3 回答 3

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;
    }
}

$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;
}

我开始var_dump($data)在每次检查和以下 if 子句之间添加,以查看错误来自何处。

就我而言,问题出在strip_invalid_text()通话之后,这导致我找到了问题的原因:

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

很难说是什么导致了您的问题,它可能是错误的字符集、错误的格式、太长的字段……WordPress 并没有真正披露问题所在。要找到它,你真的必须仔细观察。

于 2015-12-28T15:39:17.550 回答
2

我遇到了类似的问题,原因是post_status参数长度超过 20 个字符。

https://codex.wordpress.org/Post_Status

希望能帮助到你!

于 2017-05-18T17:54:43.570 回答
0

确保正在更新的数据的编码匹配。在我的情况下,我需要在传递给 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

);

于 2020-05-05T09:15:05.627 回答