Per quanto riguarda il motivo per cui non funziona:non impostare il terzo parametro di $wpdb->insert
per svuotare la stringa. Formatta ogni campo di conseguenza..
Quello che fa ora equivale a:
$wpdb->insert($table, array(
'object_id' => sprintf('', $num_object_id),
'term_taxonomy_id' => sprintf('', $num_taxo_id),
'term_order' => sprintf('', 0)
));
Se vuoi davvero impostare il terzo parametro dovresti fare:
$wpdb->insert($table, array(
'object_id' => $num_object_id,
'term_taxonomy_id' => $num_taxo_id,
'term_order' => 0
), array('%d', '%d', '%d'));
Per quanto riguarda l'errore:la tabella wp_term_relationships ha una chiave primaria univoca su (object_id, term_taxonomy_id). Ciò significa che non puoi avere due righe in quella tabella che hanno lo stesso object_id e term_taxonomy_id.
Anche se ciò è accaduto perché impostando il terzo parametro di inserimento su una stringa vuota, stai tentando di inserire righe con object_id=0 e term_taxonomy_id=0 più e più volte.