it-swarm.com.de

Machen Sie zukünftige Posts für die Öffentlichkeit sichtbar - nicht nur in WP_Query

Ich weiß, dass ich zukünftige Posts in einer Schleife mit 'post_status' => 'future' in WP_Query öffentlich anzeigen kann. Wenn Sie jedoch auf den Permalink eines zukünftigen Posts klicken, erhalten Sie eine 404, wenn Sie kein angemeldeter Benutzer sind.

Angenommen, ich habe einen Post mit dem Namen Apocalypse im post_type 'event', der für den 12-12-2099 geplant ist. Der Permalink lautet mysite.com/event/apocalypse . Ist es möglich, mysite.com/event/apocalypse und andere zukünftige 'Event'-Posts für die Öffentlichkeit jetzt besuchbar zu machen?

Idealerweise wäre es mir möglich, die Verfügbarkeit zukünftiger Posts auf den Post-Typ "Ereignis" zu beschränken, aber ich würde mich mit einer Lösung begnügen, die alle zukünftigen Posts unabhängig von post_type verfügbar macht.

3
supertrue

Kurz gesagt, Sie können zukünftige Posts sichtbar machen, indem Sie Wordpress anweisen, sie als 'published' anstelle von 'scheduled' zu markieren. Verwenden Sie dazu einen future_post-Hook, der aufgerufen wird, wenn ein Beitrag den Status ändert. Jeder Beitragstyp erhält automatisch einen eigenen zukünftigen Haken. Da der von mir verwendete benutzerdefinierte Beitragstyp event ist, kann ich den Hook future_event verwenden. Hier ist der Code:

function setup_future_hook() {
// Replace native future_post function with replacement
    remove_action('future_event','_future_post_hook');
    add_action('future_event','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');

Diese Lösung ergab sich aus dieser SE-Frage: Zukünftigen datierten Beitrag als veröffentlicht markieren

Eine Einschränkung bei diesem Ansatz

Die Einschränkung, die ich hinzufügen möchte, besteht darin, dass es schwieriger wird, eine Schleife mit nur zukünftigen Posts zu erstellen. Früher konnte ich einfach 'post_status' => 'future' verwenden. Aber jetzt, da wir den post_status zukünftiger Posts auf published gesetzt haben, funktioniert das nicht.

Um dies zu umgehen, können Sie einen posts_where-Filter in Ihrer Schleife verwenden (siehe Beispiele für den Datumsbereich im Codex hier: http://codex.wordpress.org/Class_Reference/WP_Query#Time_Parameters ) oder Sie kann das aktuelle Datum mit dem Post-Datum vergleichen, etwa so:

    // get the event time
    $event_time = get_the_time('U', $post->ID);

    // get the current time
    $server_time = date('U');

    // if the event time is older than (less than)
    // the current time, do something
    if ( $server_time > $event_time ){
       // do something
    }

Keine dieser Techniken ist jedoch so einfach wie ein separater post_status für zukünftige Posts. Vielleicht ist ein benutzerdefinierter post_status hier eine gute Lösung.

3
supertrue

Ich möchte die ganze Zeit später meine Antwort geben. Für den Fall, dass alle "zukünftigen" Posts für den Post-Typ "Ereignisse" für die Öffentlichkeit sichtbar gemacht werden sollen, habe ich die folgende Lösung gefunden:

add_filter('get_post_status', function($post_status, $post) {
    if ($post->post_type == 'events' && $post_status == 'future') {
        return "publish";
    }
    return $post_status;
}, 10, 2);
1
Samuel Reid

Für mich hat das angegebene Snippet nicht funktioniert, es gab einige Fehler in der post-edit.php, aber ich denke, dass $ postatt jetzt in 4.6.1 null ist.

Wie auch immer, das ist die endgültige Lösung, die für mich wie ein Zauber gewirkt hat.

add_filter('the_posts', 'show_all_future_posts');

function show_all_future_posts($posts)
{
   global $wp_query, $wpdb;

   if(is_single() && $wp_query->post_count == 0)
   {
      $posts = $wpdb->get_results($wp_query->request);
   }

   return $posts;
}
0
knif3r