安排发布帖子的起始日期/时间由管理员预先设置

时间:2012-04-27 作者:Travis Pflanz

我有一个多作者的棒球网站。我希望作者能够安排每天四次中的一次发布帖子。这一点很重要,因为一些作者编写游戏摘要,而在接下来的游戏开始后自动发布游戏摘要是毫无价值的。

我正在寻找一个插件来管理这个。通过研究,我发现了一些插件,可以在管理员设置的一组时间之间选择一个时间,但我正在寻找一些管理员可以设置日历的天数/时间(或时间范围),以允许发布帖子,并为每次设置最大帖子数

作者写了他的文章,然后会选择一些日期/时间来安排文章的发布时间。

正如我提到的,有类似的插件,但我发现没有一个允许管理员设置特定时间的插件。

有人知道插件或其他方法吗?插件不需要免费。

使用“更新”;愿景

Admin settings: 设置允许发布后的日期。设置允许发布后的时间。设置每次允许计划发布的帖子数量(如果每个插槽都满足了计划数量,则不会向作者显示)。

Author scheduling options: "E;“发布”;按钮不存在。必须选择星期几发布帖子>&燃气轮机;必须从可用时间中选择以发布帖子。

2 个回复
最合适的回答,由SO网友:Chris_O 整理而成

我的方法是创建一个每小时一次的cron事件,它循环遍历所有草稿状态帖子,并检查post\\u meta中保存的发布月份和时间,如果计划日期不在将来,则进行发布。

将发布日期和时间选择元框添加到发布div中,选择时间后通过ajax进行更新。

更新:

在git中添加了插件和日期选择器css:https://github.com/c3mdigital/WP-Schedule

将cron函数更改为使用WordPress中配置的时区进行发布。

更新:

日期和时间将以数组形式存储在post\\u meta中:month\' => \'string\', time => int 时间整数将是表示一天中1-24小时的值。

选项屏幕有3个输入。

次数:以逗号分隔的数字输入,表示一天中发布帖子的时间

我向后期编辑屏幕添加了一个jQuery UI日期选择器,该屏幕仅限于在管理中选择的日期。使用ajax更新和保存日期和时间。

enter image description here enter image description here

enter image description here

更新的插件代码:

 <?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:创建用于保存选项的验证函数,创建计数选项,该选项存储每次安排的帖子数量,以限制这些时间(一旦满),并清理(&;记录代码。

SO网友:Stephen Harris

以下是我的看法:https://github.com/stephenh1988/Restrict-Publish

这将被制作成一个合适的插件和一些要点。目前,它可以“工作”,但您可以手动配置插件变量(即,还没有管理选项)。

所有限制适用于不具备以下能力的用户:manage_options (即管理员)。但这也可以改变。

UI的想法是在WP加载之后加载javascriptpost.js (这包括控制更改时间输入的java脚本。插件超越了这一点,单击发布时间的“编辑”打开了一个jQuery UI日期时间选择器。

在给定一些规则的情况下,日期时间选择器仅允许某些日期可用(请参见下文)。无法选择所有其他日期。在选择日期/时间时,相应的WordPress字段会被更新,因此WordPress会处理其余的处理过程。

因此,插件的这一部分实际上只防止输入某些日期。

(日期-时间选择器的位置有点太低了-可以使用jQuery ui定位进行优化)。

服务器端检查它还对save_post - 以防万一(js禁用?用户黑客?)选择“禁止”日期后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\\u in\\u week”是一个整数数组,用于指示用户可以发布日期的日期(0=周日,1=周一)。类似地,“months\\u in\\u year”存储允许的月份数组(1=1月,…)。可以很容易地添加额外的规则(包括管理员指定日期的短名单)。

限制计划后发时间$limit 变量,用于限制用户可以拥有的计划帖子数。如果他们达到了这个限制,他们就失去了发布的能力(相反,他们必须提交审查——你甚至可以取消创建帖子的权利,但这也会阻止编辑)。

插件代码参见此GitHub复制:https://github.com/stephenh1988/Restrict-Publish

结束

相关推荐