私は、投稿と同じように振る舞うようにCPTを設定しましたが、イベントの詳細を投稿するために使用していました。
つまり、投稿のいくつかは将来のものであり、そのような投稿には将来の日付が設定されています。問題は通常のユーザーがこれらの投稿を見ることができないということです。
そう:
私はこれを自分で解決することができました。 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;
}
ブレイディ、私がこの解決策を導いてくれたことに十分に感謝することはできません。私のクライアントは既にカスタムフィールドなしですべてのイベントの日付を設定していました、そして私は戻ってすべてを変更しようとはしていませんでした。あなたのコードは最初に投稿しようとしたときにエラーを投げましたが、それは以下のわずかな修正(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 );
}
私はこれを理解するのにしばらく時間をかけました。それが他の誰かに役立つことを願っています!
投稿ステータスを変更せずに、将来の投稿を単独で表示し、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' ) );
}
}