Вариант использования:
У меня есть тип сообщения, который относится к музыкальному шоу. «Время показа» определяется по дате публикации поста, которая устанавливается на какое-то время в будущем. Я нашел функцию, которая берет будущие посты в блоге и оставляет дату, но помечает пост как опубликованный при сохранении, но не смог понять, как настроить его для пользовательского типа поста.
Функция ниже.
<?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');
?>
Возможно ли, что у вас есть ошибка в вашем
remove_action
иadd_action
вызова? Ваш второй параметр —'show'
, но разве это не должна быть функция, которую вы добавляете или удаляете?Да, первый фрагмент кода — это то, с чего я начал, и он работает с обычными сообщениями WordPress, но если вы добавите условие «show», он не будет работать ни с чем. Даже без условного условия он не работает с пользовательским типом записи.
Я прочитал ваш вопрос несколько раз, но мне все еще неясно, чего именно вы пытаетесь достичь, если мы проигнорируем предложенный код, который не работает. Можете ли вы уточнить, чего именно вы пытаетесь достичь? Вы хотите опубликовать пост в дату/время, указанное в post_date, или что-то другое? Или уже решил?
Это уже решено (я предоставил код ниже). Я просто хотел опубликовать сообщение пользовательского типа, даже если оно запланировано на будущее.
Я согласен с этим на 100% — гораздо лучше использовать метабокс, чем использовать дату публикации в качестве хака для даты события.
Да, meta_box будет работать, но мне было трудно добавить хороший инструмент выбора даты и времени jQuery. Стандартный WP был намного лучше, чем все, что я мог придумать.
Плагин WP Easy Post Types предоставляет настраиваемое поле даты и предоставляет простой выбор даты, я сам использовал его для функции списка событий.
Пожалуйста, добавьте некоторое объяснение, как это работает.
Удивительно, объединив ответы Майка и Яна. Я придумал это, которое работает только для рассматриваемого типа сообщения. Нам не нужно условное выражение show, потому что хук ‘future_show’ захватывает только тип сообщения show и обновляет его.
Я не могу сказать наверняка, так как у меня нет вашего сайта для тестирования, но я считаю, что вам просто нужно удалить
'show'
изremove_action()
иadd_action()
звонки. Функцияwp_publish_post()
независима от типов сообщений, по крайней мере, так кажется при чтении кода. Итак, попробуйте следующее:Конечно, если вы хотите ограничиться только созданием шоу, вы можете сделать что-то вроде этого (хотя логика будет более сложной, если вам нужно, чтобы она работала и с другими типами сообщений):
Надеюсь это поможет?
Я думаю, что это действие вызывается
wp_transition_post_status
. Код:Таким образом, для обычных будущих сообщений последним хуком будет
future_post
, но для вашего типа это будетfuture_show
или какой-либо другой слаг вашего типа.Если все, что вы хотите сделать, это добавить дополнительную дату для «времени показа», может быть проще добавить мета-поле, которое делает именно это — использование даты публикации для подделки может быть потенциально проблематичным, поскольку 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' );
Получал бы все «события» с временем показа не позднее, чем через неделю с текущей даты. Примечание. Вышеприведенное не проверено, но должно работать 🙂
WP Dev Nacin использует простое переопределение функции: