Расписание постов для публикации из дат /времени заранее задано администратором
У меня есть сайт с несколькими авторами бейсбола. Я хочу, чтобы авторы имели возможность планировать публикацию постов в одном из четырех выбранных раз в день. Это важно, потому что некоторые авторы пишут реплики игр, а авто-публикация игрового фрагмента после запуска следующей игры довольно бесполезна.
Я ищу плагин для управления этим. Благодаря исследованиям я нашел несколько плагинов, которые будут выбирать время между набором раз, установленным администратором, но я ищу что-то, где Admin может настроить календарь дней /раз (или диапазон раз), чтобы пост, который будет опубликован, и установите максимальное количество сообщений за каждый раз
Автор пишет свое сообщение, затем ему предлагается выбор дат /раз, чтобы запланировать публикацию публикации.
Как я уже упоминал, есть похожие плагины, но ни один из них не позволил админам установить определенные времена.
Кто-нибудь знает о плагине или другом методе? Плагин не должен быть бесплатным.
Обновление с помощью «Видения»
Настройки администратора . Установите даты, разрешенные для публикации публикаций. Установите время, разрешенное для публикации публикаций. Задайте количество сообщений, разрешенных к планированию для публикации в каждый момент времени (если номер планирования был выполнен за каждый слот, он не будет показан Автору).
Параметры планирования авторов : кнопка «Опубликовать» отсутствует. Должен выбрать день недели для публикации post>>> Необходимо выбрать из доступных времен для публикации сообщения.
2 ответа
Мой подход заключается в создании почасового события cron, которое проходит все сообщения о статусе проекта и проверяет дату публикации и час, сохраненные в post_meta, и публикует, если запланированная дата не будет в будущем.
В поле публикации добавляется метаданный даты и времени публикации, который обновляется через ajax при выборе времени.
Обновление:
Добавлен плагин и сборщик дат css в git: https://github.com/c3mdigital/WP- Расписание
Изменена функция cron для использования часового пояса, настроенного в WordPress для публикации.
Обновление:
Дата и время будут сохранены в post_meta как массив: month' => 'string', time => int
Целочисленное время будет значением, которое представляет собой час день 1-24.
Экран параметров имеет 3 входа.
- Время: вводится как числа, разделенные запятыми, представляющие час дня для публикации сообщений.
- Количество публикаций для публикации в любое время
- Даты: массив дат запятой
Я добавил jQuery UI Date Picker на экран редактирования сообщений, который ограничен датами, выбранными администратором. Дата и время обновляются и сохраняются с помощью ajax.
Обновлен код плагина:
<?php
/*
Plugin Name: c3m wp-schedule
Plugin URI:
Description: Gives contributors a jQuery date picker to choose available date and times available to publish posts
Version: 0.1.2
Author: Chris Olbekson
Author URI: http://c3mdigital.com/
License: GPL v2
*/
register_activation_hook( __FILE__, 'c3m_activate_cron' );
add_action( 'post_submitbox_misc_actions', 'c3m_create_schedule_meta', 10 );
add_action( 'admin_print_footer_scripts', 'c3m_echo_js' );
add_action( 'admin_enqueue_scripts', 'c3m_enqueue_scripts' );
function c3m_activate_cron() {
wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'c3m_check_posts' );
}
function c3m_check_posts() {
$args = array(
'post_status' => array( 'draft', 'pending' ),
'posts_per_page' => -1,
);
$timestamp = current_time( 'timestamp' );
$posts = get_posts( $args );
$month = (int) date('m', $timestamp );
$day = (int) date('d', $timestamp );
$hour = (int) date('G', $timestamp );
foreach ( $posts as $post ) {
$date = get_post_meta( $post->ID, '_schedule_date', true );
if ( !$date ) continue;
$sched_date = explode( "-", $date['date'] );
if ( (int) $sched_date[0] > $month ) continue;
if ( (int) $sched_date[1] > $day ) continue;
if ( (int) $sched_date[1] >= $day && (int)$date['time'] > $hour ) continue;
wp_publish_post( $post->ID );
}
}
function c3m_create_schedule_meta() {
global $post_ID;
$date = get_post_meta( $post_ID, '_schedule_date', TRUE );
$options = c3m_get_options ();
$times = $options[ 'c3m_hour_string' ];
$times_available = explode ( ",", $times );
$time_output = "Choose Time to publish<br/>";
$time_output .= "<select class='time-div' name='c3m_sched_time' id='" . $post_ID . "' >\n";
$time_output .= "\t<option value='-1'>" . esc_html ( 'Select Publish Time' ) . "</option>\n";
foreach ( $times_available as $time ) {
$time_output .= "\t<option value='$time'>" . esc_html ( $time ) . "</option>\n";
}
$time_output .= "</select>";
echo '<div id="schedule" class="misc-pub-section" style="border-top-style:solid; border-top-width:1px; border-top-color:#EEEEEE; border-bottom-width:1px;">';
if ( !$date ) {
$output = 'Choose Date to publish';
$output .= "<input class='sched-div datepicker' type='text' name='c3m_sched_date' id='".$post_ID."' />\n";
$output .= '<br /><br /><div id="sched_time_div">'.$time_output.'</div>';
echo $output;
echo '<p id="hidden-p"><a id="save-time" style="margin-left: 10px" class="button">Save</a></p>';
} else {
if ( $date['time'] > 12 ) $pm = 'pm'; else $pm = 'am';
echo '<p style="padding-left: 10px;">Scheduled to publish on: <strong>' . $date['date'] . '</strong><br />';
echo 'At approx: <strong>' . $date['time'].$pm. '</strong><br /></p>';
}
echo '</div>';
}
function c3m_enqueue_scripts() {
global $pagenow, $typenow;
if ( ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) && $typenow == 'post' ) {
wp_enqueue_script( 'jquery-ui-datepicker' );
wp_enqueue_style ( 'jquery-ui-lightness', plugins_url( 'ui-lightness/jquery-ui-1.8.20.custom.css', __FILE__ ) );
}
}
function c3m_echo_js() {
global $pagenow, $typenow;
if ( ( $pagenow=='post.php' || $pagenow=='post-new.php') && $typenow=='post') {
$options = c3m_get_options ();
$dates = $options[ 'c3m_date_string' ];
$find = '/';
$replace = '-';
$dates = str_replace( $find, $replace, $dates );
$days = explode ( ",", $dates );
$year = date ( 'Y' );
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery("#publishing-action").hide();
jQuery(".misc-pub-section-last").hide();
jQuery("a#save-time").click(function() {
var postID = jQuery("#post_ID").val();
var pubDate = jQuery(".sched-div").val();
var theTime = jQuery(".time-div option:selected").val();
console.log( postID, pubDate, theTime );
jQuery.ajax({
type:'POST',
url: ajaxurl,
data: {"action": "save_pub_time", post_id: postID, sched: pubDate, time: theTime },
success: function(response) {
jQuery("#schedule").replaceWith(response);
}
});
return false;
});
var enabledDays = [ <?php foreach( $days as $day ) { ?>
"<?php echo $day.'-'.$year; ?>",
<?php } ?>];
function enableAllTheseDays(date) {
var m = date.getMonth(), d = date.getDate(), y = date.getFullYear();
for (i = 0; i < enabledDays.length; i++) {
if (jQuery.inArray((m + 1) + '-' + d + '-' + y, enabledDays) != -1) {
return [true, ''];
}
}
return [false, ''];
}
jQuery('.datepicker').datepicker({
dateFormat:'mm-dd-yy',
beforeShowDay:enableAllTheseDays
});
});
</script>
<?php }
}
add_action ( 'wp_ajax_save_pub_time', 'c3m_ajax_save' );
function c3m_ajax_save() {
$post_id = $_POST[ 'post_id' ];
$date = $_POST[ 'sched' ];
$time = $_POST[ 'time' ];
if ( $time > 12 ) $pm = 'pm'; else $pm = 'am';
update_post_meta ( $post_id, '_schedule_date', array ( 'date' => $date, 'time' => $time ) );
$output = '<p style="padding-left: 10px;">Scheduled to publish on: <strong>'.$date.'</strong><br />';
$output .= 'At approx: <strong>'.$time. $pm.'</strong></p><br />';
echo $output;
die(1);
}
/**
* @return array
* Array
* (
* [c3m_hour_string] => 11,03,05,07
* [c3m_allowed_string] => 4
* [c3m_date_string] => 05/10,05/11,05/12
* )
*
*/
function c3m_get_options() {
$c3m_options = get_option('c3m_options');
return $c3m_options;
}
add_action( 'admin_menu', 'c3m_create_menu' );
function c3m_create_menu() {
add_options_page( 'Manage Post Schedule', 'Manage Post Schedules', 'manage_options', 'post_schedules', 'c3m_schedule_options' );
}
function c3m_schedule_options() {
echo '<div class="wrap">';
echo '<h2>Manage Post Schedules</h2>';
echo 'Manages the custom post scheduling options';
echo '<form action="options.php" method="post">';
settings_fields( 'c3m_options' );
do_settings_sections( 'post_schedules' );
echo '<input name="Submit" type="submit" class="button-primary" value="Save Changes" />';
echo '</form></div>';
}
add_action( 'admin_init', 'c3m_plugin_init' );
function c3m_plugin_init() {
register_setting( 'c3m_options', 'c3m_options', 'c3m_validate' );
add_settings_section( 'plugin_main', 'Post Schedule Dates and Times', 'settings_array', 'post_schedules' );
add_settings_field( 'c3m_hour_string', 'Enter Post Publish Times (use 2 digit hours seperated by commas. ie 11,16,17 will publish at 11am, 4pm and 5pm):', 'c3m_hour_setting', 'post_schedules', 'plugin_main' );
add_settings_field( 'c3m_allowed_string', 'Enter how many posts can be published at each time: ', 'c3m_allowed_setting', 'post_schedules', 'plugin_main' );
add_settings_field( 'c3m_date_string', 'Enter Publish Dates (use month/day seperated by commas ie: 5/5,5/7 for May 5th and May 7th): ', 'c3m_date_setting', 'post_schedules', 'plugin_main' );
add_settings_field( 'c3m_editor', 'click to load an editor', 'c3m_editor_setting', 'post_schedules', 'plugin_main' );
}
function settings_array() {
echo '<p>Add post schedule date and time settings here</p>';
}
function c3m_hour_setting() {
$options = get_option( 'c3m_options' );
echo "<input id='c3m_hour_string' name='c3m_options[c3m_hour_string]' size='40' type='text' value='{$options['c3m_hour_string']}' />";
}
function c3m_allowed_setting() {
$options = get_option( 'c3m_options' );
echo "<input id='c3m_allowed_string' name='c3m_options[c3m_allowed_string]' size='40' type='text' value='{$options['c3m_allowed_string']}' />";
}
function c3m_date_setting() {
$options = get_option( 'c3m_options' );
echo "<input id='c3m_date_string' name='c3m_options[c3m_date_string]' size='40' type='text' value='{$options['c3m_date_string']}' />";
}
function c3m_validate( $input ) {
$options = get_option( 'c3m_options' );
$options['c3m_hour_string'] = trim( $input['c3m_hour_string'] );
$options[ 'c3m_allowed_string' ] = trim ( $input[ 'c3m_allowed_string' ] );
$options[ 'c3m_date_string' ] = trim ( $input[ 'c3m_date_string' ] );
return $options;
// Todo: Create a real validate function
}
@Todo: создать функцию проверки для сохранения параметров. Создайте параметр подсчета, в котором хранится количество сообщений, запланированных для каждого раза, чтобы ограничить эти моменты после полного завершения и очистить & запишите код.
Вот мой прием: https://github.com/stephenh1988/Restrict-Publish
Это будет сделано в правильном подключаемом модуле и в некоторой точке. На данный момент он «работает», но вы вручную настраиваете переменные подключаемого модуля (т. Е. Никаких параметров администратора еще нет).
Все ограничения распространяются на пользователей без возможности manage_options
(то есть администраторы). Но это также можно изменить.
Пользовательский интерфейс
Идея заключается в загрузке javascript после загрузки WP кода post.js
(сюда входит Java-скрипт, который управляет изменением ввода времени. plug-in over-rides this, нажав «edit» для времени публикации, вместо этого вы можете выбрать jQuery UI date-time picker.
Выбор даты-времени позволяет использовать определенные даты только с некоторыми правилами (см. ниже). Все остальные даты не могут быть выбраны. При выборе даты /времени соответствующие поля WordPress обновляются - и поэтому WordPress обрабатывает остальную часть обработки .
Таким образом, эта часть плагина действительно предотвращает ввод определенных дат.
(Выбор даты-времени слишком мал - что-то, что можно улучшить с помощью jQuery ui positioning).
Проверка на стороне сервера
Он также выполняет проверку на save_post
- на всякий случай (js отключен? hack от пользователя?), а «запрещенная» дата выбрано, обратный вызов save_post
снова проверяет дату. Если он признан недействительным, сообщение «помечено» будет опубликовано /запланировано (в соответствии с этим ответом) и вместо этого возвращается в статус проекта. Появится настраиваемое сообщение (это сообщение можно изменить, установив в настоящий момент $fail_message
).
Правила
Это очень простые вещи. Набор правил хранится в массиве $allows
:
$allow = array(
'days_in_week'=> array(0,2),//Publish on Sunday/Tuesday
'months_in_year'=> array(1,2,3,4,6,7,8,9,10,11,12),//Cannot publish in May
);
'days_in_week' - это массив целых чисел, указывающий, какие дни (0 = воскресенье, 1 = понедельник) пользователь может опубликовать даты. Аналогично, «months_in_year» хранит массив допустимых месяцев (1 = январь, ...). Дополнительные правила могут быть добавлены довольно легко (включая короткий список заданных администратором дат).
Ограничение запланированного сообщения
Существует также переменная $limit
, которая ограничивает количество запланированных сообщений , которые пользователь может иметь. Если они достигают этого предела, они теряют способность публиковать (вместо этого нужно отправить его на проверку - вы можете удалить право даже создавать сообщения, но это также предотвратит редактирование).
Код подключаемого модуля
Смотрите это GitHub Repro: https://github.com/stephenh1988/Restrict-Publish