Більше результатів...

Загальні селектори
Тільки точні збіги
Шукати у заголовках
Шукати у контенті
Вибір типів постів
Фільтрувати за категоріями
FAQ
Hostenko
Натхнення
Відео уроки
Новини
Плагіни
Теми
Уроки
Хакі

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

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

inet.ws - Powerful VPS Hosting в США, Canada, UK та DE!

Було б набагато простіше, якщо при створенні подібних постів ми могли б задати їх термін дії, після закінчення якого вони б не відображалися на сайті.

Дивіться також:

У цьому уроці ми покажемо вам, як саме це зробити, виконавши всього три кроки:

  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 Posts
Plugin URI: http://.tutsplus.com/tutorials/add-an-expiry-date-to-wordpress-posts--cms-22665
Description: Adds an expiry date to posts, using a the jQuery UI datepicker
Author: Rachel McCollin
Version: 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': функція "зворотного виклику", яка заповнюватиме метабокс (ми створимо її далі)
  • 'після': тип посту, на екрані редагування якого буде виводитись наш метабокс
  • 'сторона': у якій частині екрана з'явиться метабокс
  • 'висока': на якій позиції з'явиться метабокс

Функція потім прикріплюється до хука 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(), з $ пост як аргумент.
  • Відкриває елемент форми.
  • Створює змінну $tutsplus_expiry_date зі значенням мета-ключа.
  • Створює ярлик для поля метабоксі.
  • Створює вхідний елемент із класом MyDate, який необхідний для роботи Вибір дати, ім'я 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 для безпеки

Щоб переконатися, що метадані посту редагуються лише за допомогою цієї форми, ми додамо спеціальне поле нунцій.

У функції зворотного зв'язку (перед кодом функції, що вже існує) додайте наступне:

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, інакше використовуватимете скрипт у фронтенді.

Далі потрібно додати скрипт, який виводить вашу форму у функцію зворотного зв'язку. Після введення елемента та перед закриваючим тегом </форму> Вставте наступний код:

<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, як сьогоднішню дату, використовуючи те саме форматування дати, що і Вибір дати.
  • Потім задає $metaquery для виключення постів, чий термін дії вже минув, використовуючи оператор порівняння.
  • Надсилає запит, використовуючи змінну $metaquery.

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

Тепер збережіть файл плагіна і спробуйте запустити його. Створіть посаду з датою публікації, що вже минула, і минулою датою закінчення терміну дії. Збережіть його та перейдіть до головної сторінки блогу. Ви знаєте, що пост, який ви щойно створили, не існує!

Висновок

Мати подібний плагін, який автоматично виключатиме застарілі пости з вашого сайту, дуже зручно. Якщо вміст посту в якийсь момент стає неактуальним, вам не доведеться постійно нагадувати собі, що потрібно його видалити або редагувати.

Використовуючи jQuery datepicker, ви створили зручний метабокс, який допоможе заощадити час і уникнути плутанини вашим користувачам.

Джерело: code.tutsplus.com
inet.ws - Powerful VPS Hosting в США, Canada, UK та DE!
Олексій Шевченко
редактор wpcafe
Вивчає сайтобудування з 2008 року. Практикуючий вебмайстер, що спеціалізується на створенні сайтів WordPress. Задати питання Олексію можна на https://profiles.wordpress.org/wpthemeus/

Коментарі до запису: 2

Alex:

Зробив. Але б'є помилку 500, коли публікую пост. І ще питання. Зробіть розгорнутий пост на цю ж тему тільки з можливістю не тільки приховувати а й відкривати пости. І ще на тему «як активувати заслання у певний час. наприклад у пості є кнопка (посилання) але потрібно щоб вона клацалася тільки у вказаний за умовчанням час (наприклад 19:50)

Тарас:

Жерсть, після активації пише немає сторінки, на всіх.
Що скажете?

Додати коментар або відгук