WordPressプラグインのPostieのカスタマイズ

WordPressのプラグインにPostieってのがあります。

このプラグインは、記事をメールで送信してWordPressに投稿をするというものです。

クライアントから、メール送信で記事を投稿したいと要望があり、このプラグインで実装をしました。

カスタム投稿タイプに投稿をするようにも設定ができ、今回はそのように設定をしました。

設定等は簡単だったので、ここでは説明はしません。

で、クライアントから、更なる要望で、新規にメールでの投稿があった場合のみ、トップページに当該カスタム投稿の新着一覧を表示してほしいとのこと。

普通考えるのは、当該カスタム投稿の投稿日を調べて、3日以内だったら表示する方法ですよね。

よく、投稿のタイトルの横に「New!」とか赤字で表示させてる、あの方法を使えばできますよね。

しかし、クライアントの要望は一覧を非表示にするのは、手動でしたいとのこと。

上記の方法だと、投稿日から3日経てば表示されなくなっちゃいますからね。

ということは、Postieがメールサーバにメールを取りに行ったとき(fetchした時ですね)に、新規のメールがあったら、トップページに一覧を表示するように何かしらのオプション値を更新するという方法になりますね。

トップページのテンプレート(front-page.phpかな)では、そのオプション値(post_metaですね)を拾って、表示・非表示を切り替えるってやり方です。

そのオプション値はAdvanced Custom Fieldsとかのプラグインで設置するのが簡単ですよね。

では、Postieがメールサーバにメールを取りに行ったときに、新規のメールがあったらpost_metaを書き換えるってのはできるのかってことです。

まず、Postieはメールサーバからメールを拾ってポストしたら、メールサーバからメールを削除するのが基本の設定です。なので、メールを拾いに行って、1つでもメールがあれば、post_metaを書き換えるようにすればよいです。

では、Postieがメールサーバにメールを拾いに行くタイミングは、どこで行われるのかってのを探さないといけません。かつ、その場所にアクション・フックが設定されているのが望ましいです。

なので、まずはアクション・フックを探すために、Postieのプラグインのコードをdo_actionで検索をしてみました。。

そうしたら、postie-message.phpの695行目あたりに

do_action('postie_post_after', $details);

ってのが、見つかりました。フックの名前からして、ビンゴっぽいですよね。

本当にビンゴなのかどうか、確認をしてみないとわかりません。

どうやれば確認ができるのか?

Postieのコードを見ていると、ところどころに、

DebugEcho("doing postie_post_after");

のように、DebugEchoって関数がちりばめられていることに気が付きます。

Postieの素晴らしいのが、設定画面の右の「Action」ってボックスに、

To run the check mail script manually with full debug output とかいた「Debug」ってボタンがあって、このボタンを使って、メールをチェック(Fetchかな)の動作をすると、このDebugEchoって関数で設定されている内容が出力されてデバッグができるんです。

そして、変数の中身を見たいなって時も、この関数を使って

DebugEcho("doing postie_post_after");
do_action('postie_post_after', $details);
DebugEcho(var_dump($details));

みたいな感じでコードを継ぎ足せば、変数の$detailsの中身を確認できます。

そんな感じでテストをしてみると、メールサーバにメールがあって、WordPressに投稿したときにだけ、”doing postie_post_after”ってのが出力されることがわかりました。ビンゴでした!

なので、その直ぐ後のdo_action(‘postie_post_after’, $details);に、引っ掻けて処理をするコードをfunctions.phpとかに書けばよいです。

例えば、こんな感じかな。

/*-------------------
Postie カスタマイズ
--------------------*/
add_action( "postie_post_after", function (  ) {

//do_action('postie_post_after')に引っ掛ける処理をここに書く
        $front_page_id = url_to_postid( home_url() );
        update_field( フィールド名, 値, $front_page_id );
    }
} );

もし、処理に変数$detailsを使うなら

add_action( "postie_post_after", function ( $details ) {
//do_action('postie_post_after')に引っ掛ける処理をここに書く
       
    }
} );

のように書けばいいです。

ちなみに、$detailsは配列で、中身はこんな感じです。

Array
(
    [post_author]
    [comment_author] 
    [comment_author_url] 
    [user_ID] 
    [email_author] 
    [post_date] 
    [post_date_gmt] 
    [post_content] 
    [post_title] 
    [post_type] 
    [ping_status] 
    [post_category] 
    [tags_input] 
    [comment_status] 
    [post_name] 
    [post_excerpt] 
    [ID]
    [post_status]
)