web-dev-qa-db-ja.com

管理者が事前に設定した日時から公開する投稿のスケジュール

私は複数著者の野球サイトを持っています。私は投稿者が毎日4つの選択された時間のうちの1つで公開されるように投稿をスケジュールできるようにしたいです。何人かの作者がゲームの要約を書いているので、これは重要です、そして、次のゲームが始まったらゲームの要約の自動発行はかなり無価値です。

私はこれを管理するためのプラグインを探しています。調査の結果、管理者が設定した一連の時間の間に時間を選択するプラグインがいくつか見つかりました。公開される投稿と各回の最大投稿数を設定する

作者は自分の投稿を書いた後、投稿を公開するようにスケジュールする日付/時刻の選択を提示されます。

私が言ったように、似たようなプラグインがありますが、Adminsが特定の時間を設定することを許可したものはありません。

誰かがプラグインや他の方法を知っていますか?プラグインは無料である必要はありません。

「ビジョン」で更新

管理者設定 :ポストパブリッシングに許可する日付を設定します。ポストパブリッシングに許可されている時間を設定します。毎回の公開をスケジュールできる投稿の数を設定します(スケジュール数がスロットごとに満たされている場合、投稿者には表示されません)。

作成者スケジュールオプション : "発行"ボタンが表示されない。投稿を公開する曜日を選択する必要があります>>投稿を公開するのに利用可能な時間から選択する必要があります。

7
Travis Pflanz

私のアプローチは、すべてのドラフトステータスポストをループし、発行月-post_metaに保存された日付と時間をチェックし、スケジュールされた日付が将来でない場合に発行する1時間ごとのcronイベントを作成することです。

公開日時選択メタボックスが公開divに追加され、時刻が選択されるとajaxを介して更新されます。

更新:

プラグインと日付ピッカーcssをgitに追加: https://github.com/c3mdigital/WP-Schedule

パブリッシュにWordPressで設定されたタイムゾーンを使用するようにcron関数を変更しました。

更新:

日付と時刻はpost_metaに配列として保存されます。month' => 'string', time => int時間整数は、1〜24の時間を表す値になります。

オプション画面には3つの入力があります。

  • 時間:投稿を公開する時間を表すコンマ区切りの数値として入力します。
  • 毎回公開する投稿の数
  • 日付:コンマで区切られた日付の配列

enter image description here

管理者が選択した日付に制限されているjQuery UI日付ピッカーを投稿編集画面に追加しました。日付と時刻は、ajaxを使用して更新および保存されます。

enter image description hereenter 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:オプションを保存するための検証関数を作成し、各時間にスケジュールされる投稿の数を保存するカウントオプションを作成して、一度満杯になるとそれらの時間を制限し、コードをクリーンアップして文書化します。

5
Chris_O

これが私の考えです: https://github.com/stephenh1988/Restrict-Publish

これは適切なプラグインとなる点になります。現時点で、それは 'うまくいきます' - しかしあなたは手動でプラグイン変数を設定します(すなわち、まだadminオプションはありません)。

manage_optionsの機能を持たないユーザー(すなわち管理者)には、すべての制限が適用されます。しかし、これも変更される可能性があります。

UI

考えはWPがpost.jsをロードした後にjavascriptをロードすることです(これは時間入力を変更することを制御するJavaスクリプトを含みます。プラグインはこれをオーバーライドします。 jQuery UIの日時ピッカーを設定します。

日時ピッカーでは、いくつかの規則が与えられている場合にのみ、特定の日付を使用可能にすることができます(下記参照)。他のすべての日付は選択できません。日付/時刻を選択すると、適切なWordPressフィールドが更新されます - そして WordPressは残りの処理を処理します

そのため、プラグインのこの部分では、特定の日付が入力されるのを本当に防ぐことができます。

(日時ピッカーの位置がやや低すぎる - jQueryのuiポジショニングを使ってスマートにできるもの).

サーバーサイドチェック

save_postのチェックも実行します - 「禁止」の日付が選択された場合(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 = 1月、...)。追加の規則を非常に簡単に追加できます(管理者指定の日付の候補を含む)。

予定ポストの制限

ユーザーが持つことのできる スケジュールされた投稿 の数を制限する$limit変数もあります。彼らがその限界に達すると、彼らは公開する能力を失います(代わりにレビューのためにそれを提出しなければなりません - あなたは投稿を作成する権利さえ削除することができますが、それは編集を妨げるでしょう)。

プラグインコード

このGitHub Reproを参照してください。 https://github.com/stephenh1988/Restrict-Publish

1
Stephen Harris