私は私のウェブサイトのためのカスタムイベントスケジューラに取り組んでいます。それは人々が簡単に入って、将来投稿する記事を設定することを可能にします。私が通常のWordpressの機能を無効にしているのは、説教は日曜日にしか投稿されないので、日付を簡単に選択できるようにしたかったからです。だから私はあなたが月の日曜日を選択することを可能にするカスタムドロップダウンカレンダーを持っています。
とにかく私の問題は、私の投稿はすべて管理パネルに "Missed Schedule"のエラーを表示することです。私は "post_status" => "future"を使ってページ上に投稿を一覧表示することでこれを回避できますが、これはちょっと "ハッキー"です...
なぜこのコードが "Missed Schedule"エラーを表示しているのでしょうか。
function cfc_reset_sermondate( $data ) {
if($data['post_type'] == 'sermon_post') {
if($_POST['cfc_sermon_date']) {
$date = $_POST['cfc_sermon_date'];
// $date = DateTime::createFromFormat('D - M j, Y', $date);
// $date = $date->format('Y-m-d');
$date = createFromFormat($date);
$postDate = strtotime($date);
$data['post_date'] = $date;
$todaysDate = strtotime( date( 'Y-m-d' ) );
if ( $postDate > $todaysDate ) {
$data['post_status'] = 'future';
}
}
}
return $data;
}
add_filter( 'wp_insert_post_data', 'cfc_reset_sermondate', '99', 1);
これがcreateFromFormat関数です。
function createFromFormat($date_ugly) {
$schedule = 'Sunday - Sep 15, 2000';
// %Y, %m and %d correspond to date()'s Y m and d.
// %I corresponds to H, %M to i and %p to a
$ugly = strptime($date_ugly, '%A - %b %e, %Y');
$ymd = sprintf(
// This is a format string that takes six total decimal
// arguments, then left-pads them with zeros to either
// 4 or 2 characters, as needed
'%04d-%02d-%02d',
$ugly['tm_year'] + 1900, // This will be "111", so we need to add 1900.
$ugly['tm_mon'] + 1, // This will be the month minus one, so we add one.
$ugly['tm_mday'],
$ugly['tm_hour'],
$ugly['tm_min'],
$ugly['tm_sec']
);
$new_schedule = new DateTime($ymd);
return $new_schedule->format('Y-m-d');
}
WordPressにはこの機能があります。WordPressの「公開」ボックスで公開日を未来に設定することで、投稿は「将来」のステータスになり、その日に公開されるようにスケジュールされます。
私が思うに、この問題はあなたがGMT時間を設定していないために起こります - それはWordPressが出版物を予定するのに使うものです。それ以外の場合は、スケジューリングが完了した後にフックしました。
「簡単な」方法(ただし、UIの観点から見ればそれほど良くない2つの「公開日のミートボックス」があります)。
WPはY-m-d H:i:s
フォーマットの日付を想定していることに注意してください
add_action('save_post', 'wpse50448_schedule_sermon');
function wpse50448_schedule_sermon($post_id) {
//Perform checks, nonces etc
$date='';//set date
$date_gmt='';//set date in GMT (UTC)
// unhook this function so it doesn't loop infinitely
remove_action('save_post', 'wpse50448_schedule_sermon');
// update the post, which calls save_post again
wp_update_post(array('ID' => $post_id, 'post_date' => $date,'post_date_gmt' => $date_gmt));
// re-hook this function
add_action('save_post', 'wpse50448_schedule_sermon');
}
これはうまくいくはずですが、テストされていません!
あるいは、パブリッシュメタボックスの登録を解除して、まったく同じマークアップで登録し直すこともできます(ただし、一部のIDタグを変更してWPのjavascriptで無視してから、自分のjavascriptを適用する)。 UIの観点から見ると、これははるかに優れていますが、もう少し複雑です。
別のメタボックスのために、 最初の部分はこの記事で概説されています 。