File: /var/www/html/wp-content/plugins/kboard/class/KBBackup.class.php
<?php
/**
* KBoard 데이터 백업 및 복구
* @link www.cosmosfarm.com
* @copyright Copyright 2021 Cosmosfarm. All rights reserved.
* @license http://www.gnu.org/licenses/gpl.html
*/
class KBBackup {
/**
* KBoard 테이블 목록을 반환한다.
* @return array
*/
public function getTables(){
global $wpdb;
$tables = array();
$tables_result = $wpdb->get_results('SHOW TABLES', ARRAY_N);
foreach($tables_result as $table){
if(strpos($table[0], "{$wpdb->prefix}kboard_") !== false) $tables[] = $table[0];
}
return $tables;
}
/**
* 테이블 sql 테이터를 생성한다.
* @param string $table
* @return string
*/
public function getSql($table){
global $wpdb;
$result = $wpdb->get_results("SELECT * FROM `$table`", ARRAY_N);
$sql = "TRUNCATE TABLE `$table`;\n";
foreach($result as $row){
$columns = count($row);
$sql .= "INSERT INTO `$table` VALUE (";
for($i=0; $i<$columns; $i++){
if($row[$i]) $value[] = "'$row[$i]'";
else $value[] = "''";
}
$value = implode(',', $value);
$sql .= "$value);\n";
}
return $sql;
}
/**
* 테이블 xml 테이터를 생성한다.
* @param string $table
* @return string
*/
public function getXml($table){
global $wpdb;
$result = $wpdb->get_results("SELECT * FROM `$table`", ARRAY_A);
// 테이블 이름에서 PREFIX를 지운다.
$table = str_replace($wpdb->prefix, '', $table);
$xml = "<$table>\n";
foreach($result as $row){
$xml .= "\t<data>\n";
foreach($row as $key => $value){
$xml .= "\t\t<$key>";
$xml .= "<![CDATA[".stripslashes($value)."]]>";
$xml .= "</$key>\n";
}
$xml .= "\t</data>\n";
}
$xml .= "</$table>\n";
return $xml;
}
/**
* 데이터 파일을 다운로드 받는다.
* @param string $data
* @param string $file
* @param string $filename
*/
public function download($data, $file='xml', $filename=''){
if(!$filename){
$ymd = date('Ymd', current_time('timestamp'));
$filename = "KBoard-Backup-{$ymd}.{$file}";
}
header("Content-Type: ".kboard_mime_type($filename));
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Pragma: no-cache");
Header("Expires: 0");
@ob_clean();
@flush();
if($file == 'xml'){
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
echo "<kboard>\n";
echo $data;
echo "</kboard>";
}
else{
echo $data;
}
exit;
}
/**
* XML 복원파일을 입력받아 기존 데이터를 비우고 DB에 입력한다.
* @param string $file
*/
public function importXml($file){
global $wpdb;
include 'XML2Array.class.php';
$xml = file_get_contents($file);
$xml = trim($xml);
$array = XML2Array::createArray($xml);
foreach($array['kboard'] as $table=>$rows){
// 테이블에 입력될 데이터가 한 개인지 여러개 인지 확인한다.
if(isset($rows['data']) && is_array($rows['data'])){
$keys = array_keys($rows['data']);
if(reset($keys) == '0') $data = $rows['data'];
else $data = $rows;
}
else{
$data = $rows;
}
if($data){
// 테이블 이름에 PREFIX를 추가 한다.
$table = $wpdb->prefix.$table;
// 새로 생성될 테이블을 비운다.
$wpdb->query("TRUNCATE TABLE `$table`");
// 새로운 content를 입력하기 위해서 posts테이블에 입력된 content를 삭제한다.
if(stristr($table, 'kboard_board_content')) $wpdb->query("DELETE FROM `{$wpdb->prefix}posts` WHERE `post_type`='kboard'");
foreach($data as $key=>$row){
$keys = array_keys($row);
$row_count = count($row);
$columns = array();
for($i=0; $i<$row_count; $i++){
$columns[] = "`$keys[$i]`";
}
$columns = implode(',', $columns);
$value = array();
for($i=0; $i<$row_count; $i++){
$value[] = "'".esc_sql($row[$keys[$i]]['@cdata'])."'";
}
$value = implode(',', $value);
$wpdb->query("INSERT INTO `$table` ($columns) VALUES ($value)");
/*
* search 값이 있을경우 post 테이블에 내용을 입력한다.
*/
if(isset($row['search']) && ($row['search']['@cdata']==1 || $row['search']['@cdata']==2)){
if($wpdb->insert_id){
$kboard_post = array(
'post_author' => $row['member_uid']['@cdata'],
'post_title' => $row['title']['@cdata'],
'post_content' => ($row['secret']['@cdata']=='true' || $row['search']['@cdata']==2) ? '' : $row['content']['@cdata'],
'post_status' => 'publish',
'comment_status'=> 'closed',
'ping_status' => 'closed',
'post_name' => $wpdb->insert_id,
'post_parent' => $row['board_id']['@cdata'],
'post_type' => 'kboard'
);
wp_insert_post($kboard_post, true);
}
}
} // end foreach
}
} // end foreach
}
}
?>