Как пометить запланированную запись как опубликованную в WordPress
Сценарий использования:
У меня есть тип записи, связанный с музыкальным шоу. Время шоу берется из даты публикации записи, которая установлена на будущее время. Я нашел функцию, которая берет запланированные записи блога, оставляет дату, но помечает запись как опубликованную при сохранении, но не смог адаптировать ее для пользовательского типа записи.
Функция приведена ниже.
<?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');
?>

Отлично, объединив оба ответа от 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');
?>

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

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

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

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

Если вам нужно просто добавить дополнительную дату для "времени показа", возможно, будет проще добавить метабокс, который делает именно это - использование даты публикации для имитации может быть потенциально проблематичным, так как 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' );
Этот запрос получит все "события" с временем показа не позднее, чем через неделю от текущей даты. Примечание: Вышеуказанный код не тестировался, но должен работать :)

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

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

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;
}
