Esto parece ser una limitación de PHP en sí mismo, consulte esta publicación en los foros de Wordpress .
Me enfrenté al mismo problema y terminé creando una función personalizada que hace el trabajo, la pego aquí en caso de que sea útil para alguien. La función es bastante simple ya que hace algunas suposiciones, pero debería ser fácil modificarla para adaptarla a diferentes necesidades. Específicamente asume que:
- Todas las declaraciones son inserciones y actualizaciones, no hay datos para devolver.
- Las declaraciones se separan con una secuencia de final de línea.
- Los extractos se incluyen dentro de una transacción.
Aquí está la función:
function execute_multiline_sql($sql) {
global $wpdb;
$sqlParts = array_filter(explode("\r\n", $sql));
foreach($sqlParts as $part) {
$wpdb->query($part);
if($wpdb->last_error != '') {
$error = new WP_Error("dberror", __("Database query error"), $wpdb->last_error);
$wpdb->query("rollback;");
return $error;
}
}
return true;
}
Ejemplo de uso:
$sql = "start transaction;\r\n" .
"insert into ...;\r\n" .
"update ...;\r\n" .
"commit;\r\n"
;
$result = execute_multiline_sql($sql);
if(is_wp_error($result)) {
//Fail!
}