如何设置自定义帖子类型以查看将来的帖子


9

我已经设置了一个CPT,其行为与发布相同,但用于发布事件详细信息。

事实是,有些职位是在将来的,而这些职位的未来日期已定。问题是普通用户看不到这些帖子。

所以:

  • 如何更改archive-events.php以也列出将来的帖子?在保持分页的同时,首先显示远期的帖子,最后显示最早的帖子。
  • 我如何做到这一点,以便当用户单击将来的帖子时,他们不会得到找不到404页面的信息,因为该帖子尚未在技术上发布?

4
是否有可能使用自定义字段作为日期,而不是使用默认的wordpress函数,就像您说的那样,带有WP的日期实际上并没有发布。
文斯·佩蒂特

尽管说这似乎是用户访问级别的事情,所以您可以在functions.php文件中添加一些内容,以授予所有用户查看将来帖子的能力
Vince Pettit 2012年

Answers:


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为方法。:)根据聊天中的讨论,在弯腰的内部机制上利用帖子的日期,在自定义字段中单独跟踪事件日期会更加可靠。
拉斯特

1
+1是替代方法:)我完全同意@Rarst,但我也发现这种方法很有趣,并且很高兴在WPSE上对此进行了很好的记录。
Michal Mau 2012年

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

    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.