Isso parece ser uma limitação do próprio PHP, veja este post nos fóruns do Wordpress .
Me deparei com o mesmo problema e acabei criando uma função customizada que faz o trabalho, coloco aqui caso seja útil para alguém. A função é bastante simples, pois faz algumas suposições, mas deve ser fácil modificá-la para adaptar a diferentes necessidades. Especificamente, assume que:
- Todas as instruções são inserções e atualizações, não há dados para retornar.
- As instruções são separadas por uma sequência de fim de linha.
- Os extratos são incluídos em uma transação.
Aqui está a função:
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;
}
Exemplo 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!
}