SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【WordPress】未来の投稿日でも公開できるようにしたい

問題

WordPressで、イベントの予定の記事などはイベント実施の日付で登録しておきたいんだけど、未来の日付だとどうしても予約投稿になってしまう。

日付は未来だけど記事としては公開することってできないのかな?

future post

答え

カスタムフィールドとして「イベント予定日」などを持たせる案もあるのだが、入力項目が増えたり、ではその日付で検索できるのか?といったことでいろいろと大掛かりなことになってくるので、今回、日付は記事の日付を使うようにする。

以下、方法を2つ。

1、出来合いのプラグインで対応できる

No Future Posts というプラグインがある。

未来の日付でも公開できるらしい。特定のカテゴリは除外したり、ある程度オプション設定もあるらしい。

(らしいというのは、実際にインストールして試してはいないため。)

管理画面のプラグインのインストール画面で「No Future Posts」で検索すれば出てくるので、インストールは簡単なはず。お試しあれ。

2、簡単なプラグインを書いて対応できる

プラグインをインストールするのはあまり好みではないなら、自作してしまおう。

やりたいのは、この程度の簡単なこと。

・特定のカテゴリや特定のカスタムポストタイプの投稿は日付が未来でも公開してしまいたい。
・細かい設定は考えていない。
・投稿後に発動するフックでpost_statusをfuture→publishにしてしまえばいいんじゃないか。

このくらいなら、実際に書くphpは5行程度の短いもの。

functions.phpに書くか、自作のプラグインにしてpluginsディレクトリにファイルを作ってもよい。

実装例

<?php
/**
 * 特定のカスタムポストタイプ(例:event)の予約投稿(future)があったら、問答無用で公開(publish)にする
 */
function my_immediately_publish($id)
{
	global $wpdb;
	$q = "UPDATE " . $wpdb->posts . " SET post_status = 'publish' WHERE ID = " . (int)$id;
	$wpdb->get_results($q);
}
add_action('future_event', 'my_immediately_publish');

今回使ったフックは、「{$new_status}_{$post->post_type}」。

$new_statusは、投稿した結果どの状態になったかで、以下のいずれかを指定できる。

'new' - When there's no previous status
'publish' - A published post or page
'pending' - post in pending review
'draft' - a post in draft status
'auto-draft' - a newly created post, with no content
'future' - a post to publish in the future
'private' - not visible to users who are not logged in
'inherit' - a revision. see get_children.
'trash' - post is in trashbin. added with Version 2.9. 

$post->post_typeは、postやpageや、その他自作のカスタムポストタイプ(今回の例ではevent)など。

eventがfutureになったときにフックを仕掛けたいので、add_action(‘future_event’, ‘callback’); と書いた。

関連するメモ

コメント(4)

lyn 2012年5月4日 19:37

はじめまして、とても参考になりました。ありがとうございます。
一つお聞きしたいのですが、未来投稿をカレンダーにも表示させたい場合はどうすればいいのでしょうか。
使っているのはWP3.3.2なのですが、No future postsのページに書かれていた方法はコードが変わっていて使えなかったので…。
やはり、wp-includes/general-templete.phpをどうにか書き換えるのかとは思いますが、そこまでスキルがなく困っております…
もしお時間がございましたらお知恵をお借りできれば幸いです。

yoshimura 2012年5月5日 12:38

ウィジェットのカレンダーでも、get_calendar()関数で表示したカレンダーでも、未来の日付のカレンダーに表示されました…がpost_typeがpost(普通の投稿)のときだけですね。
wp-includes/general-templete.php の get_calendar()では、WHERE post_type = ‘post’ と書いてあるので、post限定のようです。
既存のカレンダーはそのまま残しつつ、投稿以外のものでもカレンダー表示したいときは、自前でカレンダー表示の関数を作るのがよいのかなと思いました。
(やるとしたら、get_calendar()関数を名前を変えてコピーして作る?)
それぞれのカスタムポストタイプの記事のカレンダー表示は需要がありそうなので、そのうち実装されるといいな…(人任せ)

lyn 2012年5月6日 12:06

なるほど、コピーですね!get_calendar()をfunctions.phpに別名で作ってみることにします。
ありがとうございました。m(_ _)m

yoshimura 2012年5月6日 12:59

やってみてないので、この方法が一番いいかどうか分かりませんけど…
うまくいきますように(-人-