web-dev-qa-db-fra.com

Planifier des publications pour publier à partir de dates/heures prédéfinies par l'administrateur

J'ai un site de baseball multi-auteurs. Je souhaite que les auteurs puissent programmer la publication de messages à l’une des quatre heures sélectionnées chaque jour. Ceci est important car certains auteurs écrivent des récapitulatifs de jeu et une publication automatique d'un récapitulatif de jeu une fois que le jeu suivant a commencé ne vaut rien.

Je cherche un plugin pour gérer cela. Grâce à des recherches, j'ai trouvé quelques plugins permettant de choisir une heure entre un ensemble d'heures défini par l'administrateur, mais je cherche quelque chose où l'administrateur peut configurer un calendrier de jours/heures (ou d'intervalles) pour permettre poste à publier et à définir un nombre maximal de messages à chaque fois

L’auteur écrit son message, puis une sélection de dates/heures lui est proposée pour le publier.

Comme je l'ai mentionné, il existe des plugins similaires, mais aucun que j'ai trouvé n'autorise les administrateurs à définir des heures spécifiques.

Est-ce que quelqu'un connaît un plugin ou une autre méthode? Le plugin n'a pas besoin d'être gratuit.

Mise à jour avec "Vision"

Paramètres administrateur : Définissez les dates autorisées pour la publication ultérieure. Définissez les temps autorisés pour la publication ultérieure. Définissez le nombre de publications pouvant être programmées pour publication à chaque fois (si le nombre de planification a été atteint par tranche, il ne sera pas affiché à l'auteur).

Options de planification de l'auteur : Le bouton "Publier" n'est pas présent. Doit choisir le jour de la semaine pour publier un post >> Vous devez choisir parmi les heures disponibles pour publier un post.

7
Travis Pflanz

Mon approche consiste à créer un événement cron horaire qui parcourt tous les brouillons de statut et vérifie le mois de publication - la date et l'heure enregistrées dans post_meta et les publie si la date planifiée n'est pas à venir.

Une méta-boîte de sélection de date et heure de publication est ajoutée à la division de publication qui se met à jour via ajax lorsqu'une heure est choisie.

Mettre à jour:

Ajout du plugin et du sélecteur de date css à git: https://github.com/c3mdigital/WP-Schedule

Modification de la fonction cron pour utiliser le fuseau horaire configuré dans WordPress pour la publication.

Mettre à jour:

La date et l'heure seront stockées dans post_meta sous forme de tableau: month' => 'string', time => int Le nombre entier d'heures sera une valeur représentant une heure du jour, soit le 1-24.

L'écran des options a 3 entrées.

  • Temps: chiffres entrés séparés par des virgules représentant l'heure du jour pour publier des messages.
  • Nombre de messages à publier à chaque fois
  • Dates: un tableau de dates séparées par des virgules

enter image description here

J'ai ajouté un sélecteur de date de l'interface utilisateur jQuery à l'écran de modification de publication qui est limité aux dates choisies dans l'administrateur. La date et l'heure sont mises à jour et enregistrées avec ajax.

enter image description hereenter image description here

enter image description here

Code de plugin mis à jour:

 <?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: Créer une fonction de validation pour enregistrer les options, Créer une option de comptage qui stocke le nombre de publications planifiées à chaque fois pour limiter ces heures une fois remplies, et nettoyer et documenter le code.

5
Chris_O

Voici ce que je pense: https://github.com/stephenh1988/Restrict-Publish

Cela sera transformé en un plug-in approprié et un point. Pour le moment, cela fonctionne - mais vous configurez manuellement les variables du plug-in (c'est-à-dire, pas encore d'options d'administrateur).

Toutes les restrictions s’appliquent aux utilisateurs n’ayant pas la capacité de manage_options (administrateurs, par exemple). Mais cela pourrait aussi être modifié.

L'interface utilisateur

L'idée est de charger javascript après le WP charge post.js (ceci inclut le script Java qui contrôle la modification de la saisie de l'heure. Le plug-in la remplace par-dessus, en cliquant sur 'modifier' pour l'heure de publication. un sélecteur de date-heure de l'interface utilisateur jQuery.

Le sélecteur de date/heure permet uniquement à certaines dates d'être disponibles en fonction de certaines règles (voir ci-dessous). Toutes les autres dates ne sont pas sélectionnables. Lors de la sélection de la date/heure, les champs WordPress appropriés sont mis à jour - et donc WordPress gère le reste du traitement .

Donc, cette partie du plug-in empêche uniquement certaines dates d’être saisies.

(Le sélecteur de date et d'heure est positionné un peu trop bas, ce qui peut être amélioré à l'aide du positionnement jQuery ui).

Contrôles côté serveur

Il effectue également une vérification sur save_post - juste au cas où (js désactivé? Pirater par l'utilisateur?) Une date "interdite" est sélectionnée, le rappel save_post vérifie à nouveau la date. Si elle est jugée non valide, la publication ou la publication du message est "empêchée" (comme indiqué dans cette réponse) et son statut de brouillon est rétabli. Un message personnalisé apparaît (vous pouvez modifier ce message en définissant $fail_message pour le moment).

Les règles

Ce sont très basiques. L'ensemble de règles conservées dans un tableau $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' est un tableau d'entiers indiquant les jours (0 = dimanche, 1 = lundi) sur lesquels l'utilisateur peut publier des dates. De même, 'months_in_year' stocke un tableau des mois autorisés (1 = janvier, ...). Des règles supplémentaires pourraient être ajoutées assez facilement (y compris une liste de dates spécifiées par l'administrateur).

Limiter le poste prévu

Il existe également une variable $limit qui limite le nombre de messages programmés qu'un utilisateur peut avoir. S'ils atteignent cette limite, ils perdent la possibilité de publier (au lieu de la soumettre pour révision - vous pouvez supprimer le droit de créer des publications, mais cela empêcherait également leur édition).

Le code du plug-in

Voir ce GitHub Repro: https://github.com/stephenh1988/Restrict-Publish

1
Stephen Harris