it-swarm.xyz

Пометка будущего поста с датой публикации

Случай использования:

У меня есть тип поста, который относится к музыкальному шоу. "Время показа" фиксируется через дату публикации, которая установлена ​​на некоторое время в будущем. Я нашел функцию, которая принимает будущие сообщения в блоге и оставляет дату, но помечает сообщение как опубликованное при сохранении, но не смог понять, как настроить его для пользовательского типа сообщения.

Функция ниже.

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post','show', '_future_post_hook');
        add_action('future_post', 'show', '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');
?>
12
curtismchale

Удивительно, комбинируя оба ответа от Майка и Яна, я придумал это, которое работает только для рассматриваемого типа поста. Нам не нужно условие show, потому что хук 'future_show' захватывает только тип поста show и обновляет его.

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_show','_future_post_hook');
        add_action('future_show','publish_future_post_now');
    }

    function publish_future_post_now($id) {
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
6
curtismchale

Я не могу сказать точно, так как у меня нет вашего сайта для тестирования, но я считаю, что вам просто нужно удалить 'show' из вызовов remove_action() и add_action(). Функция wp_publish_post() независима от типов записей, по крайней мере, именно так она выглядит при чтении кода. Так что попробуйте это:

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post', '_future_post_hook');
        add_action('future_post', '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');
?>

Конечно, если вы хотите ограничиться только показами, вы можете захотеть сделать что-то вроде этого (хотя логика будет более сложной, если она понадобится и для других типов постов):

function publish_future_post_now($id) {
    $post = get_post($id);
    if ('show' == $post->post_type)
        wp_publish_post($id);
}

Надеюсь это поможет?

6
MikeSchinkel

Я думаю, что это действие вызывается wp_transition_post_status . Код является:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

Таким образом, для обычных будущих сообщений последним хуком будет future_post, но для вашего типа это будет future_show или что-то еще как ваш слаг типа.

3
Jan Fabry

Если все, что вы хотите сделать, это добавить дополнительную дату для "show times", может быть проще добавить мета-бокс, который делает именно это - использование даты публикации для подделки может быть потенциально проблематичным, поскольку WordPress установит ее "Будущий" статус всякий раз, когда он обновляется с будущей датой публикации (я думаю), поэтому вам придется подключаться каждый раз, когда пост обновляется, чтобы вернуть его обратно. Кроме того, таким образом вы можете зарезервировать "Дата публикации" для того, что он предназначен.

Я бы, вероятно, просто использовал meta_key и собственный мета-блок. Хотя это зависит от того, насколько сложны ваши запросы, которые показывают сообщения.

Если вы установите meta_value как метку времени, вы можете упорядочить по дате показа еще или выбрать до/после определенной даты:

$events = get_posts( 'post_type=events&meta_key=show_time&meta_value=' . strtotime( '+1 week' ) . '&meta_compare=<&orderby=meta_value' );

Получил бы все "события" с показом времени не позже чем через неделю от текущей даты. Примечание: вышеприведенное не проверено, но должно работать :)

1
Joe Hoyle

WP Dev Nacin использует простую функцию переопределения:

remove_action('future_post', '_future_post_hook');
add_filter( 'wp_insert_post_data', 'nacin_do_not_set_posts_to_future' );

function nacin_do_not_set_posts_to_future( $data ) {
    if ( $data['post_status'] == 'future' && $data['post_type'] == 'post' )
        $data['post_status'] = 'publish';
    return $data;
}
0
Adam David