Как настроить тип персонализированного сообщения для просмотра будущих сообщений

Я установил CPT, чтобы действовать так же, как и сообщения, но использовались для отправки сведений о событиях.

Дело в том, что некоторые из должностей в будущем, и у них есть будущая дата, установленная на них. Проблема в том, что обычные пользователи не могут видеть эти сообщения.

Итак:

  • Как мне изменить archive-events.php для отображения будущих сообщений? Отображение далеких будущих сообщений: первые и самые старые сообщения сохраняются при сохранении разбивки на страницы.
  • Как мне сделать так, чтобы, когда пользователь нажимает на будущий пост, они не получают страницу 404, которая не найдена, поскольку публикация еще не опубликована?
7 голосов | спросил Brady 2 MarpmFri, 02 Mar 2012 15:14:08 +04002012-03-02T15:14:08+04:0003 2012, 15:14:08

3 ответа


3

Я смог решить это сам. Весь мой код для регистрации 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;
}
ответил Brady 2 MarpmFri, 02 Mar 2012 16:43:14 +04002012-03-02T16:43:14+04:0004 2012, 16:43:14
1

Брэди, я не могу поблагодарить вас за то, что привел меня к этому решению. Мой клиент уже установил все даты событий без специального поля, и я не собирался возвращаться и менять все. Когда вы пытались опубликовать свой код, ваш код сначала делал ошибку, но он работал со следующими небольшими изменениями (в соответствии с форматом, используемым в 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 );
}

Я потратил некоторое время, пытаясь понять это. Надеюсь, это поможет кому-то еще!

ответил Zade 23 +04002012-10-23T11:36:27+04:00312012bEurope/MoscowTue, 23 Oct 2012 11:36:27 +0400 2012, 11:36:27
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' ) );

    }

}
ответил Joe 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 14 Sep 2018 11:08:32 +0300 2018, 11:08:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132