it-swarm.com.de

Planen Sie die Veröffentlichung von Posts zu von Admin festgelegten Daten/Zeiten

Ich habe eine Baseball-Site mit mehreren Autoren. Ich möchte, dass Autoren die Veröffentlichung von Beiträgen zu einem von vier ausgewählten Zeitpunkten pro Tag planen können. Dies ist wichtig, da einige Autoren Spielrückblicke verfassen und ein automatisches Veröffentlichen eines Spielrückblicks nach dem Start des folgenden Spiels ziemlich wertlos ist.

Ich suche ein Plugin, um dies zu verwalten. Durch Recherchen habe ich ein paar Plugins gefunden, die eine Zeit zwischen einer Reihe von Zeiten auswählen, die vom Administrator festgelegt wurden, aber ich suche nach etwas, in dem der Administrator einen Kalender für Tage/Zeiten (oder einen Zeitbereich) einrichten kann, um eine Zeit festzulegen zu veröffentlichender Beitrag, und legen Sie jeweils eine maximale Anzahl von Beiträgen fest

Der Autor schreibt seinen Beitrag und erhält dann eine Auswahl an Daten/Zeiten, um den Beitrag für die Veröffentlichung zu planen.

Wie ich bereits erwähnt habe, gibt es ähnliche Plugins, aber keine, die ich gefunden habe, ermöglicht es Admins, bestimmte Zeiten festzulegen.

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

Update mit "Vision"

Admin-Einstellungen : Legt die für die Nachveröffentlichung zulässigen Daten fest. Festlegen der für die Nachveröffentlichung zulässigen Zeiten. Legen Sie die Anzahl der Posts fest, deren Veröffentlichung zu jedem Zeitpunkt geplant werden soll (wenn die Planungsnummer pro Slot erreicht wurde, wird sie dem Autor nicht angezeigt).

Planungsoptionen für Autoren : Schaltfläche "Veröffentlichen" nicht vorhanden. Zum Veröffentlichen des Beitrags muss der Wochentag ausgewählt werden >> Zum Veröffentlichen des Beitrags muss aus den verfügbaren Zeiten ausgewählt werden.

7
Travis Pflanz

Mein Ansatz ist es, ein stündliches Cron-Ereignis zu erstellen, das alle Entwurfsstatusbeiträge durchläuft und den in post_meta gespeicherten Veröffentlichungsmonat sowie die in post_meta gespeicherte Stunde überprüft und veröffentlicht, wenn das geplante Datum nicht in der Zukunft liegt.

Ein Auswahl-Meta-Feld für Veröffentlichungsdatum und -uhrzeit wird zum Veröffentlichungs-Div hinzugefügt, das über Ajax aktualisiert wird, wenn eine Uhrzeit ausgewählt wird.

Aktualisieren:

Plugin und Date Picker 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:

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

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

  • Zeiten: Wird als durch Kommas getrennte Zahl für die Tageszeit eingegeben, um Beiträge zu veröffentlichen.
  • Anzahl der zu publizierenden Beiträge
  • Datumsangaben: Eine durch Kommas getrennte Reihe von Datumsangaben

enter image description here

Ich habe dem Post-Edit-Bildschirm 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.

enter image description hereenter image description here

enter image description here

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 für jeden Zeitpunkt geplant sind, um diese Zeiten auf einmal zu beschränken. Bereinigen und dokumentieren Sie den Code.

5
Chris_O

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

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

Alle Einschränkungen gelten für Benutzer ohne manage_options-Berechtigung (d. H. Administratoren). Dies könnte aber auch geändert werden.

Die Benutzeroberfläche

Die Idee ist, Javascript zu laden, nachdem WP post.js geladen wurde (dies schließt das Java-Skript ein, das die Änderung der Zeiteingabe steuert. Das Plug-In überschreibt dies und klickt stattdessen auf "Bearbeiten", um die Veröffentlichungszeit anzuzeigen eine jQuery-Benutzeroberfläche für die Datums- und Uhrzeitauswahl einrichten.

Mit der Datums-/Uhrzeitauswahl können nur bestimmte Daten nach bestimmten Regeln verfügbar gemacht werden (siehe unten). Alle anderen Daten sind nicht wählbar. Bei Auswahl eines Datums/einer Uhrzeit werden die entsprechenden WordPress-Felder aktualisiert - und somit übernimmt WordPress den Rest der Verarbeitung .

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

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

Serverseitige Überprüfungen

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

Die Regeln

Diese sind sehr einfach. Der Regelsatz in einem $allows-Array:

$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 'months_in_year' ein Array zulässiger Monate (1 = Januar, ...). Zusätzliche Regeln können ganz einfach hinzugefügt werden (einschließlich einer Auswahlliste mit vom Administrator festgelegten Daten).

Begrenzung des geplanten Beitrags

Es gibt auch eine $limit-Variable, die die Anzahl von geplanten Posts begrenzt, die ein Benutzer haben kann. Wenn sie dieses Limit erreichen, verlieren sie die Veröffentlichungsfähigkeit (stattdessen müssen sie es zur Überprüfung einreichen - Sie könnten das Recht entfernen, sogar Beiträge zu erstellen, aber das würde auch die Bearbeitung verhindern).

Der Plug-In-Code

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

1
Stephen Harris