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

Опубликовано: 01.09.2018

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


Words at War: The Hide Out / The Road to Serfdom / Wartime Racketeers

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

<?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. Планирование постов на один год вперед для не угнетает мое чувство прекрасного.

rss