我的函数逻辑全错了,应该把结果排序出来$trans_array 在foreach循环之前。
如果有人需要,以下是有效的更新代码:
function rkm_translation_update() {
    global $wpdb;
    $trans_row = $wpdb->get_row("SELECT * FROM id_item_lid", OBJECT, 0);
    $id = $trans_row->id;
    $item = $trans_row->item_id;
    $lid = $trans_row->lid;
    $trans_array = $wpdb->get_results("SELECT * FROM id_item_lid ORDER BY item_id");
    foreach ($trans_array as $trans) {
        $id_new = $trans->id;
        $item_new = $trans->item_id;
        $lid_new = $trans->lid;
        if ($item === $item_new) {
            $wpdb->update(\'wp_icl_translations\', array(\'trid\' => $id, \'source_language_code\' => $lid), array(\'element_id\' => $id_new, \'element_type\' => \'post_post\'));
        } else {
             $id = $trans->id;
             $item = $trans->item_id;
             $lid = $trans->lid;
             $wpdb->update(\'wp_icl_translations\', array(\'trid\' => $id, \'source_language_code\' => $lid), array(\'element_id\' => $id, \'element_type\' => \'post_post\'));
        }
    }
}
 这是一个有点脏的解决方案,当调试是真的时,在管理中会有一些与原始post语言相关的警告,如果它丢失了,可能可以再细化一点,但我不介意。