技術

Python + XMLRPCでWordPressの記事を一括編集してみた

最近xv6の記事をずっと書いてますが、「xv6ソースコードリーディング その10」みたいなタイトルの付け方をしてて、タイトルから得られる情報がほとんどないので、フォーマットを変更してみました。
現時点でその40まであって、いっこずつ管理画面で変更するのはとてもめんどくさいので、WordPressのXMLRPC機能を使ってPythonで記事を一括編集してみました。

そのとき書いたコードを公開します。

もの凄く状況に依存しているので、コードに全く汎用性がないです(しかも使い捨てなのでかなり適当に書きました)が、PythonからWordPressのXMLRPC機能を使うためのライブラリであるpython-wordpress-xmlrpcの使い方のサンプルになればと思います。

「xv6ソースコードリーディング そのn」というパターンに合致するタイトルを持つ記事に対して、タイトルを「[xv6 #n] (章番号) – (章題) – (節題、もしあれば)」という形式に変え、本文の最初に書かれている、章番号、章題、節題を消去する、という処理になります。
元のフォーマットはそれ自体がマズイとはいえ、そのフォーマットは厳密に守ってたので、コードはシンプルに済みました。

ただ、python-wordpress-xmlrpcは内部でタイムゾーンを考慮してないっぽいので、記事をなにも変更せずに更新するだけでも公開日付が変わる可能性があり(例えば9時間プラスされるとか)、注意が必要です。

#! /usr/bin/env python
# -*- coding: utf8  -*-

import re
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetRecentPosts, EditPost

wordpress = "http://example.com/xmlrpc.php"
user = ""
password = ""

wp = Client(wordpress, user, password)
posts = wp.call(GetRecentPosts(50))

re_title = re.compile(u'xv6ソースコードリーディング その(?P<number>\d+)')
re_description = re.compile(u'^(?P<basetitle>.+)\nテキストの', re.MULTILINE | re.DOTALL)

for post in posts:
    match = re_title.match(post.title)
    if match:
        num = match.group('number')

        match = re_description.search(post.description)
        if match:
            basetitle = match.group('basetitle')
            re_editdesc = re.compile(u'%s\n' % re.escape(basetitle), re.MULTILINE)
            new_description = re_editdesc.sub(u'', post.description)
            new_title = u'[xv6 #%s] %s' % (num, ' - '.join(basetitle.split('\n')))
            
            print 'Editing %s' % new_title
            
            post.title = new_title
            post.description = new_description
            wp.call(EditPost(post.id, post, True))
            
            print 'Edited.'
            print

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示