将来の投稿を表示できるようにカスタム投稿タイプを設定する方法


9

投稿と同じように機能するようにCPTを設定しましたが、イベントの詳細の投稿に使用しました。

事柄には、いくつかの投稿が将来のものであり、それらには将来の日付が設定されているということです。問題は、通常のユーザーがこれらの投稿を表示できないことです。

そう:

  • 今後の投稿もリストするようにarchive-events.phpを変更するにはどうすればよいですか?ページ付けを維持しながら、遠い未来の投稿を最初に表示し、最も古い投稿を最後に表示します。
  • 投稿がまだ技術的に公開されていないため、ユーザーが将来の投稿をクリックしても404ページが表示されないようにするにはどうすればよいですか?

4
基本的に将来の日付の投稿は実際にはWPのビューで公開されていないと言うように、デフォルトのワードプレス関数を使用するのではなく、日付にカスタムフィールドを使用することは可能でしょうか。
Vince Pettit

それはユーザーアクセスレベルのことのように思われるので、functions.phpファイルに何かを追加して、すべてのユーザーに将来の投稿を表示する権限を与えることができます
Vince Pettit

回答:


5

私はこれを自分で解決することができました。CPTを登録するための私のコード全体:

<?php
add_action( 'init', 'events_post_type_register' );
function events_post_type_register() {

    $post_type = "events";

    $labels = array(
        'name' => _x('Events', 'post type general name', 'project_X'),
        'singular_name' => _x('Event', 'post type singular name', 'project_X'),
        'add_new' => _x('Add New', 'event', 'project_X'),
        'add_new_item' => __('Add New Event', 'project_X'),
        'edit_item' => __('Edit Event', 'project_X'),
        'new_item' => __('New Event', 'project_X'),
        'all_items' => __('All Events', 'project_X'),
        'view_item' => __('View Event', 'project_X'),
        'search_items' => __('Search Events', 'project_X'),
        'not_found' =>  __('No events found', 'project_X'),
        'not_found_in_trash' => __('No events found in trash', 'project_X'),
        'parent_item_colon' => '',
        'menu_name' => 'Events'
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'hierarchical' => false,
        'has_archive' => true,
        'rewrite' => array(
            'with_front' => false,
            'slug' => "news/{$post_type}"
        ),
        'supports' => array( 'title', 'editor', 'thumbnail' )
    );
    register_post_type($post_type, $args);

    remove_action("future_{$post_type}", '_future_post_hook');
    add_action("future_{$post_type}", 'sc_ps_publish_future_events_now', 2, 10);
}

function sc_ps_publish_future_events_now($depreciated, $post) {
    wp_publish_post($post);
}

add_filter('posts_where', 'sc_ps_show_future_events_where', 2, 10);
function sc_ps_show_future_events_where($where, $that) {
    global $wpdb;
    if("events" == $that->query_vars['post_type'] && is_archive())
        $where = str_replace( "{$wpdb->posts}.post_status = 'publish'", "{$wpdb->posts}.post_status = 'publish' OR $wpdb->posts.post_status = 'future'", $where);
    return $where;
}
?>

そのため、将来設定された場合でも、すべてのユーザーが投稿を表示できるようにするには、以下を実行する必要があります。

remove_action("future_{$post_type}", '_future_post_hook');
add_action("future_{$post_type}", 'sc_ps_publish_future_events_now', 2, 10);

投稿を処理するアクションを後で削除し、独自のアクションを適用して、次の日付の将来の日付があるにもかかわらず強制的に公開します。

wp_publish_post($post);

次に、フィルタリングすることで、アーカイブページに今後の投稿を表示するだけですposts_where

function sc_ps_show_future_events_where($where, $that) {
    global $wpdb;
    if("events" == $that->query_vars['post_type'] && is_archive())
        $where = str_replace( "{$wpdb->posts}.post_status = 'publish'", "{$wpdb->posts}.post_status = 'publish' OR $wpdb->posts.post_status = 'future'", $where);
    return $where;
}

2
__()通話にテキストドメインを追加するか、関数を使用しないでください。
fuxia

3
アプローチの場合は-1。:)チャットでの議論に従って、カスタムのフィールドでイベントの日付を個別に追跡して、投稿の日付を利用するために内部の力学を曲げる方が信頼性が高くなります。
Rarst

1
代替アプローチの+1 :)私は@Rarstに完全に同意しますが、このアプローチも興味深いと思います。WPSEで文書化されていることを嬉しく思います。
Michal Mau

2

ブレイディ、私をこの解決策に導いてくれてありがとう。クライアントはすでにカスタムフィールドなしですべてのイベントの日付を設定していたため、戻ってすべてを変更することはありませんでした。投稿しようとすると最初にエラーが発生しましたが、次のわずかな変更(wp-includes / post.phpで使用される形式と一致するように作成)で機能しました。

remove_action( 'future_' . $post_type, '_future_post_hook', 5, 2 );
add_action( 'future_' . $post_type, 'my_future_post_hook', 5, 2);

そして

function my_future_post_hook( $deprecated = '', $post ) {
    wp_publish_post( $post->ID );
}

私はしばらくこれを理解しようと費やしました。それが他の誰かを助けることを願っています!


0

投稿ステータスを変更せずに、将来の投稿を単一で表示し、pre_get_postsでアーカイブすることもできます。

add_action( 'pre_get_posts', 'joesz_include_future_posts' );
function joesz_include_future_posts( $query ) {

    if ( $query->is_main_query() && 
           ( $query->query_vars['post_type'] == 'your-post-type' || // for single
         is_post_type_archive( 'your-post-type' ) ) ) {         // for archive

        $query->set( 'post_status', array( 'future', 'publish' ) );

    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.