WordPress – db_insert_error al usar insert_post

4 minutos de lectura

Actualmente estoy usando un archivo CSV, que se actualiza automáticamente a diario, para crear o actualizar publicaciones de WordPress para el sitio web de un cliente. El CSV tiene encabezados para la dirección, la ciudad, el estado, etc. de la lista, y cada fila es otra lista. Actualmente, hay alrededor de 220 propiedades en el CSV. Todos menos tres de ellos se crean como publicaciones, pero 3 de ellos no, y obtengo un WP_Error así –>

 WP_Error { 
       "errors"=> array{ ["db_insert_error"]=> 
                array{ [0]=> "Could not insert post into the database" }}
       "error_data"=> array { } 
       "ID"=> int(0) 
       "filter"=> "raw"
 }

Sé que el complemento al menos funciona ya que todos los demás se están publicando, pero parece que estos tres, por alguna razón, están recibiendo este error. No tienen caracteres especiales ni otros datos que los diferencien de las otras filas. Aquí está mi matriz y el código que estoy usando para crear la nueva publicación:

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

Dónde $title es una cadena previamente unida de la dirección, la ciudad y el estado.

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

Sé que ninguno de los campos o variables anteriores están vacíos, y llega a wp_insert_post() bien, pero no se inserta. ¡Cualquier ayuda sería muy apreciada!

  • @adrianthedev tenía razón. Ir wp_posts tabla DB y mire la estructura y verifique el longitud. yo limitado post_name longitud: substr( $fila[‘url’]0, 199 )

    – J. Doe

    24 de diciembre de 2018 a las 13:50

Tengo un problema similar hoy, así que compartiré lo que me llevó a la solución (la solución puede ser diferente para ti, pero la forma te ayudará).

Recibí el mismo mensaje de error sin ningún texto útil, así que busqué en el código fuente de WordPress y comencé a depurar.

El error se arroja en un solo lugar en wp_insert_post()cuando $wpdb->insert() devuelve falso:

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() hace algunas comprobaciones de cordura antes de hacer la inserción, usando process_fields() en 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;
}

comencé a agregar var_dump($data) entre cada verificación y la siguiente cláusula if para ver de dónde proviene el error.

En mi caso el problema fue después de la strip_invalid_text() llamada, que me lleva a la causa de mi problema:

Estaba leyendo los datos para insertarlos desde una base de datos diferente y venían con la codificación incorrecta. Después de agregar charset=utf8mb4 para mi constructor de PDO, todos los datos estaban en utf8 y el wp_insert_post() funcionó al instante.

Es difícil decir qué causó el problema en su caso, podría ser un conjunto de caracteres incorrecto, un formato incorrecto, un campo que es demasiado largo… WordPress realmente no revela cuál es el problema. Para encontrarlo realmente tienes que mirar de cerca.

  • ¡Gracias! es un metodo muy efectivo

    – Iván Rodríguez Torres

    7 abr 2016 a las 11:12

  • Terminó en este mismo lugar después de la depuración hasta procesar_campos. Mi base de datos está en ISO-8859-1 y realmente no pude configurar el constructor PDO para que sea charset=utf8mb4. Mi solución fue correcta en el momento antes de llamar a wp_insert_post o wp_update_post. Hice esto en la matriz $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 );

    – Gubatron

    5 de mayo de 2020 a las 9:13


Tuve un problema similar y la causa fue que el post_status el parámetro tenía más de 20 caracteres.

https://codex.wordpress.org/Post_Status

¡Espero eso ayude!

Asegúrese de que la codificación de los datos que se actualizan coincida. En mi caso, necesitaba convertir los datos ISO-8859-1 en multibyte UTF-8 en la matriz que pasa a wp_update_post o wp_insert_post

$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

);

¿Ha sido útil esta solución?