Попытка добавить записи в таблицу с MYSQL и php, с принудительным уникальным идентификатором - PullRequest
2 голосов
/ 12 декабря 2011

Я пытаюсь изменить сценарий, разработанный для импорта записей статей из базы данных Joomla (1.5.x) в таблицу Wordpress 3.2.1 для записей.Это скрипт, который переносит контент из Joomla в Wordpress.

Проблема, с которой я столкнулся при работе со скриптом, заключается в том, что он не поддерживает уникальный идентификатор («id» в Joomla и «ID» в Wordpress).Исходя из моего понимания, это значительно усложняет (гораздо больше работы) задачу перенаправления всех постоянных ссылок Joomla на новые (и, очевидно, другие) постоянные ссылки Wordpress.Если бы идентификатор был таким же в WP, как и в Joomla, тогда некоторых базовых правил перезаписи в htaccess было бы достаточно для выполнения перенаправлений.

Поэтому я хочу посмотреть, смогу ли я изменить код, чтобы заставить идентификатор довольночем это генерируется в последовательном порядке, поскольку записи вставляются в таблицу.

Сценарий, который я изменяю, доступен здесь: http://wordpress.org/extend/plugins/joomla-to-wordpress-migrator/ Файл, о котором идет речь, называется: joomla2wp-mig.php

Массив создается в строке 1049 и 1081. В строке 1049 это:

 $wp_posts[] = array(
        'ID' => $R->id,  //I ADDED THIS IN
        'post_author' => $user_id,
        'post_category' => array($wp_cat_id),
        'post_content' => $post_content, 
        'post_date' => $R->created,
        'post_date_gmt' => $R->created,
        'post_modified' => $R->modified,
        'post_modified_gmt' => $R->modified,
        'post_title' => $R->title,
        'post_status' => 'publish',
        'comment_status' => 'open',
        'ping_status' => 'open',
        'post_name' => $R->alias,
        'tags_input' => $R->metakey, 
        'post_type' => 'post'
      );

А в строке 1081:

 $array = array(
 "ID"        => $item['ID'],    //I ADDED THIS IN
 "post_author"       => $user_id,
 "post_parent"       => intval($wp_cat_id),
 "post_content"      => $item['post_content'],
 "post_date"         => $item['post_date'],
 "post_date_gmt"     => $item['post_date_gmt'],
 "post_modified"     => $item['post_modified'],
 "post_modified_gmt" => $item['post_modified_gmt'],
 "post_title"        => $item['post_title'],
 "post_status"       => $item['post_status'],
 "comment_status"    => $item['comment_status'],
 "ping_status"       => $item['ping_status'],
 "post_name"         => $item['post_name'],
 "post_type"         => $item['post_type']
      );

Я прокомментировалстрока ID, которую я добавил в верхнюю часть каждого из этих битов кода массива.

Команда INSERT выполняется вокруг строки 1097

Команда INSERT составляется следующим образом:

$insert_sql = "INSERT INTO " . $j2wp_wp_tb_prefix . "posts" . " set ";

$inserted = 0;
foreach ($array as $k => $v) 
{
  if($k AND $v) 
  {
    if($inserted > 0) 
      $insert_sql .= ",";
    $insert_sql .= " ".$k." = '".mysql_escape_string(str_replace("`","",$v))."'";
    ++$inserted;
  }
}    
$sql_query[] = $insert_sql;

}

Используется функция MYSQL INSERT INTO ... SET (в отличие от INSERT INTO ... VALUE )

Задача, с которой я столкнулся, такова: Массив diне включать идентификатор, поэтому я добавил это в.

После внесения этого изменения при запуске скрипта (в конце пользовательского интерфейса Wordpress) он заработает нормально, но записи не вставляются, дажехотя он говорит, что это было успешно.

Я обнаружил, что могу обойти эту проблему, настроив свежую таблицу wp_posts с Х числом пустых записей.Допустим, я импортирую 100 статей, затем я поместил бы 100 записей в таблицу, и они имели бы идентификатор от 1 до 100. Когда я запускаю свой модифицированный код, он будет радостно обновлять изаполнить эти существующие записи.Чего я не понимаю, так это того, почему он не будет создавать новые записи, когда я заставляю уникальный идентификатор (ID) получить то, что я хочу.

Мне интересно, нужно ли мне использовать INSERT INTO ... VALUE вместо INSERT INTO ... SET

Я собирался проверить это, но, честно говоря, я не программист и просто использую этокак я иду вместе.Поэтому я понятия не имел, как переписать PHP, чтобы реализовать структуру, необходимую для команды VALUE вместо SET .

Любая помощь или предложения будуточень признателен.

Я понял, что мне нужно переписать последний бит кода, который я предоставил выше.

На этом вопросе обсуждается форум поддержки WordPress .Один пользователь (spiff06) очень любезно помог мне решить проблему.Мы расстались с получением кода для вставки новых записей с принудительным идентификатором, и я пошел с тем, что мы назвали «грязной» опцией (это метод, который я упомянул выше ..., настроив таблицу с требуемым числомпустые записи).

Несмотря на то, что я использовал этот «грязный» метод для своего собственного сайта, я хочу, чтобы этот процесс работал корректно для других пользователей, которые используют Joomla 1.5.x и переходят наWP вместо обновления до новой версии Joomla (это большой процесс, поэтому многие просто прыгают с WP, как и я).

С огромным спасибо ...

Джонатан

Ответы [ 2 ]

0 голосов
/ 19 февраля 2012

Я никогда не находил действительно автоматизированный / скриптовый способ сделать это.В итоге я сделал обходной путь:

Пока я импортировал все свои сообщения "грязным" способом, предварительно заполнив таблицу.

МЕТОД РАБОТЫ ПРЕДПОСЫЛКИ Подготовьте таблицу wp_posts в базе данных WPс таким количеством записей, сколько вам нужно (посмотрите в Joomla, чтобы увидеть, сколько записей у вас есть).У меня было 398, поэтому я добавил 398 записей в wp_posts.

КАК?Я сделал это, экспортировав таблицу emtpy wp_posts в файл .csv.Затем я открыл это в Excel (Numbers, или OpenOffice также будет делать).В приложении электронных таблиц было легко выполнить автозаполнение от 1 до 398. В столбце ID.

Затем я повторно импортировал этот файл .csv в wp_posts.Это дало мне wp_posts с 398 строками записей с 1 до 398. В поле ID.

Затем я запустил версию 1.5.4 Mambo / Joomla to WordPress migrator, которую можно установить из WordPress.

Конечный результат?

Все записи имеют тот же идентификатор, что и оригинальные статьи Joomla.

0 голосов
/ 13 декабря 2011

Вы можете попробовать следующее:

  1. Изменение структуры импортированной таблицы mysql (post @ wordpress). Измените поле id, чтобы оно больше не было автоинкрементом поля. Пусть это просто целочисленное поле.

  2. Импорт значений. Таким образом, вы можете поместить любые значения в идентификатор поля без каких-либо ограничений.

  3. После импорта снова измените структуру таблицы, чтобы поле идентификатора снова стало автоинкрементом поля.

...