Künftiger datierter Beitrag als veröffentlicht markieren

13

Anwendungsfall:

Ich habe einen Beitragstyp, der sich auf eine Musikshow bezieht. Die "Show-Zeit" wird durch das Post-Veröffentlichungsdatum erfasst, das auf einen späteren Zeitpunkt festgelegt ist. Ich habe eine Funktion gefunden, die zukünftig datierte Blog-Posts annimmt und das Datum verlässt, den Post jedoch als beim Speichern veröffentlicht markiert, aber nicht in der Lage war, herauszufinden, wie er für einen benutzerdefinierten Post-Typ angepasst werden kann.

Die Funktion ist unten.

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post','show', '_future_post_hook');
        add_action('future_post', 'show', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
kurzgefasst
quelle
1
Ist es möglich , dass Sie einen Fehler haben in Ihrem remove_actionund add_actionAnruf? Ihr zweiter Parameter ist 'show', aber sollte es nicht die Funktion sein, die Sie hinzufügen oder entfernen?
Jan Fabry

Antworten:

7

Es ist großartig, die beiden Antworten von Mike und Jan zu kombinieren. Ich habe diese gefunden, die nur für den fraglichen Beitragstyp funktioniert. Wir brauchen die Bedingung show nicht, weil der 'future_show'-Hook nur die Art der Sendung erfasst und diese aktualisiert.

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_show','_future_post_hook');
        add_action('future_show','publish_future_post_now');
    }

    function publish_future_post_now($id) {
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
kurzgefasst
quelle
7

Ich kann nicht sicher sagen , da ich zu Test haben Ihre Website nicht mit , aber ich glaube , dass Sie nur entfernen müssen 'show'aus remove_action()und add_action()Anrufe. Die wp_publish_post()Funktion ist in Bezug auf Post-Typen unabhängig, zumindest sieht es so aus, als würde man den Code lesen. Also versuche folgendes:

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post', '_future_post_hook');
        add_action('future_post', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>

Wenn Sie sich natürlich darauf beschränken möchten, nur Shows zu machen, möchten Sie vielleicht so etwas tun (obwohl die Logik komplizierter sein wird, wenn Sie sie auch für andere Beitragstypen benötigen):

function publish_future_post_now($id) {
    $post = get_post($id);
    if ('show' == $post->post_type)
        wp_publish_post($id);
}

Hoffe das hilft?

MikeSchinkel
quelle
Ja, der erste Code, mit dem ich angefangen habe, funktioniert bei normalen WordPress-Posts, aber wenn Sie die Bedingung 'show' hinzufügen, funktioniert er bei nichts. Auch ohne die Bedingung funktioniert es nicht mit einem benutzerdefinierten Beitragstyp.
Curtismchale
Ich habe Ihre Frage mehrmals gelesen, aber mir ist immer noch unklar, was genau Sie erreichen möchten, wenn wir den vorgeschlagenen Code ignorieren, der nicht funktioniert. Können Sie klarstellen, was genau Sie erreichen wollen? Möchten Sie den Beitrag an dem Datum und der Uhrzeit veröffentlichen, die in post_date enthalten sind, oder etwas anderes? Oder hast du es schon gelöst?
MikeSchinkel
Es ist bereits gelöst (ich habe unten Code bereitgestellt). Ich wollte nur den benutzerdefinierten Beitragstyp veröffentlichen, auch wenn dies für die Zukunft geplant ist.
Curtismchale
4

Ich denke, diese Aktion wird von aufgerufen wp_transition_post_status. Der Code lautet:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

Für normale zukünftige Posts wird der letzte Haken sein future_post, aber für deinen Typ wird es sein future_showoder was auch immer dein Typ ist.

Jan Fabry
quelle
1

Wenn Sie lediglich ein zusätzliches Datum für die 'Sendezeiten' hinzufügen möchten, ist es möglicherweise einfacher, ein Meta-Feld hinzuzufügen, das genau das tut. Wenn Sie das Veröffentlichungsdatum verwenden, um dies zu verfälschen, kann dies möglicherweise problematisch sein, da WordPress es auf festlegt "Zukünftiger" Status, wenn er mit einem zukünftigen Veröffentlichungsdatum aktualisiert wird (glaube ich). Sie müssen sich also jedes Mal anschließen, wenn ein Beitrag aktualisiert wird, um ihn wieder zurückzusetzen. Auf diese Weise können Sie auch "Veröffentlichungsdatum" für das reservieren, was beabsichtigt ist.

Ich würde wahrscheinlich nur eine meta_keyund eine benutzerdefinierte Meta-Box verwenden. Es hängt jedoch davon ab, wie komplex Ihre Abfragen sind, die die Posts anzeigen.

Wenn Sie den meta_value als Zeitstempel festlegen, können Sie nach dem angezeigten Datum noch ordnen oder vor / nach einem bestimmten Datum auswählen:

$events = get_posts( 'post_type=events&meta_key=show_time&meta_value=' . strtotime( '+1 week' ) . '&meta_compare=<&orderby=meta_value' );

Würden alle "Events" mit einer Showtime spätestens eine Woche ab dem aktuellen Datum bekommen. Hinweis: Das obige ist ungetestet, sollte aber funktionieren :)

Joe Hoyle
quelle
Ich stimme dem zu 100% zu - viel besser, wenn Sie eine Meta-Box verwenden, als wenn Sie das Veröffentlichungsdatum als Hack für das Ereignisdatum verwenden.
Travis Northcutt
Ja, eine meta_box würde funktionieren, aber ich fand es schwierig, eine nette jQuery-Datums- und Zeitauswahl hinzuzufügen. Die Aktie WP war viel schöner als alles, was ich mir vorstellen konnte.
Curtismchale
Das WP Easy Post Types-Plugin bietet ein benutzerdefiniertes Datumsfeld und eine einfache Datumsauswahl. Ich habe es selbst für eine Ereignisliste verwendet.
Rick Curran
0

WP Dev Nacin verwendet eine einfache Funktionsüberschreibung:

remove_action('future_post', '_future_post_hook');
add_filter( 'wp_insert_post_data', 'nacin_do_not_set_posts_to_future' );

function nacin_do_not_set_posts_to_future( $data ) {
    if ( $data['post_status'] == 'future' && $data['post_type'] == 'post' )
        $data['post_status'] = 'publish';
    return $data;
}
Adam David
quelle
Bitte erläutern Sie, wie dies funktioniert.
Nicolai