Как добавить дату истечения срока показа для записи WordPress

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

Но у баннеров есть срок действия. К примеру, они содержат информацию о предстоящем событии или вакансии. После того, как событие прошло или вакансия была закрыта, мы должны возвращаться на веб-сайт и вручную убирать неактуальную информацию.

Было бы гораздо проще, если при создании подобных записей, мы могли бы задать их срок действия, после истечения которого, они бы не выводились на веб-сайте.

Смотрите также:

  • Как ограничить число символов в заголовках записей WordPress
  • Как ограничить доступ авторам WordPress к некоторым рубрикам в админке
  • Как показать число просмотров записей на WordPress веб-сайте
  • Как добавить постраничную навигацию на WordPress
  • Как вывести последние записи из каждой рубрики WordPress на одной странице

В этом уроке мы покажем вам, как сделать это, выполнив всего три шага:

  1. Создать метабокс на экране редактирования поста для даты истечения срока действия.
  2. Подключить JQuery UI DatePicker к метабоксу для улучшения интерфейса.
  3. Использовать хук pre_get_posts для того, чтобы неактуальные сообщения не выводились.

Что вам понадобится

Для прохождения этого урока вам потребуется:

  • админ доступ к WordPress
  • редактор кода

Вы самостоятельно создадите плагин и активируете его на веб-сайте. Поэтому давайте приступим!

| Скачать исходники плагина |

Параметр плагина

Прежде всего надо создать сам плагин. В папке с плагинами в директории wp-content создайте пустой файл с именем tutsplus-post-expiry-date-php.

Откройте файл в редакторе кода и вставьте туда следующее:

<?php/*Plugin Name: Add an Expiry Date to PostsPlugin URI: http://.tutsplus.com/tutorials/add-an-expiry-date-to-wordpress-posts--cms-22665Description: Adds an expiry date to posts, using a the jQuery UI datepickerAuthor: Rachel McCollinVersion: 1.0 */

Вы должны будете отредактировать файл, используя имя и URL плагина. Код выше — это инструкция для плагина, которая говорит что он будет делать в дальнейшем.

Сейчас перейдите в меню Плагины в админке WordPress и активируйте плагин.

Создание метабокса

Мы собираемся создать метабокс для даты истечения срока действия.

Использование add_meta_box() для выведения метабокса

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

function tutsplus_add_expiry_date_metabox() { add_meta_box( 'tutsplus_expiry_date_metabox', __( 'Expiry Date', 'tutsplus'),       'tutsplus_expiry_date_metabox_callback',         'post',         'side',         'high');}add_action( 'add_meta_boxes', 'tutsplus_add_expiry_date_metabox');

Мы использовали возможность add_meta_box(), которая принимает шесть аргументов:

  • ‘tutsplus_expiry_date_metabox’: уникальный ID этого метабокса
  • __( ‘Expiry Date’, ‘tutsplus’): выводится, как название метабокса
  • ‘tutsplus_expiry_date_metabox_callback’: функцию «обратного вызова», которая будет заполнять метабокс(мы создадим ее дальше)
  • ‘post’: тип поста, на экране редактирования которого будет отображаться наш метабокс
  • ‘side’: в какой части экрана появится метабокс
  • ‘high’: на какой позиции появится метабокс

Функцию далее прикрепляется к хуку add_meta_boxes, который активирует ее в нужное время.

Создание Callback-функции

Если бы вы захотели сохранить плагин и загрузить его теперь, то увидели бы сообщение об ошибке, поскольку функцию обратной связи ещё не задана. Нам необходимо это исправить.

Скопируйте следующий программный код в файл плагина:

function tutsplus_expiry_date_metabox_callback( $post) {?>         <form action="" method="post">                 <?php                //retrieve metadata value if it exists        $tutsplus_expiry_date = get_post_meta( $post->ID, 'expires', true);?>                 <label for "tutsplus_expiry_date"><?php __('Expiry Date', 'tutsplus');?></label>                         <input type="text" class="MyDate" name="tutsplus_expiry_date" value=<?php echo esc_attr( $tutsplus_expiry_date);?> / >                     </form>     <?php }

Давайте разберемся, что данный программный код делает:

  • Он определяет возможность обратной связи tutsplus_expiry_date_metabox_callback(), с $post в виде аргумента.
  • Открывает элемент формы.
  • Создает переменную $tutsplus_expiry_date со значением мета-ключа.
  • Создает ярлык для поля ввода в метабоксе.
  • Создает входной элемент с классом MyDate, который необходим для работы DatePicker, имя tutsplus_expiry_date, которое мы будем использовать позже при сохранении данных из области, и значение $tutsplus_expiry_date.
  • Закрывает форму.

Сейчас у нас есть форма, но на данном этапе она ещё ничего не будет делать. Для дальнейшей работы нам необходимо создать ещё одну возможность для сохранения данных.

Сохранение данных в Post Save

Чтобы сохранить любые вводимые в форму данные, мы должны создать возможность, а далее добавить ее в хук save_post.

В файл плагина добавьте код:

function tutsplus_save_expiry_date_meta( $post_id) {         // Check if the current user has permission to edit the post. */    if(!current_user_can( 'edit_post', $post->ID))    return;         if( isset( $_POST['tutsplus_expiry_date']) ) {                $new_expiry_date = ( $_POST['tutsplus_expiry_date'] );        update_post_meta( $post_id, 'expires', $new_expiry_date );          }     }add_action( 'save_post', 'tutsplus_save_expiry_date_meta' );

Программный код выполняет следующее:

  • Проверяет, имеет в себя ли текущий посетитель функция редактировать данный пост.
  • Если да, то проверяет, были ли добавлены данные в метабокс с помощью IsSet.
  • Если да, то создает переменную с именем $new_expiry_date.
  • Обновляет метаданные поста с полученными значениями.

Сейчас у нас есть метабокс, который сможет посетителям добавлять текст и сохранять его в метаданные поста. Давайте сделаем его более безопасным.

Добавление Nonce для безопасности

Чтобы убедиться, что метаданные поста редактируются только при помощи данной формы, мы добавим специальное поле ввода nonce.

В возможности обратной связи (перед существующим там кодом возможности) добавьте следующее:

wp_nonce_field( 'tutsplus_expiry_date_metabox_nonce', 'tutsplus_nonce' );

Далее, в возможности tutsplus_save_expiry_date_meta() для сохранения данных добавьте следующий программный код в начало возможности:

if( !isset( $_POST['tutsplus_nonce'] ) ||    !wp_verify_nonce( $_POST['tutsplus_nonce'],    'tutsplus_expiry_date_metabox_nonce'    ) ) return;

Сейчас сохраните плагин и взгляните на пост на экране редактирования. Вы увидите метабокс:

Как добавить дату истечения срока показа для записи WordPress

Это хорошее начало, но проблема в том, что на данный момент это обычное текстовое поле ввода, и нет никакой гарантии, что посетители будут вводить корректные данные в него. Мы исправим это, добавив jQuery UI datepicker.

Добавление JQuery UI Datepicker

Спешим обрадовать, что jQuery UI datepicker предустановлен в WordPress, поэтому вам не необходимо регистрировать или устанавливать его отдельно: вам только необходимо будет поставить его в очередь на подключение в возможности.

В верхней части файла плагина добавьте программный код:

function tutsplus_load_jquery_datepicker() {        wp_enqueue_script( 'jquery-ui-datepicker' );    wp_enqueue_style( 'jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css' );}add_action( 'admin_enqueue_scripts', 'tutsplus_load_jquery_datepicker' );

Это включит в очередь сам скрипт и таблицу стилей для него, которая хранится на API Google. Обратите внимание, что вы должны подключить его к хуку admin_enqueue_scripts, а не к wp_enqueue_scripts, иначе будете использовать скрипт во фронтэнде.

Далее необходимо добавить скрипт, который отображает форму в возможность обратной связи. После ввода элемента и перед закрывающим тегом </form> вставьте следующий код:

<script type="text/javascript">    jQuery(document).ready(function() {        jQuery('.MyDate').datepicker({            dateFormat : 'dd-mm-yy'        });    });</script>  

Тут идет ссылка на класс MyDate, который вы добавили.

Ваша функцию обратной связи будет выглядеть так:

function tutsplus_expiry_date_metabox_callback( $post ) { ?>         <form action="" method="post">                 <?php                // add nonce for security wp_nonce_field( 'tutsplus_expiry_date_metabox_nonce', 'tutsplus_nonce' );                 //retrieve metadata value if it exists        $tutsplus_expiry_date = get_post_meta( $post->ID, 'expires', true );        ?>                 <label for "tutsplus_expiry_date"><?php __('Expiry Date', 'tutsplus' ); ?></label>                         <input type="text" class="MyDate" name="tutsplus_expiry_date" value=<?php echo esc_attr( $tutsplus_expiry_date ); ?> / >                 <script type="text/javascript">            jQuery(document).ready(function() {                jQuery('.MyDate').datepicker({                    dateFormat : 'dd-mm-yy'                });            });        </script>                  </form>     <?php }

Сейчас давайте взглянем на то, как выглядит метабокс после того, как мы сохранили наш файл плагина:

Как добавить дату истечения срока показа для записи WordPress

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

Скрываем пост после истечения его срока показа

Далее нам необходимо настроить основной запрос, используя хук pre_get_posts.

Все в том же файле плагина, добавьте этот программный код:

function tutsplus_filter_expired_posts( $query ) {         // doesn't affect admin screens if ( is_admin() )        return;    // check for main query if ( $query->is_main_query() ) {         //filter out expired posts        $today = date('d-m-Y');        $metaquery = array(            array(                 'key' => 'expires',                 'value' => $today,                 'type' => 'DATE',                 'compare' => '<'            )        );        $query->set( 'meta_query', $metaquery );    }}add_action( 'pre_get_posts', 'tutsplus_filter_expired_posts' );

Программный код будет выполнять следующее:

  • Определяет возможность tutsplus_filter_expired_posts() и $query в виде ее аргумента.
  • Проверяет, находимся ли мы на экранах администратора.
  • Далее проверяет, запущен ли основной запрос.
  • Если да, то задает переменную $today, как сегодняшнюю дату, используя то же самое форматирование даты, что и DatePicker.
  • Далее задает $metaquery для исключения записей, чей срок действия истек, используя оператор сравнения.
  • Отправляет запрос, используя переменную $metaquery.

Функцию подключена к pre_get_posts, которая поможет ей извлекать необходимые записи.

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

Заключение

Иметь подобный плагин, который будет автоматом исключать устаревшие записи с веб-сайта, удобно. Если содержимое поста в какой-то момент становится неактуальным, вам не придется постоянно напоминать себе, что необходимо удалить его или редактировать.

Используя jQuery datepicker, вы создали удобный метабокс, который поможет сэкономить время вам и избежать путаницы посетителям.

Источник: code.tutsplus.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *