Запретить планировать пост больше чем на год в WordPress

В случае если над блогом работают несколько редакторов, у пользователей есть возможность писать гостевые посты либо в подобных похожих ситуациях, бывает случаются оказии когда статьи планируется на неадекватно далекое будущее. Например бы я запланировал/отложил до лучших времен это пост, скажем на 2056 год то то как минимум он бы потерял актуальность, а возможно до его публикации дожили бы не все мои знакомые. Но даже если не брать в расчет такие маргинальные сценарии то есть и другие минусы, каждый раз когда я создаю пост на несколько лет вперед и после этого добавляю скажем миниатюру поста то в каталоге загрузок WordPress создается новый каталог совпадающий с годом указанным в посте и в него уже загружается изображение миниатюры и после того как гипотетический, абстрактный я в вакууме сменит год на более подходящий и опубликует запись то в url миниатюры (при дефолтных настройках WordPress ) все равно останется 2056 год от рождества христова, что не устраивает моего внутреннего перфекционистка. А если подобных постов становится много то буквально все становится хуже: выпадающие списке фильтров в админке становятся хуже, труднее прикинуть количество медиафайлов загруженных за определенный промежуток времени, директория загрузок на сервере смотрится не красиво…

Поэтому вместо разговоров и психологического давления на редакторов (мы ведь все гуманные люди), предлагаю прибегнуть к техническим средствам воздействия, для этого на досуге я придумал написать немного кода не дающей запланировать пост на слишком далекое будущее.

<?php
/*
Plugin Name: Bad date fix
Plugin URI: http://alkoweb.ru/
Version: 1.0
Author: petrozavodsky
Author URI: http://alkoweb.ru
*/
class Fix_Time_Featured_Posts
{
    private $query_param ='bad_time';
    public function __construct()
    {
        add_action('save_post', array($this, 'save_post'), 10, 1);
        add_action('admin_notices', array($this, 'admin_notices'));
    }

    public function save_post($ID)
    {
        if ($parent_id = wp_is_post_revision($ID)) {
            $ID = $parent_id;
        }

        $post_time_unix = get_post_time('U', true, $ID);
        $current_time = current_time('Y-m-d H:i:s');
        $date = new DateTime($current_time);
        $date->add(new DateInterval('P1Y'));
        $current_time_plus_unix = $date->format('U');
        if (intval($post_time_unix) > intval($current_time_plus_unix) || intval($post_time_unix) < 0) {
            $new_post_date = $date->format('Y-m-d H:i:s');
            $new_post_date_gmt = get_gmt_from_date($date->format('Y-m-d H:i:s'));
            remove_action('save_post', array($this,'save_post'));
            wp_update_post(array('ID' => $ID, 'post_date' => $new_post_date, 'post_date_gmt' => $new_post_date_gmt));
            add_filter('redirect_post_location', array($this, 'add_notice_query_var'), 99);
            add_action('save_post', array($this,'save_post'));
        }
    }

    public function add_notice_query_var($location)
    {
        remove_filter('redirect_post_location', array($this, 'add_notice_query_var'), 99);
        return add_query_arg(array($this->query_param => 'ID'), $location);
    }

    public function admin_notices()
    {
        if (!isset($_GET[$this->query_param])) {
            return;
        }
        $message = '';
        $message .= "Нельзя запланировать более чем на год. ";
        $message .= "Дата публикации поста немного скорректирована ";
        echo '<div id="notice" class="notice notice-warning is-dismissible"> <p>' . $message . '</p>';
        echo '<button class="notice-dismiss" type="button">';
        echo '<span class="screen-reader-text">' . $message . '</span>';
        echo '</button>';
        echo '</div>';
    }
}

new Fix_Time_Featured_Posts();

Так как я опасаюсь за что мой небольшой плагин может нарушить каких либо либеральных свобод пользователя и особенно может ограничить свободу самовыражаться то рекомендую то советую не устанавливать его как обычный плагин, а поместить в каталог /wp-content/mu-plugins дабы даже администраторы сайта не могли его отключить.

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

P.S. Планирование постов на один год вперед для не угнетает мое чувство прекрасного.

2 Комментариев

  1. Ох, ну и заморочка!
    Я просто подгружаю картинки до того как указала дату публикации.
    В таком вариант картинка грузитс в папку с сегодняшней датой, а дата поста потом может быть любой

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

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