XML-RPCで外部ブログへ過去記事をランダムで投稿するゲスいプラグインつくりました

6月はWordCampKOBEJS MEET UPWordBench京都とあちこちの勉強会に参加してきました。

いずれも参考になる話が聞けて大変勉強になりましたので、それぞれの勉強会で得たものを何らかのかたちにできればと思いWordPressのプラグインを作成しました。
いつもfunctions.phpに直接書いてますが勉強も兼ねて。至ってない点突っ込みどころなどいろいろあるかと思いますが、ご容赦ください。。。

AD

WordPressプラグイン「Blog Old Post XML-RPC」

Blog Old Post XML-RPC (Github)

このプラグインは、XML-RPCでの投稿を許可しているブログへ過去記事をランダムで投稿するというどう考えてもゲスい使い方しか思いつかないプラグインです。

過去記事をランダムでツイートするTweet Old Postのブログ版だと思えば分かりやすいです。

運営しているサイトが増えてきたので、その情報をとりまとめて新しい価値が創造できないかという発想で生まれたものであり、スパムブログの量産を手助けするとかネットにゴミをばらまくつもりなどは決してないのです・・・(;´Д`)

参加した中で以下のお話を参考にしつつ作成いたしました。
大変勉強になりました。ありがとうございます。
そしてそのお話を聞いた結果がこれかよ!という感じで申し訳ございません。。。。

WordCampKOBEでの@yuka2pyさんのセッション
プラグインAPIから理解するWordPress

※WordCampのセッションではないけどこちらも大変参考になりました。
WordPressプラグイン作成入門

WordBench京都での@as_chachamaruさんのセッション(こちらでXML-RPCの話を聞いた)
WordPress管理パネル以外から記事を投稿してみよう!

利用方法

sc

プラグインを有効化すると「Blog Old Post XML-RPC」というメニューが増えます。
投稿間隔、投稿したいブログのID、パスワード、エンドポイントを入力することでcron(wp-cron)を使用し、定期的に過去記事からランダムに1件選んで投稿します。

エンドポイントについては、無料ブログであれば調べて公開されているブログなどが多く見つかりますので見てみてください。

API投稿可能なブログサービスの設定やエンドポイント一覧

※このプラグインはAtomPubで投稿するタイプのブログ(ameba,Livedoorなど)では使えません。

また、投稿されるタイトルや本文を編集したいというケースもあるかと思いますので、

blog_old_post_title
blog_old_post_content

というフィルターフックでfunctions.phpより変更できるようになっています。
たとえばhogehogeというカスタムフィールドに入っているURLをimgタグで本文として投稿したいという場合は、以下のように記述します。

実際のソースコード

他のサイトを参考にした部分が相当多いですし行数も短いですし、ということで私が説明できることもさほどないですが、メモ程度に。。。

必要な機能

過去の記事をランダムでピックアップして定期的に外部ブログへ投稿する、という目的を達成するために以下の機能が必要です。

1.外部ブログのID、パスワード、投稿先(エンドポイント)を入力して保存できる管理画面
2.過去記事をランダムに選んで投稿内容を生成
3.2.の投稿内容を1.の情報を用いて投稿処理を行う
4.3.の処理を定期的に実行する
5.プラグインの削除時に1.で保存したデータを削除する

このそれぞれの機能をつくっていきます。

プラグインの定義

WordPressのプラグインというのはテーマに書くfunctions.phpとまったく同じものです。
先頭に以下のようなコメントを書いたPHPファイルを用意し、/wp-content/plugins/内にディレクトリを作って置けばWordPressがプラグインとして認識してくれます。

1.管理画面の作成

まずadd_menu_page関数でメニューを追加し、そのメニュー内のページを作成します。

';
}
[/crayon]

2.過去記事をランダムで選んで投稿内容を作成し、投稿する

次に、WordPress内の記事からランダムで1件取得し、投稿する処理を作成します。

3.2.の投稿内容を1.の情報を用いて投稿処理を行う

XML-RPCでの投稿を実装するために以下のライブラリを使用させていただきました。
FC2ブログとなっていますがXML-RPCで投稿できるのであれば他のブログでも使えます。

Paradigm Shift Design
FC2ブログに記事を投稿するスクリプト

行頭でrequire_onceでロードしておきます。

XML/RPC.phpというファイルはPEARのサイトからダウンロードできます。前述のリンクの「Download」から取得可能です。

.taz.gz形式のアーカイブですが、解凍するとXMLというフォルダがあります。これをプラグインと同階層に置きます。

投稿処理自体は2.のblog_old_post_submitという関数を実行した段階で完了しているのですが、このblog_old_post_submitという関数は以下のように定義されています。
これはFC2BlogManager.phpをそのまま使うことで、実質10行程度で投稿処理を実現しています。

4.3.の処理を定期的に実行する

定期的な実行を行うためには2.で定義したblog_old_postという関数を定期的に実行すればいいです。
これはwp-cronに登録して実行させます。
なお、wp-cronは何らかのアクセスがあったときに実行されるものであるため、まったくアクセスのないサイトなどの場合は実行されることがありません。

これで、ダッシュボードから設定が可能なプラグイン本体ができあがりました。

5.プラグインの削除時に1.で保存したデータを削除する

・・・が、プラグインが削除されるときのことを考えて、設定値などを削除する処理を用意しておきます。

以下の記事を参考にしました

WordPressのプラグインの後始末

プラグインを設置したディレクトリにuninstall.phpというファイル名でファイルを作成し、delete_optionで不要なオプションを削除します。

blog_old_post_interval
blog_old_post_log
blog_old_post_settings

の3つと、登録したcronを削除するように設置しました。

ダウンロード

ダウンロードと最新版の確認はGithubよりお願いします。
コードの記述順は上記の手順とは順番が異なってますが気にしないでください(;´∀`)

blog-old-post-XML-RPC

AD

Share

Commentsコメント

メールアドレスは公開されません。コメントは必ずご入力ください。

HTMLタグは使用できません。ソースコードを書き込みたい場合はCodetterGistCodePenなどのご利用が便利です。

斉藤浩 さんより
Morimoto様

はじめまして。
貴サイト様の「Blog Old Post XML-RPC」を勝手ながら使用させて頂いている者です。
1つ質問がありまして…教えて頂けないでしょうか。

【質問】
タイトルと本文に加えてカテゴリ・タグ・アイキャッチ画像を過去記事から取得して他サイトへ投稿してやるには「Blog Old Post XML-RPC」のソースコードをどのように書き換えてやれば良いのでしょうか?

当方コードについて知識が乏しく、良ければ教えて頂きたいです。よろしくお願いします。
管理人 さんより
斉藤様

コメントありがとうございます。
また、プラグインをご利用いただきありがとうございます。

本文についてですが、プラグイン本体を書き換えるよりは使用テーマのfunctions.phpにフィルターフックとして追加するほうが簡単です。

※動作確認をしてないので上手く動かなかったら申し訳ありません。


プラグインを有効にして、以下をfunctions.phpに追記します。

function custom_old_post_content($text,$post){
        //カテゴリ一覧を取得
        $cats = get_the_category($post->ID);
        $cathtml = '';
        if($cats){
                $cathtml = '';
                foreach($cats as $cat){
                        $cathtml .= '<a>term_id) .'"></a>';
                }
                $cathtml .= '';
        }
        
        //タグ一覧を取得
        $tags = get_the_terms($post->ID,'post_tag');
        $taghtml = '';
        if($tags){
                $taghtml = '';
                foreach($tags as $tag){
                        $taghtml .= '<a>term_id,'post_tag') .'"></a>';
                }
                $taghtml .= '';
        }
        
        //アイキャッチを取得
        $thumbhtml = 'ID,'full') . '" alt="" />';
        
        //出力されるHTML
        $text = $thumbhtml;
        $text .= '' . $post->post_content . '';
        $text .= '' . $cathtml . '';
        $text .= '' . $taghtml . ;
        return $text;
}
add_filter('custom_old_post_content',10,2);


そうすると以下のようなHTMLが出力されます。
カスタマイズしたい場合は上記functions.phpの「//出力されるHTML」のところで制御されますので、クラス名などを適宜書き換えてください。

<div class="thumbnail">
        <img src="thumbnail.jpg" alt="" />
</div>
<div class="content">
        本文
</div>
<div class="cat">
        <ul>
                <li><a href="" rel="nofollow">カテゴリ</a></li>
        </ul>
</div>
<div class="tag">
        <ul>
                <li><a href="" rel="nofollow">タグ</a></li>
        </ul>
</div>