Lên lịch bài viết để xuất bản từ ngày / lần được đặt trước bởi quản trị viên


7

Tôi có một trang web bóng chày nhiều tác giả. Tôi muốn các tác giả có thể lên lịch các bài đăng sẽ được xuất bản tại một trong bốn lần được chọn mỗi ngày. Điều này rất quan trọng vì một số tác giả viết tóm tắt trò chơi và tự động xuất bản bản tóm tắt trò chơi một khi trò chơi sau đã bắt đầu là khá vô ích.

Tôi đang tìm kiếm một plugin để quản lý này. Qua nghiên cứu, tôi đã tìm thấy một vài plugin sẽ chọn thời gian giữa một tập hợp thời gian do quản trị viên đặt, nhưng tôi đang tìm kiếm thứ gì đó mà Quản trị viên có thể thiết lập lịch ngày / lần (hoặc phạm vi thời gian) để cho phép bài đăng sẽ được xuất bản và đặt số lượng bài đăng tối đa cho mỗi lần

Tác giả viết bài đăng của mình, sau đó được trình bày với một lựa chọn ngày / lần để lên lịch bài đăng để xuất bản.

Như tôi đã đề cập, có các plugin tương tự, nhưng không có plugin nào tôi tìm thấy cho phép Quản trị viên đặt thời gian cụ thể.

Có ai biết một plugin hoặc phương pháp khác không? Plugin không cần miễn phí.

Cập nhật với "Tầm nhìn"

Cài đặt quản trị : Đặt ngày được phép để xuất bản bài. Đặt thời gian cho phép để xuất bản bài. Đặt số lượng bài đăng được phép lên lịch để xuất bản mỗi lần (nếu số lịch trình đã được đáp ứng trên mỗi vị trí thì nó sẽ không được hiển thị cho Tác giả).

Tùy chọn lập lịch tác giả : Không có nút "Xuất bản". Phải chọn ngày trong tuần để xuất bản bài đăng >> Phải chọn từ thời gian có sẵn để xuất bản bài đăng.


Có phải danh sách thời gian có sẵn cần phải giống nhau trên tất cả các bài đăng, hoặc biến tùy thuộc vào các yếu tố khác không?
Otto

Tôi đã không thực sự nghĩ về nó. Bạn đã nghĩ gì vậy? Câu hỏi cập nhật với nhiều thông tin hơn.
Travis Pflanz

1
Điều này có vẻ như nó sẽ làm cho một plugin khá tốt. Tôi đã hoàn thành phần xuất bản và ui cho màn hình chỉnh sửa bài đăng nhưng tôi chưa tìm ra các tùy chọn quản trị viên. Tôi nghĩ rằng tôi sẽ đăng những gì tôi có và có thể người khác có thể thêm vào nó.
Chris_O

Câu trả lời:


5

Cách tiếp cận của tôi là tạo ra một sự kiện định kỳ hàng giờ lặp qua tất cả các bài đăng trạng thái dự thảo và kiểm tra cho tháng xuất bản - ngày và giờ được lưu trong post_meta và xuất bản nếu ngày dự kiến ​​không có trong tương lai.

Hộp meta chọn ngày và thời gian xuất bản được thêm vào div xuất bản cập nhật qua ajax khi thời gian được chọn.

Cập nhật:

Đã thêm plugin và trình chọn ngày css vào git: https://github.com/c3mdigital/WP-Schedule

Thay đổi chức năng cron để sử dụng múi giờ được cấu hình trong WordPress để xuất bản.

Cập nhật:

Ngày và giờ sẽ được lưu trữ trong post_meta dưới dạng một mảng: month' => 'string', time => intSố nguyên thời gian sẽ là một giá trị đại diện cho một giờ trong ngày 1-24.

Màn hình tùy chọn có 3 đầu vào.

  • Thời gian: được nhập dưới dạng số được phân tách bằng dấu phẩy thể hiện giờ trong ngày để xuất bản bài đăng.
  • Số lượng bài viết để xuất bản mỗi lần
  • Ngày: một mảng ngày được phân tách bằng dấu phẩy

nhập mô tả hình ảnh ở đây

Tôi đã thêm một bộ chọn Ngày của UI UI vào màn hình chỉnh sửa bài được giới hạn trong các ngày được chọn trong quản trị viên. Ngày và giờ được cập nhật và lưu bằng ajax.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Mã plugin được cập nhật:

 <?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: Tạo chức năng xác thực để lưu các tùy chọn, Tạo tùy chọn đếm lưu trữ số lượng bài đăng được lên lịch mỗi lần để hạn chế những lần đó một lần đầy đủ, và dọn sạch & ghi lại mã.


Xin lỗi vì sự chậm trễ của tôi trong việc trả lời. Tôi đã không thể truy cập vào máy tính trong tuần qua hoặc lâu hơn. Tôi nhận được một lỗi trên màn hình cài đặt. Đây là một ảnh chụp màn hình - lh4.googleusercontent.com/-_mep94oKSiE/T7KkvG0t7mI/AAAAAAAAAY4/. Ngoài ra, công cụ chọn ngày không hiển thị trên trang bài đăng. Tôi sử dụng Chrome và Windows 7
Travis Pflanz

1

Đây là của tôi: https://github.com/stephenh1988/Restrict-Publish

Điều này sẽ được thực hiện thành một trình cắm thêm thích hợp và một số điểm. Hiện tại, nó 'hoạt động' - nhưng bạn định cấu hình thủ công các biến trình cắm (nghĩa là chưa có tùy chọn quản trị viên).

Tất cả các hạn chế áp dụng cho người dùng mà không có khả năng manage_options(tức là quản trị viên). Nhưng điều này cũng có thể được thay đổi.

Giao diện người dùng

Ý tưởng là tải javascript sau khi tải WP post.js(phần này bao gồm tập lệnh java kiểm soát thay đổi đầu vào thời gian. Trình cắm vượt qua điều này, nhấp vào 'chỉnh sửa' cho thời gian xuất bản thay vào đó mở ra thời gian ngày của UI UI jQuery người hái.

Công cụ chọn ngày giờ chỉ cho phép một số ngày nhất định có sẵn theo một số quy tắc (xem bên dưới). Tất cả các ngày khác không thể lựa chọn. Khi chọn ngày / giờ, các trường WordPress thích hợp được cập nhật - và do đó WordPress xử lý phần còn lại của quá trình xử lý .

Vì vậy, phần này của trình cắm chỉ thực sự ngăn chặn một số ngày nhất định được nhập.

(Công cụ chọn ngày giờ được định vị hơi thấp - một số thứ có thể được làm thông minh bằng cách sử dụng định vị jQuery ui).

Kiểm tra phía máy chủ

Nó cũng thực hiện kiểm tra save_post- chỉ trong trường hợp (js bị vô hiệu hóa? Hack bởi người dùng?) Một ngày 'cấm' được chọn, cuộc save_postgọi lại kiểm tra lại ngày. Nếu nó được coi là không hợp lệ, bài đăng sẽ bị 'ngăn chặn' được xuất bản / lên lịch (theo câu trả lời này) và thay vào đó trở lại trạng thái dự thảo. Một thông báo tùy chỉnh xuất hiện (thông báo này có thể được thay đổi bằng cách cài đặt $fail_messagehiện tại).

Những quy định

Đây là những điều rất cơ bản. Tập hợp các quy tắc được giữ trong một $allowsmảng:

$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' là một mảng các số nguyên để cho biết ngày nào (0 = chủ nhật, 1 = thứ hai) mà người dùng có thể xuất bản ngày vào. Tương tự 'tháng_in_year' lưu trữ một loạt các tháng được phép (1 = tháng một, ...). Các quy tắc bổ sung có thể được thêm vào khá dễ dàng (bao gồm danh sách ngắn các ngày do quản trị viên chỉ định).

Giới hạn bài viết theo lịch trình

Ngoài ra còn có một $limitbiến giới hạn số lượng bài viết theo lịch trình mà người dùng có thể có. Nếu họ đạt đến giới hạn đó, họ sẽ mất khả năng xuất bản (thay vào đó phải gửi nó để xem xét - bạn có thể xóa quyền thậm chí tạo bài đăng, nhưng điều đó cũng sẽ ngăn chặn việc chỉnh sửa).

Mã trình cắm

Xem phần giới thiệu GitHub này: https://github.com/stephenh1988/Restrict-Publish

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.