it-swarm.com.de

Ereigniskalender mit insert_post_data nach save_post und insert_post nach post_transition draft_to_schedule

OK, ich übernehme die gefürchtete Aufgabe, einen Veranstaltungskalender für meine Website zu entwickeln, und bin ein bisschen hängen geblieben. Ich bin offen für alle Ideen, aber hier ist, was ich tue und was ich gerne tun würde. Ich gehe davon aus, dass mein Hauptproblem die Reihenfolge der Haken und Filter ist, weil ich das Gefühl habe, ziemlich gut zu verstehen, was ich tun möchte. Außerdem würde ich mich an WordPress-Hooks und -Filter halten, anstatt die MySQL-Datenbank direkt zu manipulieren.

Die kurze ist ...

  1. Speichern Sie das erste benutzerdefinierte Feld und ändern Sie dann das aktuelle Datum post_date in dieses benutzerdefinierte Feld und post_status in der angegebenen Reihenfolge in future, wenn ein Beitrag als Entwurf gespeichert oder zur Überprüfung übermittelt wird.
  2. Nehmen Sie das zweite benutzerdefinierte Feld und fügen Sie einen neuen Beitrag mit diesem benutzerdefinierten Feld als Datum des neuen Beitrags ein. Ändern Sie den post_status des neuen Beitrags in "Zukunft" und kopieren Sie den Titel und den Inhalt des ursprünglichen Beitrags in diesen neuen Beitrag. (Ziel ist es, für jedes Datum, das für den ursprünglichen Beitrag eingereicht wurde, einen identischen neuen Beitrag zu erstellen, die neuen Beiträge dem ursprünglichen Beitrag unterzuordnen und sie alle als zukünftige Beiträge zu planen.)

Nun zur Langfassung.

Erstens habe ich einen benutzerdefinierten post_type namens 'events'. Ich bin dafür registriert und habe einige benutzerdefinierte Felder, die wir der Einfachheit halber _start_date_one, _end_date_one, _start_date_two, _end_date_two nennen.

Was ich tun möchte, ist, das Erstellen eines "Ereignis" -Postens zuzulassen und die Eingabe dieser Felder, eines Titels und von Inhalten zuzulassen. So weit, ist es gut. Wenn dann jemand auf "Entwurf speichern" oder "Zur Überprüfung einreichen" klickt, möchte ich das aktuelle Post-Datum in "Start-Datum" ändern und den Post-Status in "Zukunft" ändern. Im Moment kann ich dies erst nach dem zweiten Speichern feststellen, da ich add_action ('save_post') verwende, um benutzerdefinierte Felder zu speichern, und dann add_filter ('wp_insert_post_data'), um die aktuellen Post-Daten zu aktualisieren Durch eine Tracsuche wird festgestellt, dass insert_post_data vor dem Speichern ausgeführt wird, damit ich die $ data- und $ postarr-Daten mit neuen Informationen aktualisieren und dann die benutzerdefinierten Felder speichern kann.

Nummer 2 oben aufgeführt Ich habe einige Möglichkeiten ausprobiert, um wp_insert_post zum Laufen zu bringen, habe aber nur einen ausstehenden Beitrag eingefügt, bei dem keines der Daten korrekt ist und alles andere kopiert wurde.

Jede Hilfe wird sehr geschätzt.

1
user2271

Hallo @ user2271:

Ich musste kürzlich eine Situation für einen benutzerdefinierten Ereignistyp beheben, in dem WordPress nicht zum Speichern eines zukünftigen Datums verwendet werden konnte. Ich habe nicht versucht, so komplex wie Sie zu sein, aber der folgende Code hat mein Problem behoben. Vielleicht können Sie ihn verwenden, um Ihr Problem zu beheben:

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;
}

Grundsätzlich wendet WordPress die Blogpost-Logik auf alle Posts an und Ereignisse sollten einer anderen Logik folgen. Der Code, den ich gepostet habe, erfasst das eingehende Datum im Hook 'admin_init' und verwendet es dann im Hook 'wp_insert_post_data' wieder, nachdem WordPress die Daten pro Blog-Post-Logik "korrigiert" hat .

Wenn Sie dieses Problem verstehen, können Sie möglicherweise anhand Ihres komplexeren Workflows feststellen, wie es behoben werden soll.

Hoffe das macht Spaß.

2
MikeSchinkel