Как пометить запланированную запись как опубликованную в WordPress

12 авг. 2010 г., 06:33:45
Просмотры: 14.2K
Голосов: 14

Сценарий использования:

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

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

<?php
    function setup_future_hook() {
        // Заменяем стандартную функцию future_post на нашу версию
        remove_action('future_post','show', '_future_post_hook');
        add_action('future_post', 'show', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Устанавливаем статус новой записи как "publish" вместо "future"
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
1
Комментарии

Возможно, у вас ошибка в вызовах remove_action и add_action? Второй параметр у вас 'show', но разве там не должна быть функция, которую вы добавляете или удаляете?

Jan Fabry Jan Fabry
12 авг. 2010 г. 15:36:02
Все ответы на вопрос 5
0

Отлично, объединив оба ответа от Mike и Jan, я пришел к этому решению, которое работает только с нужным типом записи. Нам не нужно условие show, потому что хук 'future_show' обрабатывает только тип записи show и обновляет именно его.

<?php
    function setup_future_hook() {
        // Заменяем стандартную функцию future_post на нашу
        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');
?>
13 авг. 2010 г. 01:05:15
3

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

<?php
    function setup_future_hook() {
        // Заменяем стандартную функцию future_post на нашу
        remove_action('future_post', '_future_post_hook');
        add_action('future_post', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Устанавливаем статус новой записи как "publish" вместо "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);
}

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

12 авг. 2010 г. 20:02:13
Комментарии

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

curtismchale curtismchale
13 авг. 2010 г. 00:47:57

Я несколько раз прочитал ваш вопрос, но мне все еще не совсем понятно, чего именно вы пытаетесь достичь, если игнорировать предложенный код, который не работает. Можете уточнить, что именно вы пытаетесь сделать? Вы хотите опубликовать запись в дату/время, указанное в post_date, или что-то другое? Или вы уже решили эту проблему?

MikeSchinkel MikeSchinkel
13 авг. 2010 г. 01:16:44

Проблема уже решена (я предоставил код ниже). Я просто хотел опубликовать запись пользовательского типа, даже если она запланирована на будущее.

curtismchale curtismchale
13 авг. 2010 г. 05:45:20
0

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

12 авг. 2010 г. 15:36:45
3

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

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

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

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

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

12 авг. 2010 г. 18:36:35
Комментарии

Я полностью согласен - гораздо лучше использовать мета-бокс, чем использовать дату публикации в качестве костыля для даты события.

Travis Northcutt Travis Northcutt
12 авг. 2010 г. 18:53:25

Да, мета-бокс подойдет, но мне было сложно добавить удобный jQuery-виджет выбора даты и времени. Встроенный в WP оказался намного лучше всего, что я мог придумать.

curtismchale curtismchale
13 авг. 2010 г. 01:06:24

Плагин WP Easy Post Types предоставляет пользовательское поле для даты и простой выбор даты, я сам использовал его для функции списка событий.

Rick Curran Rick Curran
17 авг. 2010 г. 00:47:06
1

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;
}
3 февр. 2014 г. 11:58:32
Комментарии

Пожалуйста, добавьте некоторое объяснение, как это работает.

Nicolai Grossherr Nicolai Grossherr
3 февр. 2014 г. 12:20:43