it-swarm-ja.com

save_postの後にinsert_post_dataを使用し、post_transitionの後にinsert_postを使用するイベントカレンダーdraft_to_schedule

さて、私は自分のサイトのイベントカレンダーを作成するという恐ろしい仕事を引き受けていて、ちょっと立ち往生しています。私はあらゆるアイデアに寛容ですが、これが私がしていることとやりたいことです。私は自分がやりたいことをかなりよく理解しているような気がするので、私の主な問題はフックとフィルタの順序だと思っています。また、MySQLデータベースを直接操作するのではなく、ワードプレスのフックとフィルタを使用します。

短いです...

  1. 最初のカスタムフィールドを保存してから、現在のpost_dateをそのカスタムフィールドに変更し、投稿が下書きとして保存されるかレビュー用に送信されるたびに、post_statusをこの順序でfutureに変更します。
  2. 2番目のカスタムフィールドを取り出し、そのカスタムフィールドを新しい投稿の日付として新しい投稿を挿入し、新しい投稿のpost_statusを「future」に変更して、元の投稿からその新しい投稿のタイトル、コンテンツをコピーします。 (目標は、元の投稿に投稿された日付ごとに同じ新しい投稿を作成し、新しい投稿を元の投稿の子にして、それらすべてを将来の投稿としてスケジュールすることです)

今度はロングバージョンへ。

まず、 'events'というカスタムのpost_typeがあります。それのために登録された私は私達が_start_date_one、_end_date_one、_start_date_two、_end_date_twoと呼ぶことにするいくつかのカスタムフィールドを持っています。

私がやりたいことは、「イベント」投稿を作成し、これらのフィールド、タイトル、およびコンテンツを入力できるようにすることです。ここまでは順調ですね。次に、誰かが[下書きを保存]または[レビュー用に送信]をクリックしたときに、現在のpost_dateを_start_date_oneに変更し、post_statusを 'future'に変更します。現在、私は少なくとも2回目の保存後に初めてこの問題が発生する可能性があります。これは、add_action( 'save_post')を使用してカスタムフィールドを保存し、add_filter( 'wp_insert_post_data')を使用して現在の投稿データを更新するためです。いくつかのtrac検索でinsert_post_dataが保存の前に行われて$ dataと$ postarrを新しい情報で更新できるようにしてからカスタムフィールドを保存するため、上記のことが起こります。

上記の番号2私はwp_insert_postを機能させるためにかなりの数の方法を試みましたが、正しい日付がなく他のすべてがコピーされた保留中の投稿を挿入することになっただけです。

任意の助けは大歓迎です。

1
user2271

こんにちは@ user2271:

私は最近、WordPressに将来の日付を保存させることができなかったEventカスタム投稿タイプの状況を解決しなければなりませんでした。私はあなたのように複雑になることを試みていませんでした、しかし、フォローコードは私の問題を解決しました、多分あなたはあなたのものを解決するためにそれを使用することができます:

add_action('admin_init', 'yoursite_admin_init');
static function yoursite_admin_init() {
  global $pagenow;
  if ($pagenow=='post.php' && isset($_POST['post_date'])) { 
    $_POST['event_date'] = date('Y-m-d H:i:s',strtotime($_POST['post_date']));
  }
}
add_filter('wp_insert_post_data', 'yoursite_wp_insert_post_data',10,2);
static function yoursite_wp_insert_post_data($data,$postarr) {
  global $pagenow;
  if ($data['post_type']=='event') {
    // Saving an event, 'event_date' grabbed in admin_init
    if ($pagenow=='post.php' && isset($postarr['event_date'])) {
      $data['post_date'] = $data['post_date_gmt'] = $postarr['event_date'];
    }
  }
  return $data;
}

基本的にWordPressはブログの投稿ロジックをすべての投稿に適用しており、イベントは異なるロジックに従うべきです。私が投稿したコードは'admin_init'フックで入ってくる日付をつかみ、そしてWordPressが「修正」ブログ投稿ロジックごとの日付を持った後にそれを'wp_insert_post_data'フックで再利用します。

この問題を理解する私はあなたがあなたのより複雑なワークフローに従ってどのように修正するかを決めるのを手伝うと思いますか?

この願いを願っています。

2
MikeSchinkel