Dotclear

source: plugins/importExport/inc/class.dc.import.wp.php @ 3606:bacbc979195e

Revision 3606:bacbc979195e, 23.4 KB checked in by franck <carnet.franck.paul@…>, 8 years ago (diff)

Revert back from 191 to 255 chars (as utf8mb4 MySQL is only available with 5.7+ server, assuming large-prefix and barracuda), addresses #1278

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of importExport, a plugin for DotClear2.
5#
6# Copyright (c) 2003-2012 Olivier Meunier & Association Dotclear
7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12if (!defined('DC_RC_PATH')) { return; }
13
14class dcImportWP extends dcIeModule
15{
16     protected $con;
17     protected $prefix;
18     protected $blog_id;
19
20     protected $action = null;
21     protected $step = 1;
22
23     protected $post_offset = 0;
24     protected $post_limit = 20;
25     protected $post_count = 0;
26
27     protected $has_table = array();
28
29     protected $vars;
30     protected $base_vars = array(
31          'db_host' => '',
32          'db_name' => '',
33          'db_user' => '',
34          'db_pwd' => '',
35          'db_prefix' => 'wp_',
36          'ignore_first_cat' => 1,
37          'cat_import' => 1,
38          'cat_as_tags' => '',
39          'cat_tags_prefix' => 'cat: ',
40          'post_limit' => 20,
41          'post_formater' => 'xhtml',
42          'comment_formater' => 'xhtml',
43          'user_ids' => array(),
44          'cat_ids' => array(),
45          'permalink_template' => 'p=%post_id%',
46          'permalink_tags' => array(
47               '%year%',
48               '%monthnum%',
49               '%day%',
50               '%hour%',
51               '%minute%',
52               '%second%',
53               '%postname%',
54               '%post_id%',
55               '%category%',
56               '%author%'
57          )
58     );
59     protected $formaters;
60
61     protected function setInfo()
62     {
63          $this->type = 'import';
64          $this->name = __('WordPress import');
65          $this->description = __('Import a WordPress installation into your current blog.');
66     }
67
68     public function init()
69     {
70          $this->con =& $this->core->con;
71          $this->prefix = $this->core->prefix;
72          $this->blog_id = $this->core->blog->id;
73
74          if (!isset($_SESSION['wp_import_vars'])) {
75               $_SESSION['wp_import_vars'] = $this->base_vars;
76          }
77          $this->vars =& $_SESSION['wp_import_vars'];
78
79          if ($this->vars['post_limit'] > 0) {
80               $this->post_limit = $this->vars['post_limit'];
81          }
82
83          $this->formaters = dcAdminCombos::getFormatersCombo();
84     }
85
86     public function resetVars()
87     {
88          $this->vars = $this->base_vars;;
89          unset($_SESSION['wp_import_vars']);
90     }
91
92     public function process($do)
93     {
94          $this->action = $do;
95     }
96
97     # We handle process in another way to always display something to
98     # user
99     protected function guiprocess($do)
100     {
101          switch ($do)
102          {
103               case 'step1':
104                    $this->vars['db_host'] = $_POST['db_host'];
105                    $this->vars['db_name'] = $_POST['db_name'];
106                    $this->vars['db_user'] = $_POST['db_user'];
107                    $this->vars['db_pwd'] = $_POST['db_pwd'];
108                    $this->vars['db_prefix'] = $_POST['db_prefix'];
109                    $this->vars['ignore_first_cat'] = isset($_POST['ignore_first_cat']);
110                    $this->vars['cat_import'] = isset($_POST['cat_import']);
111                    $this->vars['cat_as_tags'] = isset($_POST['cat_as_tags']);
112                    $this->vars['cat_tags_prefix'] = $_POST['cat_tags_prefix'];
113                    $this->vars['post_limit'] = abs((integer) $_POST['post_limit']) > 0 ? $_POST['post_limit'] : 0;
114                    $this->vars['post_formater'] = isset($this->formaters[$_POST['post_formater']]) ? $_POST['post_formater'] : 'xhtml';
115                    $this->vars['comment_formater'] = isset($this->formaters[$_POST['comment_formater']]) ? $_POST['comment_formater'] : 'xhtml';
116                    $db = $this->db();
117                    $db->close();
118                    $this->step = 2;
119                    echo $this->progressBar(1);
120                    break;
121               case 'step2':
122                    $this->step = 2;
123                    $this->importUsers();
124                    $this->step = 3;
125                    echo $this->progressBar(3);
126                    break;
127               case 'step3':
128                    $this->step = 3;
129                    $this->importCategories();
130                    if ($this->core->plugins->moduleExists('blogroll')) {
131                         $this->step = 4;
132                         echo $this->progressBar(5);
133                    } else {
134                         $this->step = 5;
135                         echo $this->progressBar(7);
136                    }
137                    break;
138               case 'step4':
139                    $this->step = 4;
140                    $this->importLinks();
141                    $this->step = 5;
142                    echo $this->progressBar(7);
143                    break;
144               case 'step5':
145                    $this->step = 5;
146                    $this->post_offset = !empty($_REQUEST['offset']) ? abs((integer) $_REQUEST['offset']) : 0;
147                    if ($this->importPosts($percent) === -1) {
148                         http::redirect($this->getURL().'&do=ok');
149                    } else {
150                         echo $this->progressBar(ceil($percent*0.93)+7);
151                    }
152                    break;
153               case 'ok':
154                    $this->resetVars();
155                    $this->core->blog->triggerBlog();
156                    $this->step = 6;
157                    echo $this->progressBar(100);
158                    break;
159          }
160     }
161
162     public function gui()
163     {
164          try {
165               $this->guiprocess($this->action);
166          } catch (Exception $e) {
167               $this->error($e);
168          }
169
170          switch ($this->step)
171          {
172               case 1:
173                    echo
174                    '<p>'.sprintf(__('This will import your WordPress content as new content in the current blog: %s.'),
175                    '<strong>'.html::escapeHTML($this->core->blog->name).'</strong>').'</p>'.
176                    '<p class="warning">'.__('Please note that this process '.
177                    'will empty your categories, blogroll, entries and comments on the current blog.').'</p>';
178
179                    printf($this->imForm(1,__('General information'),__('Import my blog now')),
180                    '<p>'.__('We first need some information about your old WordPress installation.').'</p>'.
181                    '<p><label for="db_host">'.__('Database Host Name:').'</label> '.
182                    form::field('db_host',30,255,html::escapeHTML($this->vars['db_host'])).'</p>'.
183                    '<p><label for="db_name">'.__('Database Name:',html::escapeHTML($this->vars['db_name'])).'</label> '.
184                    form::field('db_name',30,255,html::escapeHTML($this->vars['db_name'])).'</p>'.
185                    '<p><label for="db_user">'.__('Database User Name:').'</label> '.
186                    form::field('db_user',30,255,html::escapeHTML($this->vars['db_user'])).'</p>'.
187                    '<p><label for="db_pwd">'.__('Database Password:').'</label> '.
188                    form::password('db_pwd',30,255).'</p>'.
189                    '<p><label for="db_prefix">'.__('Database Tables Prefix:').'</label> '.
190                    form::field('db_prefix',30,255,html::escapeHTML($this->vars['db_prefix'])).'</p>'.
191
192                    '<h3 class="vertical-separator">'.__('Entries import options').'</h3>'.
193                    '<div class="two-cols">'.
194
195                    '<div class="col">'.
196                    '<p>'.__('WordPress and Dotclear\'s handling of categories are quite different. '.
197                    'You can assign several categories to a single post in WordPress. In the Dotclear world, '.
198                    'we see it more like "One category, several tags." Therefore Dotclear can only import one '.
199                    'category per post and will chose the lowest numbered one. If you want to keep a trace of '.
200                    'every category, you can import them as tags, with an optional prefix.').'</p>'.
201                    '<p>'.__('On the other hand, in WordPress, a post can not be uncategorized, and a '.
202                    'default installation has a first category labelised <i>"Uncategorized"</i>.'.
203                    'If you did not change that category, you can just ignore it while '.
204                    'importing your blog, as Dotclear allows you to actually keep your posts '.
205                    'uncategorized.').'</p>'.
206                    '</div>'.
207
208                    '<div class="col">'.
209                    '<p><label for="ignore_first_cat" class="classic">'.form::checkbox('ignore_first_cat',1,$this->vars['ignore_first_cat']).' '.
210                    __('Ignore the first category:').'</label></p>'.
211                    '<p><label for="cat_import" class="classic">'.form::checkbox('cat_import',1,$this->vars['cat_import']).' '.
212                    __('Import lowest numbered category on posts:').'</label></p>'.
213                    '<p><label for="cat_as_tags" class="classic">'.form::checkbox('cat_as_tags',1,$this->vars['cat_as_tags']).' '.
214                    __('Import all categories as tags:').'</label></p>'.
215                    '<p><label for="cat_tags_prefix">'.__('Prefix such tags with:').'</label> '.
216                    form::field('cat_tags_prefix',10,20,html::escapeHTML($this->vars['cat_tags_prefix'])).'</p>'.
217                    '<p><label for="post_limit">'.__('Number of entries to import at once:').'</label> '.
218                    form::field('post_limit',3,3,html::escapeHTML($this->vars['post_limit'])).'</p>'.
219                    '</div>'.
220
221                    '</div>'.
222
223                    '<h3 class="clear vertical-separator">'.__('Content filters').'</h3>'.
224                    '<p>'.__('You may want to process your post and/or comment content with the following filters.').'</p>'.
225                    '<p><label for="post_formater">'.__('Post content formatter:').'</label> '.
226                    form::combo('post_formater',$this->formaters,$this->vars['post_formater']).'</p>'.
227                    '<p><label for="comment_formater">'.__('Comment content formatter:').'</label> '
228                    .form::combo('comment_formater',$this->formaters,$this->vars['comment_formater']).'</p>'
229                    );
230                    break;
231               case 2:
232                    printf($this->imForm(2,__('Importing users')),
233                         $this->autoSubmit()
234                    );
235                    break;
236               case 3:
237                    printf($this->imForm(3,__('Importing categories')),
238                         $this->autoSubmit()
239                    );
240                    break;
241               case 4:
242                    printf($this->imForm(4,__('Importing blogroll')),
243                         $this->autoSubmit()
244                    );
245                    break;
246               case 5:
247                    $t = sprintf(__('Importing entries from %d to %d / %d'),$this->post_offset,
248                         min(array($this->post_offset+$this->post_limit,$this->post_count)),$this->post_count);
249                    printf($this->imForm(5,$t),
250                         form::hidden(array('offset'),$this->post_offset).
251                         $this->autoSubmit()
252                    );
253                    break;
254               case 6:
255                    echo
256                    '<p class="message">'.__('Every newly imported user has received a random password '.
257                    'and will need to ask for a new one by following the "I forgot my password" link on the login page '.
258                    '(Their registered email address has to be valid.)').'</p>'.
259                    $this->congratMessage();
260                    break;
261          }
262     }
263
264     # Simple form for step by step process
265     protected function imForm($step,$legend,$submit_value=null)
266     {
267          if (!$submit_value) {
268               $submit_value = __('next step').' >';
269          }
270
271          return
272          '<form action="'.$this->getURL(true).'" method="post">'.
273          '<h3 class="vertical-separator">'.$legend.'</h3>'.
274          '<div>'.$this->core->formNonce().
275          form::hidden(array('do'),'step'.$step).
276          '%s'.'</div>'.
277          '<p><input type="submit" value="'.$submit_value.'" /></p>'.
278          '<p class="form-note info">'.__('Depending on the size of your blog, it could take a few minutes.').'</p>'.
279          '</form>';
280     }
281
282     # Error display
283     protected function error($e)
284     {
285          echo '<div class="error"><strong>'.__('Errors:').'</strong>'.
286          '<p>'.$e->getMessage().'</p></div>';
287     }
288
289     # Database init
290     protected function db()
291     {
292          $db = dbLayer::init('mysql',$this->vars['db_host'],$this->vars['db_name'],$this->vars['db_user'],$this->vars['db_pwd']);
293
294          $rs = $db->select("SHOW TABLES LIKE '".$this->vars['db_prefix']."%'");
295          if ($rs->isEmpty()) {
296               throw new Exception(__('WordPress tables not found'));
297          }
298
299          while ($rs->fetch()) {
300               $this->has_table[$rs->f(0)] = true;
301          }
302
303          # Set this to read data as they were written
304          try {
305               $db->execute('SET NAMES DEFAULT');
306          } catch (Exception $e) {}
307
308          $db->execute('SET CHARACTER SET DEFAULT');
309          $db->execute("SET COLLATION_CONNECTION = DEFAULT");
310          $db->execute("SET COLLATION_SERVER = DEFAULT");
311          $db->execute("SET CHARACTER_SET_SERVER = DEFAULT");
312          $db->execute("SET CHARACTER_SET_DATABASE = DEFAULT");
313
314          $this->post_count = $db->select(
315               'SELECT COUNT(ID) FROM '.$this->vars['db_prefix'].'posts '.
316               'WHERE post_type = \'post\' OR post_type = \'page\''
317          )->f(0);
318
319          return $db;
320     }
321
322     protected function cleanStr($str)
323     {
324          return text::cleanUTF8(@text::toUTF8($str));
325     }
326
327     # Users import
328     protected function importUsers()
329     {
330          $db = $this->db();
331          $prefix = $this->vars['db_prefix'];
332          $rs = $db->select('SELECT * FROM '.$prefix.'users');
333
334          try
335          {
336               $this->con->begin();
337
338               while ($rs->fetch())
339               {
340                    $user_login = preg_replace('/[^A-Za-z0-9@._-]/','-',$rs->user_login);
341                    $this->vars['user_ids'][$rs->ID] = $user_login;
342                    if (!$this->core->userExists($user_login))
343                    {
344                         $cur = $this->con->openCursor($this->prefix.'user');
345                         $cur->user_id          = $user_login;
346                         $cur->user_pwd         = crypt::createPassword();
347                         $cur->user_displayname = $rs->user_nicename;
348                         $cur->user_email       = $rs->user_email;
349                         $cur->user_url         = $rs->user_url;
350                         $cur->user_creadt      = $rs->user_registered;
351                         $cur->user_lang        = $this->core->blog->settings->system->lang;
352                         $cur->user_tz          = $this->core->blog->settings->system->blog_timezone;
353                         $permissions           = array();
354
355                         $rs_meta = $db->select('SELECT * FROM '.$prefix.'usermeta WHERE user_id = '.$rs->ID);
356                         while ($rs_meta->fetch())
357                         {
358                              switch ($rs_meta->meta_key)
359                              {
360                                   case 'first_name':
361                                        $cur->user_firstname     = $this->cleanStr($rs_meta->meta_value);
362                                        break;
363                                   case 'last_name':
364                                        $cur->user_name     = $this->cleanStr($rs_meta->meta_value);
365                                        break;
366                                   case 'description':
367                                        $cur->user_desc     = $this->cleanStr($rs_meta->meta_value);
368                                        break;
369                                   case 'rich_editing':
370                                        $cur->user_options  = new ArrayObject(array(
371                                             'enable_wysiwyg' => $rs_meta->meta_value == 'true' ? true : false
372                                             ));
373                                        break;
374                                   case 'wp_user_level':
375                                        switch ($rs_meta->meta_value)
376                                        {
377                                             case '0': # Subscriber
378                                                  $cur->user_status = 0;
379                                                  break;
380                                             case '1': # Contributor
381                                                  $permissions['usage'] = true;
382                                                  $permissions['publish'] = true;
383                                                  $permissions['delete'] = true;
384                                                  break;
385                                             case '2': # Author
386                                             case '3':
387                                             case '4':
388                                                  $permissions['contentadmin'] = true;
389                                                  $permissions['media'] = true;
390                                                  break;
391                                             case '5': # Editor
392                                             case '6':
393                                             case '7':
394                                                  $permissions['contentadmin'] = true;
395                                                  $permissions['categories'] = true;
396                                                  $permissions['media_admin'] = true;
397                                                  $permissions['pages'] = true;
398                                                  $permissions['blogroll'] = true;
399                                                  break;
400                                             case '8':  # Administrator
401                                             case '9':
402                                             case '10':
403                                                  $permissions['admin'] = true;
404                                                  break;
405                                        }
406                                        break;
407                              }
408                         }
409                         $this->core->addUser($cur);
410                         $this->core->setUserBlogPermissions(
411                              $cur->user_id,
412                              $this->blog_id,
413                              $permissions
414                         );
415                    }
416               }
417               $this->con->commit();
418               $db->close();
419          }
420          catch (Exception $e)
421          {
422               $this->con->rollback();
423               $db->close();
424               throw $e;
425          }
426     }
427
428     # Categories import
429     protected function importCategories()
430     {
431          $db = $this->db();
432          $prefix = $this->vars['db_prefix'];
433          $rs = $db->select(
434               'SELECT * FROM '.$prefix.'terms AS t, '.$prefix.'term_taxonomy AS x '.
435               'WHERE x.taxonomy = \'category\' '.
436               'AND t.term_id = x.term_id '.
437               ($this->vars['ignore_first_cat'] ? 'AND t.term_id <> 1 ' : '').
438               'ORDER BY t.term_id ASC'
439          );
440
441          try
442          {
443               $this->con->execute(
444                    'DELETE FROM '.$this->prefix.'category '.
445                    "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "
446               );
447
448               $ord = 2;
449               while ($rs->fetch())
450               {
451                    $cur = $this->con->openCursor($this->prefix.'category');
452                    $cur->blog_id      = $this->blog_id;
453                    $cur->cat_title    = $this->cleanStr($rs->name);
454                    $cur->cat_desc     = $this->cleanStr($rs->description);
455                    $cur->cat_url      = $this->cleanStr($rs->slug);
456                    $cur->cat_lft      = $ord++;
457                    $cur->cat_rgt      = $ord++;
458
459                    $cur->cat_id = $this->con->select(
460                         'SELECT MAX(cat_id) FROM '.$this->prefix.'category'
461                         )->f(0) + 1;
462                    $this->vars['cat_ids'][$rs->term_id] = $cur->cat_id;
463                    $cur->insert();
464               }
465
466               $db->close();
467          }
468          catch (Exception $e)
469          {
470               $db->close();
471               throw $e;
472          }
473     }
474
475     # Blogroll import
476     protected function importLinks()
477     {
478          $db = $this->db();
479          $prefix = $this->vars['db_prefix'];
480          $rs = $db->select('SELECT * FROM '.$prefix.'links ORDER BY link_id ASC');
481
482          try
483          {
484               $this->con->execute(
485                    'DELETE FROM '.$this->prefix.'link '.
486                    "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "
487               );
488
489               while ($rs->fetch())
490               {
491                    $cur = $this->con->openCursor($this->prefix.'link');
492                    $cur->blog_id       = $this->blog_id;
493                    $cur->link_href     = $this->cleanStr($rs->link_url);
494                    $cur->link_title    = $this->cleanStr($rs->link_name);
495                    $cur->link_desc     = $this->cleanStr($rs->link_description);
496                    $cur->link_xfn      = $this->cleanStr($rs->link_rel);
497
498                    $cur->link_id = $this->con->select(
499                         'SELECT MAX(link_id) FROM '.$this->prefix.'link'
500                         )->f(0) + 1;
501                    $cur->insert();
502               }
503
504               $db->close();
505          }
506          catch (Exception $e)
507          {
508               $db->close();
509               throw $e;
510          }
511     }
512
513     # Entries import
514     protected function importPosts(&$percent)
515     {
516          $db = $this->db();
517          $prefix = $this->vars['db_prefix'];
518
519          $plink = $db->select(
520                    'SELECT option_value FROM '.$prefix.'options '.
521                    "WHERE option_name = 'permalink_structure'"
522               )->option_value;
523          if ($plink) {
524               $this->vars['permalink_template'] = substr($plink,1);
525          }
526
527          $rs = $db->select(
528               'SELECT * FROM '.$prefix.'posts '.
529               'WHERE post_type = \'post\' OR post_type = \'page\' '.
530               'ORDER BY ID ASC '.
531               $db->limit($this->post_offset,$this->post_limit)
532          );
533
534          try
535          {
536               if ($this->post_offset == 0)
537               {
538                    $this->con->execute(
539                         'DELETE FROM '.$this->prefix.'post '.
540                         "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "
541                    );
542               }
543
544               while ($rs->fetch()) {
545                    $this->importPost($rs,$db);
546               }
547
548               $db->close();
549          }
550          catch (Exception $e)
551          {
552               $db->close();
553               throw $e;
554          }
555
556          if ($rs->count() < $this->post_limit) {
557               return -1;
558          } else {
559               $this->post_offset += $this->post_limit;
560          }
561
562          if ($this->post_offset > $this->post_count) {
563               $percent = 100;
564          } else {
565               $percent = $this->post_offset * 100 / $this->post_count;
566          }
567     }
568
569     protected function importPost($rs,$db)
570     {
571          $post_date = !@strtotime($rs->post_date) ? '1970-01-01 00:00' : $rs->post_date;
572          if (!isset($this->vars['user_ids'][$rs->post_author])) {
573               $user_id = $this->core->auth->userID();
574          } else {
575               $user_id = $this->vars['user_ids'][$rs->post_author];
576          }
577
578          $cur = $this->con->openCursor($this->prefix.'post');
579          $cur->blog_id     = $this->blog_id;
580          $cur->user_id     = $user_id;
581          $cur->post_dt     = $post_date;
582          $cur->post_creadt = $post_date;
583          $cur->post_upddt  = $rs->post_modified;
584          $cur->post_title  = $this->cleanStr($rs->post_title);
585
586          if (!$cur->post_title) {
587               $cur->post_title = 'No title';
588          }
589
590          if ($this->vars['cat_import'] || $this->vars['cat_as_tags'])
591          {
592               $old_cat_ids = $db->select(
593                    'SELECT * FROM '.$this->vars['db_prefix'].'terms AS t, '.
594                    $this->vars['db_prefix'].'term_taxonomy AS x, '.
595                    $this->vars['db_prefix'].'term_relationships AS r '.
596                    'WHERE t.term_id = x.term_id '.
597                    ($this->vars['ignore_first_cat'] ? 'AND t.term_id <> 1 ' : '').
598                    'AND x.taxonomy = \'category\' '.
599                    'AND t.term_id = r.term_taxonomy_id '.
600                    'AND r.object_id ='.$rs->ID.
601                    ' ORDER BY t.term_id ASC '
602                    );
603               if (!$old_cat_ids->isEmpty() && $this->vars['cat_import'])
604               {
605                    $cur->cat_id = $this->vars['cat_ids'][(integer) $old_cat_ids->term_id];
606               }
607          }
608
609          $permalink_infos = array(
610               date('Y',strtotime($cur->post_dt)),
611               date('m',strtotime($cur->post_dt)),
612               date('d',strtotime($cur->post_dt)),
613               date('H',strtotime($cur->post_dt)),
614               date('i',strtotime($cur->post_dt)),
615               date('s',strtotime($cur->post_dt)),
616               $rs->post_name,
617               $rs->ID,
618               $cur->cat_id,
619               $cur->user_id
620          );
621          $cur->post_url = str_replace(
622               $this->vars['permalink_tags'],
623               $permalink_infos,
624               $rs->post_type== 'post' ? $this->vars['permalink_template'] : '%postname%'
625          );
626          $cur->post_url = substr($cur->post_url,0,255);
627
628          if (!$cur->post_url) {
629               $cur->post_url = $rs->ID;
630          }
631
632          $cur->post_format = $this->vars['post_formater'];
633          $_post_content = explode('<!--more-->',$rs->post_content,2);
634          if (count($_post_content) == 1) {
635               $cur->post_excerpt = NULL;
636               $cur->post_content = $this->cleanStr(array_shift($_post_content));
637          } else {
638               $cur->post_excerpt = $this->cleanStr(array_shift($_post_content));
639               $cur->post_content = $this->cleanStr(array_shift($_post_content));
640          }
641
642          $cur->post_content_xhtml = $this->core->callFormater($this->vars['post_formater'],$cur->post_content);
643          $cur->post_excerpt_xhtml = $this->core->callFormater($this->vars['post_formater'],$cur->post_excerpt);
644
645          switch ($rs->post_status)
646          {
647               case 'publish':
648                    $cur->post_status = 1;
649                    break;
650               case 'draft':
651                    $cur->post_status = 0;
652                    break;
653               case 'pending':
654                    $cur->post_status = -2;
655                    break;
656               default:
657                    $cur->post_status = -2;
658          }
659          $cur->post_type         = $rs->post_type;
660          $cur->post_password     = $rs->post_password ?: NULL;
661          $cur->post_open_comment = $rs->comment_status == 'open' ? 1 : 0;
662          $cur->post_open_tb      = $rs->ping_status == 'open' ? 1 : 0;
663
664          $cur->post_words = implode(' ',text::splitWords(
665               $cur->post_title.' '.
666               $cur->post_excerpt_xhtml.' '.
667               $cur->post_content_xhtml
668          ));
669
670          $cur->post_id = $this->con->select(
671               'SELECT MAX(post_id) FROM '.$this->prefix.'post'
672               )->f(0) + 1;
673
674          $cur->post_url = $this->core->blog->getPostURL($cur->post_url,$cur->post_dt,$cur->post_title,$cur->post_id);
675
676          $cur->insert();
677          $this->importComments($rs->ID,$cur->post_id,$db);
678          $this->importPings($rs->ID,$cur->post_id,$db);
679
680          # Create tags
681          $this->importTags($rs->ID,$cur->post_id,$db);
682
683          if (isset($old_cat_ids))
684          {
685               if (!$old_cat_ids->isEmpty() && $this->vars['cat_as_tags'])
686               {
687                    $old_cat_ids->moveStart();
688                    while ($old_cat_ids->fetch()) {
689                         $this->core->meta->setPostMeta($cur->post_id,'tag',$this->cleanStr($this->vars['cat_tags_prefix'].$old_cat_ids->name));
690                    }
691               }
692          }
693     }
694
695     # Comments import
696     protected function importComments($post_id,$new_post_id,$db)
697     {
698          $count_c = $count_t = 0;
699
700          $rs = $db->select(
701               'SELECT * FROM '.$this->vars['db_prefix'].'comments '.
702               'WHERE comment_post_ID = '.(integer) $post_id.' '
703               );
704
705          while ($rs->fetch())
706          {
707               $cur = $this->con->openCursor($this->prefix.'comment');
708               $cur->post_id           = (integer) $new_post_id;
709               $cur->comment_author    = $this->cleanStr($rs->comment_author);
710               $cur->comment_status    = (integer) $rs->comment_approved ;
711               $cur->comment_dt        = $rs->comment_date;
712               $cur->comment_email     = $this->cleanStr($rs->comment_author_email);
713               $cur->comment_content   = $this->core->callFormater($this->vars['comment_formater'],$this->cleanStr($rs->comment_content));
714               $cur->comment_ip        = $rs->comment_author_IP;
715               $cur->comment_trackback       = $rs->comment_type == 'trackback' ? 1 : 0;
716               $cur->comment_site = substr($this->cleanStr($rs->comment_author_url),0,255);
717               if ($cur->comment_site == '') $cur->comment_site = NULL;
718
719               if ($rs->comment_approved == 'spam') {
720                    $cur->comment_status = -2;
721               }
722
723               $cur->comment_words = implode(' ',text::splitWords($cur->comment_content));
724
725               $cur->comment_id = $this->con->select(
726                    'SELECT MAX(comment_id) FROM '.$this->prefix.'comment'
727               )->f(0) + 1;
728
729               $cur->insert();
730
731               if ($cur->comment_trackback && $cur->comment_status == 1) {
732                    $count_t++;
733               } elseif ($cur->comment_status == 1) {
734                    $count_c++;
735               }
736          }
737
738          if ($count_t > 0 || $count_c > 0)
739          {
740               $this->con->execute(
741                    'UPDATE '.$this->prefix.'post SET '.
742                    'nb_comment = '.$count_c.', '.
743                    'nb_trackback = '.$count_t.' '.
744                    'WHERE post_id = '.(integer) $new_post_id.' '
745               );
746          }
747     }
748
749     # Pings import
750     protected function importPings($post_id,$new_post_id,$db)
751     {
752          $urls = array();
753          $pings = array();
754
755          $rs = $db->select(
756               'SELECT pinged FROM '.$this->vars['db_prefix'].'posts '.
757               'WHERE ID = '.(integer) $post_id
758               );
759          $pings = explode ("\n",$rs->pinged);
760          unset ($pings[0]);
761
762          foreach($pings as $ping_url)
763          {
764               $url = $this->cleanStr($ping_url);
765               if (isset($urls[$url])) {
766                    continue;
767               }
768
769               $cur = $this->con->openCursor($this->prefix.'ping');
770               $cur->post_id = (integer) $new_post_id;
771               $cur->ping_url = $url;
772               $cur->insert();
773
774               $urls[$url] = true;
775          }
776     }
777
778     # Meta import
779     protected function importTags($post_id,$new_post_id,$db)
780     {
781          $rs = $db->select(
782               'SELECT * FROM '.$this->vars['db_prefix'].'terms AS t, '.
783               $this->vars['db_prefix'].'term_taxonomy AS x, '.
784               $this->vars['db_prefix'].'term_relationships AS r '.
785               'WHERE t.term_id = x.term_id '.
786               'AND x.taxonomy = \'post_tag\' '.
787               'AND t.term_id = r.term_taxonomy_id '.
788               'AND r.object_id ='.$post_id.
789               ' ORDER BY t.term_id ASC'
790          );
791
792          if ($rs->isEmpty()) {
793               return;
794          }
795
796          while ($rs->fetch()) {
797               $this->core->meta->setPostMeta($new_post_id,'tag',$this->cleanStr($rs->name));
798          }
799     }
800}
Note: See TracBrowser for help on using the repository browser.

Sites map