Planen Sie die Veröffentlichung von Posts ab Daten / Zeiten, die vom Administrator festgelegt wurden

7

Ich habe eine Baseball-Site mit mehreren Autoren. Ich möchte, dass Autoren die Veröffentlichung von Posts zu einer von vier ausgewählten Zeiten pro Tag planen können. Dies ist wichtig, da einige Autoren Spielrückblicke schreiben und eine automatische Veröffentlichung eines Spielrückblicks nach dem Start des folgenden Spiels ziemlich wertlos ist.

Ich suche nach einem Plugin, um dies zu verwalten. Durch Recherchen habe ich einige Plugins gefunden, die eine Zeit zwischen einer vom Administrator festgelegten Zeitspanne auswählen, aber ich suche nach etwas, bei dem der Administrator einen Kalender mit Tagen / Zeiten (oder Zeitbereichen) einrichten kann, um a Beitrag veröffentlicht werden und eine maximale Anzahl von Beiträgen für jedes Mal festlegen

Der Autor schreibt seinen Beitrag und erhält dann eine Auswahl von Daten / Zeiten, um die Veröffentlichung des Beitrags zu planen.

Wie bereits erwähnt, gibt es ähnliche Plugins, aber keines, das ich gefunden habe, ermöglicht es Administratoren, bestimmte Zeiten festzulegen.

Kennt jemand ein Plugin oder eine andere Methode? Das Plugin muss nicht kostenlos sein.

Update mit "Vision"

Admin-Einstellungen : Legen Sie die Daten fest, die für die Veröffentlichung nach der Veröffentlichung zulässig sind. Stellen Sie die zulässigen Zeiten für die Nachveröffentlichung ein. Legen Sie die Anzahl der Beiträge fest, deren Veröffentlichung zu jedem Zeitpunkt geplant werden darf (wenn die Planungsnummer pro Slot erreicht wurde, wird sie dem Autor nicht angezeigt).

Optionen für die Autorenplanung : Schaltfläche "Veröffentlichen" nicht vorhanden. Muss den Wochentag auswählen, an dem der Beitrag veröffentlicht werden soll >> Muss aus den verfügbaren Zeiten auswählen, um den Beitrag zu veröffentlichen.

Travis Pflanz
quelle
Muss die Liste der verfügbaren Zeiten für alle Posts gleich sein oder in Abhängigkeit von anderen Faktoren variabel sein?
Otto
Ich hatte nicht wirklich darüber nachgedacht. Was hattest du im Sinn? Aktualisierte Frage mit mehr Infos.
Travis Pflanz
1
Dies scheint ein ziemlich gutes Plugin zu sein. Ich habe den Veröffentlichungsteil und die Benutzeroberfläche für den Post-Edit-Bildschirm fertiggestellt, aber die Administratoroptionen noch nicht ausgearbeitet. Ich denke, ich werde veröffentlichen, was ich habe, und vielleicht kann jemand anderes etwas hinzufügen.
Chris_O

Antworten:

5

Mein Ansatz besteht darin, ein stündliches Cron-Ereignis zu erstellen, das alle Entwürfe von Statusbeiträgen durchläuft und nach dem in post_meta gespeicherten Veröffentlichungsmonat - Datum und Stunde - sucht und veröffentlicht, wenn das geplante Datum nicht in der Zukunft liegt.

Dem Veröffentlichungsbereich wird ein Meta-Auswahlfeld für die Auswahl von Datum und Uhrzeit hinzugefügt, das bei Auswahl einer Uhrzeit über Ajax aktualisiert wird.

Aktualisieren:

Plugin und Datumsauswahl CSS zu Git hinzugefügt: https://github.com/c3mdigital/WP-Schedule

Die Cron-Funktion wurde geändert, um die in WordPress konfigurierte Zeitzone für die Veröffentlichung zu verwenden.

Aktualisieren:

Datum und Uhrzeit werden in post_meta als Array gespeichert: month' => 'string', time => intDie Zeit-Ganzzahl ist ein Wert, der eine Stunde des Tages 1-24 darstellt.

Der Optionsbildschirm verfügt über 3 Eingänge.

  • Zeiten: Als durch Kommas getrennte Zahlen eingegeben, die die Stunde des Tages für die Veröffentlichung von Posts darstellen.
  • Anzahl der Beiträge, die jeweils veröffentlicht werden sollen
  • Datumsangaben: Ein durch Kommas getrenntes Array von Datumsangaben

Geben Sie hier die Bildbeschreibung ein

Ich habe dem Bildschirm für die Nachbearbeitung eine jQuery UI-Datumsauswahl hinzugefügt, die auf die im Administrator ausgewählten Daten beschränkt ist. Datum und Uhrzeit werden mit Ajax aktualisiert und gespeichert.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Aktualisierter Plugin-Code:

 <?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: Erstellen Sie eine Validierungsfunktion zum Speichern der Optionen. Erstellen Sie eine Zähloption, in der gespeichert wird, wie viele Posts jedes Mal geplant sind, um diese Zeiten zu beschränken, sobald sie voll sind, und bereinigen und dokumentieren Sie den Code.

Chris_O
quelle
Entschuldigen Sie meine Verzögerung bei der Beantwortung. Ich war in der letzten Woche nicht viel in der Lage, an einen Computer zu gelangen. Ich erhalte eine Fehlermeldung auf dem Einstellungsbildschirm. Hier ist ein Screenshot - lh4.googleusercontent.com/-_mep94oKSiE/T7KkvG0t7mI/AAAAAAAAAY4/… Außerdem wird die Datumsauswahl nicht auf der Post-Seite angezeigt . Ich benutze Chrome und Windows 7
Travis Pflanz
1

Hier ist meine Meinung: https://github.com/stephenh1988/Restrict-Publish

Dies wird zu einem richtigen Plug-In und irgendwann gemacht. Im Moment funktioniert es - aber Sie konfigurieren die Plug-In-Variablen manuell (dh noch keine Administratoroptionen).

Alle Einschränkungen gelten für Benutzer ohne die Fähigkeit dazu manage_options(dh Administratoren). Dies könnte aber auch geändert werden.

Die Benutzeroberfläche

Die Idee ist, Javascript nach dem Laden des WP zu laden post.js (dies schließt das Java-Skript ein, das das Ändern der Zeiteingabe steuert. Das Plug-In überschreibt dies, indem es für die Veröffentlichungszeit auf "Bearbeiten" klickt, öffnet stattdessen eine jQuery-UI-Datumszeit Picker.

Die Datums- / Uhrzeitauswahl lässt nur zu, dass bestimmte Daten nach bestimmten Regeln verfügbar sind (siehe unten). Alle anderen Daten sind nicht auswählbar. Bei Auswahl eines Datums / einer Uhrzeit werden die entsprechenden WordPress-Felder aktualisiert - und WordPress übernimmt den Rest der Verarbeitung .

Dieser Teil des Plug-Ins verhindert also nur die Eingabe bestimmter Daten.

(Die Datums- / Uhrzeitauswahl ist etwas zu niedrig positioniert - etwas, das mithilfe der jQuery-UI-Positionierung verbessert werden kann.)

Serverseitige Überprüfungen

Es führt auch eine Überprüfung durch save_post- nur für den Fall, dass (js deaktiviert? Vom Benutzer hacken?) Ein "verbotenes" Datum ausgewählt ist, save_postüberprüft der Rückruf das Datum erneut. Wenn sich herausstellt, dass es ungültig ist, wird verhindert, dass der Beitrag veröffentlicht / geplant wird (gemäß dieser Antwort) und stattdessen in den Entwurfsstatus zurückversetzt. Eine benutzerdefinierte Nachricht wird angezeigt (diese Nachricht kann durch die $fail_messageaktuelle Einstellung geändert werden ).

Die Regeln

Diese sind sehr einfach. Die in einem $allowsArray gespeicherten Regeln :

$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' ist ein Array von Ganzzahlen, die angeben, an welchen Tagen (0 = Sonntag, 1 = Montag) der Benutzer Daten veröffentlichen kann. In ähnlicher Weise speichert 'month_in_year' ein Array zulässiger Monate (1 = Januar, ...). Zusätzliche Regeln können ganz einfach hinzugefügt werden (einschließlich einer Auswahlliste von vom Administrator festgelegten Daten).

Begrenzte geplante Post

Es gibt auch eine $limitVariable, die die Anzahl der geplanten Posts begrenzt, die ein Benutzer haben kann. Wenn sie diese Grenze erreichen, verlieren sie die Möglichkeit zur Veröffentlichung (stattdessen müssen sie zur Überprüfung eingereicht werden - Sie könnten das Recht entfernen, sogar Beiträge zu erstellen, aber dies würde auch die Bearbeitung verhindern).

Der Plug-In-Code

Siehe dieses GitHub-Repro: https://github.com/stephenh1988/Restrict-Publish

Stephen Harris
quelle