Por que não funciona:não defina o terceiro parâmetro de
$wpdb->insert
para string vazia. Ele formata cada campo de acordo. O que ele faz agora é equivalente a:
$wpdb->insert($table, array(
'object_id' => sprintf('', $num_object_id),
'term_taxonomy_id' => sprintf('', $num_taxo_id),
'term_order' => sprintf('', 0)
));
Se você realmente deseja definir o terceiro parâmetro, deve fazer:
$wpdb->insert($table, array(
'object_id' => $num_object_id,
'term_taxonomy_id' => $num_taxo_id,
'term_order' => 0
), array('%d', '%d', '%d'));
Quanto ao erro:a tabela wp_term_relationships possui uma chave primária exclusiva em (object_id, term_taxonomy_id). Isso significa que você não pode ter duas linhas nessa tabela que tenham o mesmo object_id e term_taxonomy_id.
Embora isso tenha acontecido porque, ao definir o terceiro parâmetro de insert para string vazia, você está tentando inserir linhas com object_id=0 e term_taxonomy_id=0 repetidamente.