2015-08-15 2 views
2

В настоящее время я использую CSV-файл, который автоматически обновляется ежедневно, чтобы создавать или обновлять сообщения Wordpress для веб-сайта клиента. CSV имеет заголовки для адреса, города, штата и т. Д., И каждая строка является еще одним листингом. В настоящее время в CSV имеется около 220 объектов. Все, кроме трех из них становятся созданы как должности, но 3 из них не являются, и я получаю WP_Error как так ->Wordpress - db_insert_error при использовании insert_post

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

Где $title является предварительно присоединился строка адреса, города и государства.

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

Я знаю, что ни один из перечисленных выше полей или переменных не являются пустыми, и она попадает в wp_insert_post() штрафа, но это не будет вставлять. Любая помощь будет принята с благодарностью!

ответ

5

Сегодня у меня есть аналогичная проблема, поэтому я расскажу, что привело меня к решению (решение может быть другим для вас, но способ поможет).

У меня такое же сообщение об ошибке с абсолютно бесполезным текстом, поэтому я выкопал исходный код WordPress и начал отлаживать.

Ошибка генерируется только в одном месте в wp_insert_post(), когда $wpdb->insert() возвращает ложь:

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() в 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) между каждой проверки и последующей если-п, чтобы увидеть, где пришла ошибка с.

В моем случае проблема была после strip_invalid_text() вызова, которые приводят меня к делу моей проблемы:

Я читал данные для вставки из другой базы данных, и она пришла в неверной кодировке. После добавления charset=utf8mb4 к моему конструктору PDO все данные были в utf8, и wp_insert_post() работал мгновенно.

Сложно сказать, что вызвало проблему в вашем случае, это может быть неправильная кодировка, неправильный формат, поле, которое слишком длинное ... WordPress не раскрывает, в чем проблема. Чтобы найти его, вам действительно нужно присмотреться.

+0

Спасибо! Это очень эффективный метод –

2

У меня была аналогичная проблема, и причина этого заключалась в том, что параметр post_status имел длину более 20 символов.

https://codex.wordpress.org/Post_Status

Надеется, что это помогает!