如何使用$wpdb更新记录?

时间:2014-06-05 作者:Bojana Šekeljić

我正在将非wp数据库迁移到Wordpress(这是我有生以来第一次,希望也是最后一次)。

由于新旧网站都是多语言的,我的任务之一就是将文章与其翻译联系起来。我正在Wordpress上使用WPML插件来支持多语言。这个插件创建一个表,wp_icl_translations 结构如下:

element_id | trid       | language_code           | source_language_code
---------------------------------------------------------------------------
(post id)  | (group id) | (of the translated post)| (of the original post)
trid 是原始帖子id的id,并且一篇原始帖子的所有翻译对于trid. 如果帖子是原创的,trid 与相同element_id 这是post id,并且source_language_codeNULL.

在我的帖子上有几个注释:

并非所有帖子都翻译成所有语言(我有8种语言)

  • 在旧数据库中,有些帖子只有任何语言的原始条目item_id 这对于一篇文章的所有翻译都是一样的。当我迁移它们时,我添加了这个item_idmeta_value 对于每个帖子。我对语言代码也做了同样的操作,因此我能够创建一个自定义表,在该表中,我可以在wordpress数据库的post ID和旧数据库的item\\u ID和语言代码之间建立连接。此自定义表,id_item_lid, 具有以下结构:

    id                           | item_id                     | lid
    ---------------------------------------------------------------------------
    post id assigned by wordress | old item_id                 | language code
                                 | (translations share this id)|
    
    总之,我需要更新trid 第列,共列wp_icl_translations 使用共享相同的帖子的帖子IDitem_id 在里面id_item_lid 桌子

    下面是我想到的函数:

    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");
    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));
        } else {
            $id = $trans->id;
            $item = $trans->item_id;
            $lid = $trans->lid;
        }
    }
    }
    
    add_action( \'init\', \'rkm_translation_update\');
    
    它背后的想法是获取第一行的记录,并将其与下一行进行比较。但是,什么都没有发生。我第一次做这种数据库操作,所以我不知道从哪里开始调试。

    非常感谢您的帮助和指导。

    如果您需要更多信息,请随时询问。

    谢谢

  • 1 个回复
    SO网友:Bojana Šekeljić

    我的函数逻辑全错了,应该把结果排序出来$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语言相关的警告,如果它丢失了,可能可以再细化一点,但我不介意。

    结束