Seanhere 发表于 2013-12-3 15:22:35

关于通过Mysql语句发布文章选择Category问题

通过wp-admin后台或者Windows Live Write发布文章仍然麻烦,于是自己使用PHP程序直接将文章插入到网站数据库中,这样的话数据写入速度要快N倍,适合大量文章发布或多站同时维护。但WP程序的数据库文章表wp-posts和Category关系表是分开的,有没有这样做过的,怎么在插入文章的同时,选择所属的分类。


mattfox 发表于 2013-12-3 15:42:52

在wp_term_relationships表插入之前文章的ID(mysql_insert_id)以及类别ID

Seanhere 发表于 2013-12-3 15:47:50

本帖最后由 Seanhere 于 2013-12-3 15:50 编辑

mattfox 发表于 2013-12-3 15:42 static/image/common/back.gif
在wp_term_relationships表插入之前文章的ID(mysql_insert_id)以及类别ID
是的,要先读取已发布文章的ID,并且还要知道该ID代表文章所属category,才能作此操作,量大之后挺麻烦的


月光飞燕 发表于 2013-12-3 17:01:07

先读取id,然后同时写2条sql分别插入2个表,这个不难吧

你可以把写好的代码放上来,我帮你改

newcb 发表于 2013-12-3 19:23:03

共享一下吧,最近好像也有这个需要.

jx007888 发表于 2013-12-3 21:08:18

同求一个啊,这个是主要功能速度会提高很多

Seanhere 发表于 2013-12-3 21:33:57

本帖最后由 Seanhere 于 2013-12-3 21:52 编辑

这个方法是用来更新用来做外链的站群的,站群定期更新。由于站群量越来越大,更新一遍很费时间,但又不愿买市场上的站群软件。所以才想出了这种方法。
自己虽有一些编程基础,但没学过php,是边查语法边写的,程序可能有些笨拙,高手不要见笑。<?php
//数据库参数
$dbuser='';
$dbpwd='';
$dbname='';
$dbhost=';
$dbtable='';

//设置读取路径
$rdcontent='xxxx.txt';
$rdtitle='xxxxtitle.txt';
$rdlink='xxxxlink.txt';

//读取插入链接,并设置发布概率
function gen_link($rdlink){
      $data2 = file($rdlink);
      $num2 = count($data2);
      $id2= mt_rand(0,$num2-1);
      $random= mt_rand(0,10);
      if($random<5)
                $link= trim($data2[$id2]);
      else
                $link="";
      return $link;
}

//生成文章
$str = "";
$title = "";

$data2 = file($rdtitle);
$num2 = count($data2);
$id2 = mt_rand(0,$num2-1);
$title = $data2[$id2];

$data = file($rdcontent);
$num = count($data);

for($i=0;$i<25;$i++){
      $temp=" ";
      if(($i%5)==0)
                $temp="
\n";
      elseif(($i==7)|($i==21)){
                $links=gen_link($rdlink);
                $str=$str." ".$links." ";
      }
      $id = mt_rand(0, $num-1);
      $line = trim($data[$id]);
      $str=$str.$temp.$line;
}

//生成slug
function generate_slug($len){
      $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
      $slug="";
      for($j=0;$j<$len;$j++){
                $slug .= $chars[ mt_rand(0, strlen($chars) - 1) ];
      }
      return $slug;
}
$slug = generate_slug(17);

//获取发布时间
$datetime= date("Y-m-d H:i:s");

$sql= "INSERT INTO `$dbtable` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES (NULL, '1', '$datetime', '$datetime','$str','$title', '', 'publish', 'open', 'open', '', '$slug', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0', '', '0', 'post', '', '0')";

//连接数据库并处理数据
$con = mysql_connect($dbhost,$dbuser,$dbpwd);
if(!$con){
      die('Failed to connect to database! '.mysql_error());
}else
      echo "Suscess to connect to database!
\n";

mysql_select_db($dbname,$con);

$result=mysql_query($sql);

mysql_close($con);

if(!$result){
      echo $result;
      die('Failed to post article! '.mysql_error());
}else
      echo "Suscess to post article!\n";

echo $dbname." is done";

?>文章插入到wp-posts表中,文章id自动生成,在插入时是未知的,所以就在插入文章的同时无法再将id 插入到wp_term_relationship , 这样的结果是发布的文章是无分类的。所以不太明白关于“读取id”的方法,请指教。

文章的slug我用了随机生成的方法,其实最好的方法应该是用文章标题来转化,但那样麻烦些懒得费事。文章作者默认为1,就是管理员。文章内容我用了Yoo版的方法:http://www.advertcn.com/thread-12629-1-1.html。能保证原创性,但损失了可读性,由于是做外链用的,应该关系不大。

如果想将文件夹下的文章随机发布的话,可以先将文件夹内文件遍历,然后随机抽取发布的方法。
这样做成php页面,某站目录下,使用VPS的Crontab 用curl语法定时向该url发出请求,就可自动发布一篇文章,如果想要多篇的话,可以使用循环。




月光飞燕 发表于 2013-12-3 22:37:54


<?php
//数据库参数
$$dbuser='';
$$dbpwd='';
$$dbname='';
$$dbhost='';
$$dbtable='';

//设置读取路径
$$rdcontent='xxxx.txt';
$$rdtitle='xxxxtitle.txt';
$$rdlink='xxxxlink.txt';

//读取插入链接,并设置发布概率
function gen_link($$rdlink){
      $$data2 = file($$rdlink);
      $$num2 = count($$data2);
      $$id2= mt_rand(0,$$num2-1);
      $$random= mt_rand(0,10);
      if($$random<5)
                $$link= trim($$data2[$$id2]);
      else
                $$link="";
      return $$link;
}

//生成文章
$$str = "";
$$title = "";

$$data2 = file($$rdtitle);
$$num2 = count($$data2);
$$id2 = mt_rand(0,$$num2-1);
$$title = $$data2[$$id2];

$$data = file($$rdcontent);
$$num = count($$data);

for($$i=0;$$i<25;$$i++){
      $$temp=" ";
      if(($$i%5)==0)
                $$temp="
\n";
      elseif(($$i==7)|($$i==21)){
                $$links=gen_link($$rdlink);
                $$str=$$str." ".$$links." ";
      }
      $$id = mt_rand(0, $$num-1);
      $$line = trim($$data[$$id]);
      $$str=$$str.$$temp.$$line;
}

//生成slug
function generate_slug($$len){
      $$chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
      $$slug="";
      for($$j=0;$$j<$$len;$$j++){
                $$slug .= $$chars[ mt_rand(0, strlen($$chars) - 1) ];
      }
      return $$slug;
}
$$slug = generate_slug(17);

//获取发布时间
$$datetime= date("Y-m-d H:i:s");

$$sql= "INSERT INTO `$$dbtable` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES (NULL, '1', '$$datetime', '$$datetime','$$str','$$title', '', 'publish', 'open', 'open', '', '$$slug', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0', '', '0', 'post', '', '0')";

//连接数据库并处理数据
$$con = mysql_connect($$dbhost,$$dbuser,$$dbpwd);
if(!$$con){
      die('Failed to connect to database! '.mysql_error());
}else
      echo "Suscess to connect to database!
\n";

mysql_select_db($$dbname,$$con);

$$result=mysql_query($$sql);


//前面已经插入,获取插入id
$$insert_id = mysql_insert_id();

//继续插入wp_term_relationship表
if($$insert_id > 0 ){
      $$sql= "INSERT INTO `$$dbtable` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES (NULL, '$$insert_id', NULL)";

      $$result=mysql_query($$sql);
}
//关闭数据库连接
mysql_close($$con);



if(!$$result){
      echo $$result;
      die('Failed to post article! '.mysql_error());
}else
      echo "Suscess to post article!\n";

echo $$dbname." is done";

?>




代码给你改了下,wp_term_relationship表插入的值,你应该还需要改一下,因为我已经忘了这几个表的关系了,剩下你的分享很好,我们一般使用付费cronjob,因为这种东西稳定性很重要,可以搜索setcronjob


如果你需要第1次插入的某些值,你需要在if($insert_id > 0 )下面再增加一个select的查询
前面既然都是插入的内容,那么插入的内容事先就已经知道的,所以没有必要做这个select查询

风吹不动 发表于 2013-12-4 08:41:01

我之前是使用wp内容函数搞定的,效率比直接插sql慢些,但胜在稳定,基本不出问题

yiyunet 发表于 2013-12-4 09:32:15

你可以分两步来处理,先插入文章,再导出文章ID,更新目录.
你可以查看mysql那几个常用的指令。

Seanhere 发表于 2013-12-4 13:14:08

月光飞燕 发表于 2013-12-3 22:37 static/image/common/back.gif
代码给你改了下,wp_term_relationship表插入的值,你应该还需要改一下,因为我已经忘了这几个表的关系了, ...

多谢,知道怎么做了。

Seanhere 发表于 2013-12-4 13:16:04

风吹不动 发表于 2013-12-4 08:41 static/image/common/back.gif
我之前是使用wp内容函数搞定的,效率比直接插sql慢些,但胜在稳定,基本不出问题
...

有空细要了解一下wp内容函数,多谢。

Seanhere 发表于 2013-12-4 13:18:38

yiyunet 发表于 2013-12-4 09:32 static/image/common/back.gif
你可以分两步来处理,先插入文章,再导出文章ID,更新目录.
你可以查看mysql那几个常用的指令。



嗯,回头再学习一下。

ralf07 发表于 2013-12-5 12:40:52

本帖最后由 ralf07 于 2013-12-5 12:41 编辑

用WORDPRESS的XMLRPC啊,这个好方便
category,tag都可以插进去的

amnoob 发表于 2013-12-5 12:44:02

自来大家都是程序员啊;我想学PHP,不知道有哪些好的入门教程?

amnoob 发表于 2013-12-5 12:44:34

sorry, 笔误,看来。                                                                                                      
页: [1]
查看完整版本: 关于通过Mysql语句发布文章选择Category问题