导出Wordpress日志到新浪博客

  服务器即将到期,不想再续租,自己的博客已经转成静态的了,放到GitHub Pages上当然是最好的选择, 服务器上另一个朋友的博客打算入住新浪博客, 于是就涉及到怎么迁移数据的问题了, 好在新浪博客还算比较开放,支持MetaWeblog XML-RPC API,写了一段简单的脚本,搬家成功。

  不过新浪博客的API貌似不支持dateCreated,因此导入后所有日志的发布时间都变成当前时间了,另外脚本也没有对日志分类进行处理,好在日志不多,手动调整也不是那么麻烦。

<?php
/**
 * 导出Wordpress日志到新浪博客
 * Created by JinnLynn 2013.01.11 http://jeeker.net/
 */
require('./wp-blog-header.php');
require('wp-includes/class-IXR.php');

define('SINA_XMLRPC', 'http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php');

if ($_GET['action'] != 1) {
?>
<br />
<form action="?action=1" method="post">
    新浪账户: <input type="text" name="usr" value="" /><br />
    新浪密码: <input type="password" name="pwd" value="" /><br />
    <input type="submit" value="导出" /><br />
</form><br />
导出前请确认已开通了新浪博客,并设置了正确的账户密码。
<?php
    return;
}

$usr = trim($_POST['usr']);
$pwd = trim($_POST['pwd']);
if (empty($usr) || empty($pwd)) {
    echo '<br /><span style="color:red;">用户名或密码错误。</span><a href="javascript:history.back()">back</a>.';
    return;
}

// 登陆测试
$params = array(0, $usr, $pwd);
$sina_xmlrpc = new IXR_Client(SINA_XMLRPC);
$sina_xmlrpc->query('metaWeblog.getCategories', $params);
$res = $sina_xmlrpc->getResponse();
unset($sina_xmlrpc);
if (isset($res['faultCode'])) {
    echo '<br /><span style="color:red;">用户名或密码错误。</span><a href="javascript:history.back()">back</a>.';
    return;
}

$query = new WP_Query();
$query->query( array( 'post_type'       => array('post', 'page'), // 导出类型
                      'order'           => 'ASC',
                      'posts_per_page'  => 10000 )
              );
while ($query->have_posts()) {
    global $post;

    $query->the_post();

    $layout = $post->post_type;
    $title = get_the_title();
    $date = get_post_time('Y-m-d H:m:s');
    $author = get_the_author();
    $content = $post->post_content;
    $content = apply_filters('the_content', $content);
    $content = str_replace(']]>', ']]>', $content);

    $content .= '<p id="original-post-date" style="color:#ccc"><br />-----<br />原文发表于:'. $date . '</p>';

    $sina_post = array( 'title'       => $title,
                        'dateCreated' => get_post_time('Y-m-d\TH:m:s\Z', true), //!? 没有作用
                        'description' => $content);

    $params = array(0, $usr, $pwd, $sina_post, true);

    $sina_xmlrpc = new IXR_Client(SINA_XMLRPC);
    $sina_xmlrpc->query('metaWeblog.newPost', $params);
    $res = $sina_xmlrpc->getResponse();

    unset($sina_xmlrpc);

    if (isset($res['faultCode'])) {
        $res = '<span style="color:red;">导出失败</span>';
    }

    echo $title . '<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> ' . $res . '<br /><br />';
}
?>

Source on gist

Gude

  厌倦了Wordpress越来越庞杂却无用的功能,想让网站回归单纯,Octopress本是个不错的选择,但在OS X下总有这样那样的问题,自己对Ruby也不了解,于是就在Python下折腾出了这个Gude。

  如下图,在Gude下网站日常管理的几个简单命令。

Gude

  • 基于Python2.7
  • 使用GIT进行管理和发布
  • 使用Markdown或HTML撰写文章
  • 支持分类、标签
  • 支持文章模板、站点皮肤
  • 评论系统Disgus,统计系统Google Analytucs
  • 支持发布到Github或任意的FTP服务器1
  • 简单的插件支持

Project on GitHub


  1. FTP发布需GIT-FTP支持 

Read more...

JKit: 部分禁用日志编辑自动保存

  在Wordpress中,日志版本管理(Post Revisions)和编辑日志时的自动保存都会在数据库中产生新的数据(编辑已发布的内容时),很显然这些数据的用处只是一时的,但却给今后数据库查询增加了无谓的额外开销。

  对于日志版本管理,我们在wp-config.php中添加一句define('WP_POST_REVISIONS', false); 即可以轻松的完全禁用此功能,但自动保存就没有这么简单,官方没有提供开关功能,现在网上找到的方法似乎都是通过屏蔽javascript脚本,这种方法虽然可行,但在某些浏览器下可能报错,同时换个角度来看,某些时候自动保存还是有些用处的,完全禁用似乎也不太可取。

  下面的代码实现了仅在编辑草稿、发表新日志或页面时启用自动保存,在重新编辑已发表的内容时则不会进行自动保存的操作,避免在数据库中产生无用的数据,方法则是在浏览器提交申请,服务器进行自动保存之前对日志的状态进行判断,如果是草稿或未找到日志ID(即新日志)则进行保存操作,否则直接退出。

Read more...

JKit: 自动在评论@用户名中添加页面跳转链接

  2009-04-02 ver0.2 Update: 支持"@用户名 "、"@用户名,"、"@用户名:"等多种形式;添加跳转链接为绝对路径,不再有分页跳转链接失效问题;链接添加类似“reply-回复的评论ID”的ID,便于使用JS实现一些特效。

  在回复评论时我个人习惯使用如Twitter“@用户名 回复内容”的形式,不过由于不像Twitter能给用户名添加链接,如果评论较多的话读者并不能很轻易找到该用户的评论,手动添加又显得麻烦,当原评论被删除时还有链接失效的问题。

  其实在Wordpress的插件库里你可以找到一个名为@reply的插件解决上述问题,它能自动给用户名添加链接,不过仔细看@reply的源代码你会发现每当它找到一个需要添加链接的用户名时就要进行一次数据库查询操作,相当浪费资源,同时它只对在评论起始处使用“@用户名”时才有效,多次或在评论内容中穿插使用都是无效的。此外@reply还有一个很大的BUG,当一个用户对一篇日志发布多次评论,你也多次使用“@用户名 ”的形式对该用户进行回复时,自动添加的链接指向的都是该用户最后发表的评论,这当然是不合理的。

  于是我自己写了一个类似功能的函数,它不进行任何的数据库查询,无论“@用户名 ”在评论中什么位置使用多少次都是有效的,链接总是指向在该回复发表日期之前该用户发表的最近一篇评论。具体效果见这里,你可以拷贝后面的源代码或使用JKit Builder生成带此功能的插件。

Read more...

JKit: 定期自动优化数据库

  在MySQL中对表的数据进行删除操作时,实际上并没有真正的删除这些记录,而是被保存在链接清单中,这些多余数据不但占用数据库的存储空间,对效率也有一定的影响,Wordpress中wpcomments、wpoptions等表尤为容易产生这些多余的数据,因为它们往往比别的表进行更多的删除或更新操作。

  使用SQL中的OPTIMIZE TABLE语句就可以对数据表进行整理,修复碎片,并且重新排序索引,提升性能,你可以通过phpMyAdmin或Wordpress插件Optimize DB实现上述语句的功能,不过它们都需要手动进行,并不方便。

  实际上只要通过下列十几行简单的PHP语句就可以在Wordpress中实现定期整理数据库的目的,需要注意的是数据库在使用OPTIMIZE TABLE进行优化时会被锁定,因此不益过于频繁的进行此项操作,下面默认是半个月整理一次,应该是比较合适的。

Read more...