it-swarm.dev

Künftiger datierter Beitrag als veröffentlicht markieren

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 akzeptiert und das Datum verlässt, den Post jedoch als beim Speichern veröffentlicht markiert, aber nicht herausgefunden hat, 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');
?>
12
curtismchale

Es ist großartig, die beiden Antworten von Mike und Jan zu kombinieren. Ich habe mir das ausgedacht, was nur für den fraglichen Beitragstyp funktioniert. Wir brauchen keine Bedingung für show, da 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');
?>
6
curtismchale

Ich kann es nicht genau sagen, da ich Ihre Site nicht zum Testen habe, aber ich glaube, Sie müssen nur 'show' aus remove_action()- und add_action()-Aufrufen entfernen. Die Funktion wp_publish_post() ist in Bezug auf Beitragstypen agnostisch, 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?

6
MikeSchinkel

Ich denke, diese Aktion wird von wp_transition_post_status aufgerufen. 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 lautet der letzte Haken future_post, für Ihren Typ jedoch future_show oder was auch immer Ihr Typ slug ist.

3
Jan Fabry

Wenn Sie nur 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 setzt "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 einen meta_key und 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 Datum der Show-Zeit 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 nicht getestet, aber sollte funktionieren :)

1
Joe Hoyle

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;
}
0
Adam David