当前位置 : 主页 > 网络编程 > PHP >

WordPress插件的同步文章功能实现(未完成custom_fields,及希望的上传功能)(w

来源:互联网 收集:自由互联 发布时间:2021-06-28
WordPress同步插件的同步实现功能,未能够实现custom_fields的同步,未能实现非媒体库文件上传到非媒体库中。 get_row($sql,ARRAY_A);$seo_tab = $table_prefix."postmeta";$seo = "SELECT meta_key,meta_value FROM
WordPress同步插件的同步实现功能,未能够实现custom_fields的同步,未能实现非媒体库文件上传到非媒体库中。
 get_row($sql,ARRAY_A);
		$seo_tab = $table_prefix."postmeta";
		$seo = "SELECT meta_key,meta_value FROM $seo_tab WHERE post_id = $postId AND (meta_key LIKE '_aioseop_%')";
		$custom_fields = $wpdb->get_results($seo,ARRAY_A);
		$host = addslashes(site_url().'/');
		//设置远程站点信息
		$target = $server['host'];
		if ( '/' != substr( $target, -1 ) ) {
			$target .= '/';
		}
		$username = $server['user'];
		$password = $server['pass'];
		$result=sync_post($post,$username,$password,$target,$host,$custom_fields);
	}else{
		$result=array('status'=>500,'msg'=>$server['api']);
	}
	echo json_encode($result);
	
}else{
	echo json_encode(array('status'=>404,'msg'=>'No operation.'));
}

// 替换源站点附件
function replace_host($string,$target,$host){
	if('' == $target || '' == $host) return false;
	// 判断连接是否为图片,PDF附件等
	$allowedExts=array('jpeg','jpg','png','gif','txt','pdf');
	$pattern = "(http://[a-zA-Z0-9\./]+)";
	preg_match_all($pattern, $string, $urls);
	//如果源站点的附件等才替换,其他的不替换
	if(!empty($urls)&&!empty($urls[0])){
		foreach ($urls[0] as $v) {
			$ext = strtolower(pathinfo($v,PATHINFO_EXTENSION));
			if(in_array($ext, $allowedExts)){
				$tmp=preg_replace('('.$host.')',$target,$v);
				// echo $tmp."\r\n";
				$string=str_replace($v,$tmp,$string);//替换掉附件的url域名,非附件不替换
				// echo $v."\r\n";
				// $string = $tmp;
			}
		}
	}
	// echo $string;
	return $string;
	//测试
	// return preg_replace('('.$host.')',$target,$string);
}
/**
 * 远程同步文章(A->B)
 * @param  array  $post         需要同步的文章信息
 * @param  string $user         同步站点的用户(登录用)
 * @param  string $pass         同步站点的用户的登陆密码
 * @param  string $target       目标站点域名(同步站点)
 * @param  string $host         来源站点域名(本站点)
 * @param  array  $custom_fields 需要同步的自定义字段
 * @return array               返回消息记录(成功200失败400)
 */
function sync_post($post,$user,$pass,$target,$host,$custom_fields){
	
	$xmlrpcurl=$target.'xmlrpc.php';
	$blogid=get_current_blog_id();
	$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
	$client = new IXR_Client($xmlrpcurl);
	//先获取文章主体内容,用于上传内容中的附件
	$file=$post['post_content'];
	// $post['post_content']=replace_host($post['post_content'],$target,$host);//替换成目标站点url
	$post['guid']='';
	if(!empty($custom_fields)){//如果用户自定义非空,则添加到$post中
		$cs_fields=array();
		foreach ($custom_fields as $k => $v) {
			$tmp_fields['key']=$v['meta_key'];
			$tmp_fields['value']=$v['meta_value'];
			// $tmp_fields=array($v['meta_key'],$v['meta_value']);
			$cs_fields[]=$tmp_fields;
			
		}
		$post['custom_fields']=$cs_fields;
		
		// $post['custom_fields']=array(array('key' => '_aioseop_title', 'value' => '还是测试'));
	}
	// 新的文章则进行新增,否则修改 
	$target_id = get_option("target_postid_".$post['ID']);
	if(!$target_id){
		
		$client->query("wp.newPost",$blogid,$user,$pass,$post);
		$response=$client->getResponse();
		// 成功后设置
		if ($response['faultCode']==0){
			if( is_a( $client->message, '\IXR_Message' ) ){
				// 需要设置 target_postid_{the_ID} => 返回的post_id
				if(!$client->message->message->params[0]){//如果无法获取post_id,则根据返回的xml获取
					if(preg_match('/
 
  (\d+)<\/string>/', $client->message->message,$rs)){
						//如果正则匹配成功
						if(!empty($rs)&&!empty($rs[1])){
							update_option("target_postid_".$post['ID'],$rs[1]);
							/*if(!empty($custom_fields)){//同步SEO元素
								foreach ($custom_fields as $k => $v) {
									
								}
							}*/
						}
					}
				}else{
					update_option("target_postid_".$post['ID'],$client->message->message->params[0]);
				}
			}
			$msg = "The article uploaded successfully.";
			$result=update_media($file,$target,$host,$user,$pass);
			$is_true=200;  	
		} else {
			$is_true=400;//文章同步失败
		   	$msg = 'Fail:' . $response['faultString'];
		}
	}else{//echo "yes";
		$post['ID'] = intval($target_id);//换成目标网站的文章id
		$post['post_modified'] = $post['post_modified_gmt'] = date("Y-m-d H:i:s");
		// 需要修改的字段
		$content = array(
			'post_status' => $post['post_status'],//文章状态
			'post_title' => $post['post_title'],//标题
			'post_excerpt' => $post['post_excerpt'],//摘要
			'post_content' => $post['post_content'],//正文
			'post_name' => $post['post_name'],
			'post_password' => $post['post_password'],
			'post_thumbnail' => intval($post['post_thumbnail']),
			// 'custom_fields' => $post['custom_fields'],
		);
		$client->query("wp.editPost",$blogid,$user,$pass,intval($target_id),$content);
		$response=$client->getResponse();
		if($response['faultCode']==0){
			$msg = "The article uploaded successfully.";
			$result=update_media($file,$target,$host,$user,$pass);
			$is_true=200;//  
			/*if(!empty($custom_fields)){//同步SEO元素
				foreach ($custom_fields as $k => $v) {
					
				}
			}*/	
		} else {
			$is_true=400;//文章同步失败
		   	$msg = 'Fail:' . $response['faultString'];
		}
	}	//	exit;
	return array("status"=>$is_true,"msg"=>$msg);
	// return $is_true;
}
// 获取目标站点的域名
function get_host(){
	$option = get_option('wp2wp_server_option');//获取设置中保存的配置项
	return $option;
}


// 附件处理,只能上传到目标站点的/wp-contenthttp://img.558idc.com/uploadfile/{Year}/{Month} {Year},{Month}为当前的年月
// 返回值中 status 的值大于1则成功
function update_media($postContent,$target,$host,$user,$pass){
	$is_true=0;
	$xmlrpcurl=$target.'xmlrpc.php';
	$client = new IXR_Client($xmlrpcurl);
	// Determine whether the connection is a picture, PDF attachment, etc
	$allowedExts=array('jpeg','jpg','png','gif','txt','pdf');
	// reference:http://www.jb51.net/article/23511.htm
	$mimetype=array(
		'jpg'=>'image/jpeg',
		'gif'=>'image/gif',
		'png'=>'image/png',
		'bmp'=>'image/bmp',
		'pdf'=>'application/pdf',
		'txt'=>'text/plain'
		);
	// Matching gets the url.
	$pattern = "(http://[a-zA-Z0-9\./]+)";
	preg_match_all($pattern, $postContent, $urls);
	$msg = "";
	// print_r($urls);
	// Gets the file suffix name for the url. pathinfo($fileInfo['name'],PATHINFO_EXTENSION)
	if(!empty($urls)&&!empty($urls[0])){
		foreach ($urls[0] as $v) {
			$ext = strtolower(pathinfo($v,PATHINFO_EXTENSION));
			if(in_array($ext, $allowedExts)){
				$tmp=preg_replace('('.$host.')','',$v);
				// $attach[]=$tmp;
				$arr=explode('/',$v);
				$filename=end($arr);
				// echo $filename."\r\n";
				//替换目录,得到附件
				$path = str_replace($filename,'',$tmp);
				// echo $path."\r\n";
				$upload_file = $tmp;
				// echo $upload_file."\r\n";
				$attachment = array(
					'name' => $filename,//pathinfo($filename,PATHINFO_FILENAME),
					'type' => $mimetype[$ext],
					'bits' => new IXR_Base64( file_get_contents( ABSPATH.$path.$filename )),
					'overwrite' => true
					);
				$client->query('wp.uploadFile','',$user,$pass,$attachment);
				// $clinet->query('metaWeblog.newMediaObject','',$user,$pass,$attachment);
				$response=$client->getResponse();
				// print_r($client);
				if($response['faultCode']==0){
					$is_true +=1;
					$msg .= $filename." upload success. \r\n";
				}else{
					$is_true -= 1;//不成功则减一
					$msg .= $filename." upload failured... \r\n";
				}
			}
		}
	}
	// print_r($attachment);
	// echo $msg;
	return array("status"=>$is_true,"msg"=>$msg);
}
 
网友评论