Помечая будущую датированную публикацию как опубликованную


Пример использования:

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

Функция приведена ниже.

<?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');
?>
Author: Krzysiek Dróżdż, 2010-08-12

5 answers

Потрясающе сочетая оба ответа от Майка и Яна, я придумал это, которое работает только с типом сообщения, о котором идет речь. Нам не нужно условие показа, потому что крючок "future_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');
?>
 7
Author: curtismchale, 2013-12-11 20:52:02

Я не могу сказать наверняка, так как у меня нет вашего сайта для тестирования, но я считаю, что вам просто нужно удалить '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);
}

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

 7
Author: MikeSchinkel, 2013-12-11 20:53:27

Я думаю, что это действие вызывается 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 или каков бы ни был ваш тип слизняка.

 4
Author: Jan Fabry, 2010-08-12 12:36:45

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

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

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

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

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

 1
Author: Joe Hoyle, 2010-08-12 15:36:35

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
Author: Adam David, 2014-02-03 10:17:24