Любая запись в WP имеет дату начала публикации, причем если поставить будущее время — то запись будет запланирована. Также у записи есть дата изменения (modified). В данной статье будет накапливаться материал связанный с манипуляциями записей с помощью времени.
Записи будущего
Записям с датой публикации в будущем временем wordpress присваивает статус future. Данные записи можно вывести в цикле по параметру ‘post_status’ => ‘future’. Но записи со статусом future не доступны во фронтенде посетителям, их могут видеть лишь зарегистрированные пользователи.
Чтобы записи будущего публиковались и были доступны всем, необходимо применить функцию
function publikacia_zapisi_v_buduchem($aidishka, $zapis) { global $wpdb; if ( $zapis->post_status == 'future' ) : $wpdb->update($wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $aidishka )); wp_clear_scheduled_hook('publish_future_post', $aidishka); endif; } add_action('save_post', 'publikacia_zapisi_v_buduchem', 10, 2);
Но чтобы она применилась к уже существующим записям их нужно обновлять.
Но как теперь вывести отдельно записи будущего? Ведь вышеописанная функция меняет им статус на published. Выводить подобные записи нужно запросом:
<ul> <?php $args = array( 'posts_per_page' => 3, 'date_query' => array( array( 'after' => 'now', 'before' => array( 'year' => 2020, 'month' => 12, 'day' => 31, ), 'inclusive' => true, ), ), ); $lastposts = get_posts( $args ); foreach( $lastposts as $post ){ setup_postdata($post); ?> <li class="<?php echo get_post_class(); ?>"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php } wp_reset_postdata(); ?> </ul>
Дата отмены публикации
Для того чтобы дате можно было задать дату и время окончания публикации необходимо воспользоваться плагином Post Expirator (70 000 загрузок). После установки, у всех записей (в т.ч. у записей пользовательских типов) добавится блок настроек окончания публикации (дата и время).
В настройках можно задать какой статус присваивать записям после окончания публикации (по-умолчанию они переводятся в черновики).
Массовое изменение даты публикации
При массовом редактировании записей отсутствует параметр изменения даты публикации. Изменим это, добавив данный параметр в панель массового редактирования.
Необходимо создать скрипт admin-script.js
jQuery(document).ready(function($){ $('.inline-edit-col-right .inline-edit-col') .append( '<label style="margin-top: 3em;"><span class="title">Date</span>' + '<div class="timestamp-wrap"><select name="mm">' + '<option value="00">Month</option>' + '<option value="01">01-January</option>' + '<option value="02">02-February</option>' + '<option value="03">03-March</option>' + '<option value="04">04-April</option>' + '<option value="05">05-May</option>' + '<option value="06">06-June</option>' + '<option value="07">07-July</option>' + '<option value="08">08-August</option>' + '<option value="09">09-September</option>' + '<option value="10">10-October</option>' + '<option value="11">11-November</option>' + '<option value="12">12-December</option>' + '</select>' + '<input type="text" autocomplete="off" name="jj" maxlength="2" size="2" value="d" placeholder="d">' + ', <input type="text" autocomplete="off" name="aa" maxlength="4" size="4" value="Y" placeholder="Y">' + '@ <input type="text" autocomplete="off" name="hh" maxlength="2" size="2" value="H" placeholder="H">' + ' : <input type="text" autocomplete="off" name="mn" maxlength="2" size="2" value="i" placeholder="i"></div></label>' ); });
Далее подключаем созданный скрипт и создаем функцию
function my_enqueue() { wp_enqueue_script('my_admin_script', get_bloginfo('template_url') . '/js/admin-script.js', array('jquery'), false, true); } add_action('admin_init', 'my_enqueue'); function my_bulk_edit($action, $result){ if ('bulk-posts' == $action && $_GET['mm']!='00' && isset($_GET['jj']) && isset($_GET['aa']) && isset($_GET['hh']) && isset($_GET['mn']) ) { $date = $_GET['aa'].'-'.$_GET['mm'].'-'.$_GET['jj'].' '.$_GET['hh'].':'.$_GET['mn'].':00'; $post_date = date("Y-m-d H:i:s", strtotime($date)); $post_date_gmt = gmdate("Y-m-d H:i:s",strtotime($date)); $post_status = (strtotime($post_date) > strtotime(date("Y-m-d H:i:s")))? 'future' : 'publish'; $post_IDs = array_map('intval', (array) $_GET['post']); foreach ($post_IDs as $post_ID) { $post_data = array( 'ID' => $post_ID, 'post_date' => $post_date, 'post_date_gmt' => $post_date_gmt, 'post_status' => $post_status, 'edit_date' => true ); //wp_insert_post( $post_data ); wp_update_post( $post_data ); } } } add_action('check_admin_referer', 'my_bulk_edit', 10, 2);
add_action(‘admin_init’, ‘my_enqueue’); — подключение скриптов для админки