web-dev-qa-db-ja.com

WP_Query内だけでなく、今後の投稿を一般に公開する

WP_Queryの'post_status' => 'future'を使用して、将来の投稿をループで公開することができることを私は知っています。しかし、あなたがログインしているユーザーでなければ、将来の投稿のパーマリンクをクリックすると404が表示されます。

Post_typeの 'event'にApocalypseという投稿があり、12 - 12-2099に予定されているとします。パーマリンクはmysite.com/event/apocalypseです。 mysite.com/event/apocalypseやその他の将来の 'イベント'の投稿を公開可能にすることは可能ですか

理想的には、将来の投稿の利用可能性を「イベント」投稿タイプに制限できるようにすることができますが、post_typeに関係なく将来の投稿をすべて利用できるようにするソリューションを検討します。

3
supertrue

つまり、Wordpressに'published'ではなく'scheduled'としてマークするように指示することで、将来の投稿を表示できます。これは、投稿がステータスを変更したときに呼び出されるfuture_postフックを使用して行います。各投稿タイプは、独自の将来のフックを自動的に取得します。使用しているカスタム投稿タイプはeventなので、future_eventフックを使用できます。コードは次のとおりです。

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');

この解決策は、このSEの質問から生まれました。 将来の日付の投稿を公開済みとしてマークする

このアプローチの注意点

私が追加する警告は、これにより、将来の投稿のループを取得することがより難しくなることです。以前は、単に'post_status' => 'future';を使用できました。しかし、現在、将来の投稿のpost_statuspublishedに設定しているため、機能しません。

これを回避するには、ループでposts_whereフィルターを使用できます(たとえば、コーデックスの日付範囲の例を参照してください: http://codex.wordpress.org/Class_Reference/WP_Query#Time_Parameters )、または次のように現在の日付と投稿日を比較できます。

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

ただし、これらの手法はいずれも、将来の投稿用に別のpost_statusを用意するほど簡単ではありません。おそらく、カスタムpost_statusがここでの良い解決策でしょう。

4
supertrue

私は今度こそ私の答えを伝えたいと思います。 'events'投稿タイプのすべての 'future'投稿を公開する場合、この解決策が見つかりました。

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

与えられたスニペットがうまく動かなかった私にとっては、post-edit.phpにいくつかのエラーがありましたが、$ postattは4.6.1でnullになったと思います。

とにかくそれが魅力的なように私のために働いた最後の解決策です。

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