技術

最新版のpython-wordpress-xmlrpcを使う

ここに記事を投稿するときに、今までstrongタグをかなり多用してました。
大昔に「strongタグを多用するとSEO的に不利だよ」って話は聞いたことありましたが、そんなのは別にどうでも良くて、気になるのはstrongタグの用途を統一してなかったことです。
単に太字にするのに使ったり、見出しのために使ったりと用途がまちまちでした。
これではCSSで見た目を調整しづらくなってしまいます。

うちのブログはstrongタグを見出しとして使ってるパターンが一番多いので、とりあえずstrongタグをh3タグに変換するプログラムをPythonで書きました。
以前同じような事をやった時と同じく使い捨てのスクリプトなのでかなり適当な書き方をしてます。

追記

このスクリプトは問題を引き起こすので使わないでください。詳細は後述します。

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

import sys
import codecs
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)

import re 
from datetime import datetime, timedelta
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, EditPost

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

strong_begin = '<strong>'
strong_end = '</strong>'
h3_begin = '<h3>'
h3_end = '</h3>'
 
wp = Client(wordpress, user, password)

def getRecentGenerator():
    offset = 0
    number = 20
    while True:
        posts = wp.call(GetPosts({'number': number, 'offset': offset}))
        if len(posts) == 0:
            break
        for post in posts:
            yield post
        offset += number
 
for post in getRecentGenerator():
    if post.content.find(strong_begin) >= 0 and post.content.find(strong_end) >= 0:
        print post.date_modified

        post.content = post.content.replace(strong_begin, h3_begin)
        post.content = post.content.replace(strong_end, h3_end)
        
        print post.link
        print 'Editing %s' % post.title
        if raw_input(u'yで続行: ') == 'y':
            wp.call(EditPost(post.id, post))
            print 'Done'
        else:
            print 'Canceled'
    else:
        print 'Skipped %s' % post.title

全記事を調べながら、本文にstrongタグが含まれる記事があったら、その記事のパーマリンクとタイトルを表示しつつ実行するかユーザに確認を求めます。
単に太字としてstrongを使ってる部分までh3になってしまうといけないので、確認が必要なようにしました。

1回処理が終わったら今度はstrongをbタグに書き換えるように修正して実行するといい感じでした。

こんなスクリプト、ニッチ過ぎて使う人はいないと思うのですが、python-wordpress-xmlrpcにかなり変更があって使い方が変わったので、使い方のサンプルになればと思い載せました。
python-wordpress-xmlrpcの仕様が変わったというよりWordPressのXML-RPCのAPIが3.4で結構変わるらしく、python-wordpress-xmlrpcはそれに追従した形となります。

WordPress 3.4はまだbetaなのに対応早いなぁ。
今回のスクリプトは多分WordPress 3.4じゃないと動作しないと思います。
(wp.getPosts APIは3.4からなので)

追記

python-wordpress-xmlrpcでデータを取得すると、文字列がエスケープされた状態になります。(これ自体はやり取りにXMLを使ってる以上仕方のないことではあります。)
これをそのままEditPostするだけで1段階エスケープが進む(うまい表現が思い浮かばない)ことになり、例えば本文に「R & B」という文字列が入ってると「R &amp; B」になります。
何度も繰り返すと重ねがけした状態になり、「R &amp;amp;amp;amp;amp; B」とかになったりします。
端的に言うと、タイトルや本文の内容が壊れることになります。
通常この程度のことはunescapeする処理を追加するだけで回避出来るんですが、エスケープされるのがどうも「&, >, <, "」だけではなく、一部の記号も数値文字参照に変換されるみたいで、どこまでエスケープされるのか正確なところを調査するは大変という結論に達しました。

なので私も、このスクリプトを実行する直前の状態にWordPressをバックアップから復元して、直接データベースを変更するスクリプトでやり直しました。

さらに追記

今回のずっと前にpython-wordpress-xmlrpcを使ったときに編集した記事がいくつか残ってるのに気が付きました。
今となっては当時の分をバックアップから戻すのは大変なので、アンエスケープする方法を色々試してみたところ、

import HTMLParser
# textにエスケープされた文字列が入ってるとして
text = HTMLParser.HTMLParser().unescape(text)

で行けそうだったのでPythonからDBに接続して修正しときました。
調査の過程でエスケープのされ具合を確認したところ、ひとつの記事内でも多めにエスケープされている部分とそうでない部分があって、WordPressのショートコードの内部だけが多めにエスケープされてるようでした。
一応正規表現と組み合わせて機械的に置換出来ましたが、なぜそういう症状が出たのかよく分かりません。

コメント

初めまして、自社で運営しているECサイトが、数値文字参照で構成されているために苦労しております。システム部にはファントムを使っているので直せないと言われて数年経ちます。SEO的に不利だと思うのですが、それについての記述がネットでは見つかりません。貴殿のコメントを拝見すると直せるような気がいたします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください