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

13

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

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

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

<?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');
?>
curtismchale
источник
1
Возможно, у вас есть ошибка в вашем remove_actionи add_actionпозвонить? Ваш второй параметр 'show', но разве это не та функция, которую вы добавляете или удаляете?
Ян Фабри

Ответы:

7

Удивительно, сочетая оба ответа от Майка и Яна, я придумал это, которое работает только для рассматриваемого типа поста. Нам не нужно условие 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');
?>
curtismchale
источник
7

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

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

MikeSchinkel
источник
Да, первый фрагмент кода - это то, с чего я начал, и он работает на обычных постах WordPress, но если вы добавите условное выражение 'show', оно ни к чему не будет работать. Даже без условного он не работает с пользовательским типом поста.
curtismchale
Я прочитал ваш вопрос несколько раз, но мне все еще неясно, чего именно вы пытаетесь достичь, если мы игнорируем предложенный код, который не работает. Можете ли вы уточнить, что именно вы пытаетесь достичь? Вы хотите опубликовать пост с указанием даты / времени в post_date или чем-то еще? Или ты уже решил это?
MikeSchinkel
Это уже решено (я предоставил код ниже). Я просто хотел опубликовать пользовательский пост, даже если он запланирован на будущее.
curtismchale
4

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

Ян Фабри
источник
1

Если все, что вы хотите сделать, это добавить дополнительную дату для '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' );

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

Джо Хойл
источник
Я согласен с этим на 100% - гораздо лучше использовать метабокс, чем использовать дату публикации в качестве хака для даты события.
Трэвис Норткатт
Да, meta_box будет работать, но мне было трудно добавить хороший указатель даты и времени в jQuery. Стандартный WP был намного лучше, чем все, что я мог придумать.
curtismchale
Плагин WP Easy Post Types предоставляет настраиваемое поле даты и предоставляет простое средство выбора даты, я сам использовал его для функции составления списка событий.
Рик Керран
0

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;
}
Адам Давид
источник
Пожалуйста, добавьте некоторые объяснения, как это работает.
Николай