'field_color', // Fill these ... '' => '', '' => '', '' => '', ); // SECOND: CCK content_taxonomy fields that are configured to have MULTIPLE VALUES $vid_to_field_multivalue = array( // Example: you have a Vocabulary "Country" with vid = 2, and want to import that into fieldname field_country // '2' => 'field_country', // Fill these ... '' => '', '' => '', '' => '', ); /*********************************** ** END OF EDIT ME ** you (hopefully) don't need to change anything below this line. *********************************** */ if (intval($_GET["commit"]) != 1) { echo "

Build SQL file to migrate from core taxonomy into content_taxonomy

"; echo "Caution: This might take a while!"; exit; } header("Content-Type: text/plain"); header("Content-Disposition: attachment; filename=fix.sql"); $connection = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Couldn't connect!"); mysql_select_db($mysql_database) or die("Couldn't do mysql_select_db()"); /** * Create SQL to import single-valued CCK fields */ $values_to_set = array(); $vids = array(); foreach ($vid_to_field_singlevalue as $vocabulary => $fieldname) { // Get all terms assigned to nodes, ordered by node $result = mysql_query("SELECT TN.nid, TN.tid FROM ".$db_prefix."term_node TN, ".$db_prefix."term_data TD where TN.tid = TD.tid AND TD.vid = $vocabulary $where ORDER BY TN.nid $limit") or die("Could not query: " . mysql_error()); $prev_nid = 0; while( $data = mysql_fetch_object($result)) { // If nid is different than last, get its current vid and store it in $vids[] if ($data->nid != $prev_nid) { $vids[$data->nid] = get_vid_from_nid($data->nid); } // Store the values to set for this nid $values_to_set[$data->nid][] = "{$fieldname}_value=" . $data->tid; $prev_nid = $data->nid; } } ksort($values_to_set); // Print all updates per node foreach ($values_to_set as $nid => $values) { if ($vids[$nid]) { $string = implode(", ", $values); // e.g. "field_22_value = 22, field_21_value = 429, [...]" $sql = sprintf("UPDATE ".$db_prefix."content_type_$content_type SET $string WHERE nid=%d AND vid=%d;", $nid, $vids[$nid]); echo $sql ."\n"; } } echo "\n\n"; /** * Create SQL to import multiple-valued CCK fields */ foreach ($vid_to_field_multivalue as $vocabulary => $fieldname) { echo "## Multi value: vid=$vocabulary => fieldname=$fieldname\n"; // Get all terms assigned to nodes, ordered by node $result = mysql_query("SELECT TN.nid, TN.tid FROM ".$db_prefix."term_node TN, ".$db_prefix."term_data TD where TN.tid = TD.tid AND TD.vid = $vocabulary $where ORDER BY TN.nid $limit"); $prev_nid = 0; $tids = array(); while( $data = mysql_fetch_object($result)) { // If nid is different than last, get its last vid if ($data->nid != $prev_nid) { foreach ($tids as $delta => $tid) { $sql = sprintf("INSERT INTO ".$db_prefix."content_{$fieldname} (vid, delta, nid, {$fieldname}_value) VALUES (%d, %d, %d, %d)", $vid, $delta, $prev_nid, $tid); $sql .= " ON DUPLICATE KEY "; $sql .= sprintf("UPDATE {$fieldname}_value = %d",$tid); if ($vid) { echo $sql .";\n"; } } $vid = get_vid_from_nid($data->nid); $tids = array(); } $tids[] = $data->tid; $prev_nid = $data->nid; } foreach ($tids as $delta => $tid) { $sql = sprintf("INSERT INTO ".$db_prefix."content_{$fieldname} (vid, delta, nid, {$fieldname}_value) VALUES (%d, %d, %d, %d)", $vid, $delta, $prev_nid, $tid); $sql .= " ON DUPLICATE KEY "; $sql .= sprintf("UPDATE {$fieldname}_value = %d;",$tid); echo $sql ."\n"; } echo "\n\n"; } // Local functions... function get_vid_from_nid($nid) { global $db_prefix; static $vids = array(); if (isset($vids[$nid])) return $vids[$nid]; $result = mysql_query("SELECT vid FROM ". $db_prefix ."node WHERE nid=". $nid) or die("Could not get vid for nid = $nid"); if ($data = mysql_fetch_object($result)) { $vids[$nid] = $data->vid; return $data->vid; } else {$vids[$nid] = false; return false; } }