rucy.php
49267e52
 <?php
 /*
  * Plugin Name: Rucy
  * Plugin URI: https://github.com/gips/rucy
0f52aed2
  * Description: Reservation Update (Published) Content.
468efc5c
  * Version: 0.1.2
49267e52
  * Author: Nita
  * License: GPLv2 or later
  * Text Domain: rucy
  * Domain Path: /lang
  */
 define('RC_PLUGIN_URL',  plugin_dir_url(__FILE__));
 define('RC_SETTING_OPTION_KEY', 'rucy_post_type');
 define('RC_TXT_DOMAIN', 'rucy');
 define('RC_POSTTYPE_DEFAULT','post,page');
81f9bb6c
 define('RC_CRON_HOOK', 'rucy_update_reserved_content');
b4c3c653
 load_plugin_textdomain( RC_TXT_DOMAIN, false, 'rucy/lang');
49267e52
 
 add_action('admin_enqueue_scripts','rc_load_jscss');
 function rc_load_jscss()
 {
     global $hook_suffix;
e7e80c88
     if(in_array($hook_suffix, array('post.php','post-new.php',)))
49267e52
     {
e7e80c88
         wp_register_style('rucy.css', RC_PLUGIN_URL . '/css/rucy.css',array(),'0.0.1');
49267e52
         wp_enqueue_style('rucy.css');
e7e80c88
         wp_register_script('rucy.js', RC_PLUGIN_URL . '/js/rucy.js', array('jquery'), '0.0.1');
49267e52
         wp_enqueue_script('rucy.js');
     }
 }
 
b4c3c653
 /**
  * get rucy post_metas or post_meta keys.
  * @param int $post_id
  * @return array 
  */
e7e80c88
 function getRcMetas($post_id = "")
 {
b4c3c653
     $base = array(
765926c5
         'accept' => 'rc_reserv_accept',
         'content' => 'rc_reserv_content',
         'date' => 'rc_reserv_date'
b4c3c653
             );
     if($post_id > 0)
     {
         foreach ($base as $key => $value)
         {
             $res[$key] = get_post_meta($post_id, $value, true);
         }
     } else {
         $res = $base;
e7e80c88
     }
b4c3c653
     return $res;
e7e80c88
 }
 
 // add reserv_metabox
 add_action('admin_menu', 'add_rucy_metabox_out');
 function add_rucy_metabox_out()
 {
     $acceptPostType = getRcSetting();
     foreach ($acceptPostType as $postType)
     {
765926c5
         add_meta_box('rucy_metabox','Rucy','add_rucy_metabox_inside',$postType,'normal','high');
e7e80c88
     }
     function add_rucy_metabox_inside()
     {
765926c5
         global $post;
e7e80c88
         $rcKeys = getRcMetas();
         $rc_content_name = $rcKeys['content'];
         $rc_accept_name = $rcKeys['accept'];
         $rcMetas = getRcMetas($post->ID);
         $reserv_accept = $rcMetas['accept'];
         $reserv_date = $rcMetas['date'];
         if("" == $reserv_date)
         {
             $reserv_date = $post->post_date;
         }
         $reserv_date_arr = getdate(strtotime($reserv_date));
         $reserv_content = $rcMetas['content'];
         if("" == $reserv_content)
         {
             $reserv_content = $post->post_content;
765926c5
         }        
e7e80c88
     ?>
     <div id="rc-post-wrap" class="curtime">
765926c5
         <input type="hidden" name="schroeder" id="schroeder" value="<?php echo wp_create_nonce(plugin_basename(__FILE__)); ?>"/>
e7e80c88
         <label class="rc_accept">
             <input type="checkbox" name="<?php echo $rc_accept_name; ?>" value="1" <?php echo ($reserv_accept == "1") ? "checked" : ""; ?>> <?php _e('Accept reserve update content.',RC_TXT_DOMAIN) ?>
         </label>
         <div class="rc-datetime" id="timestamp">
             <?php _e('UpdateTime',RC_TXT_DOMAIN) ?>:<b><?php echo date("Y/m/d @ H:i", strtotime($reserv_date)); ?></b>
         </div>
         <a href="#edit-reservdate" class="edit-timestamp rc-datetime-edit"><?php _e('Edit') ?></a>
         <div class="rc-datetime-wrap">
             <input type="text" size="4" maxlength="4" name="rc_year" value="<?php echo date('Y',$reserv_date_arr[0]); ?>"><?php echo '/' ?>
             <select name="rc_month">
                 <?php
                     for($i=1;$i<=12;$i++)
                     {
                         $m = sprintf("%02d",$i);
                         $selected = ($m == date('m',$reserv_date_arr[0])) ? "selected" : "";
                         echo '<option value="'.$m.'" '.$selected.'>'.$m.'</option>';
                     }
                 ?>
                 </select><?php echo '/' ?>
                 <input type="text" size="2" maxlength="2" name="rc_day" value="<?php echo date('d',$reserv_date_arr[0]); ?>">
                 @ <input type="text" size="2" maxlength="2" name="rc_hour" value="<?php echo date('H',$reserv_date_arr[0]); ?>">:<input type="text" size="2" maxlength="2" name="rc_minutes" value="<?php echo date('i',$reserv_date_arr[0]); ?>">
                 <a href="#edit-reservdate" class="rc-datetime-update button"><?php _e('OK',RC_TXT_DOMAIN) ?></a>
                 <a href="#edit-reservdate" class="rc-datetime-cancel"><?php _e('Cancel',RC_TXT_DOMAIN) ?></a>
         </div>
         <?php
             $dateArr = array(
                 'rc_year' => date('Y',$reserv_date_arr[0]),
                 'rc_month' => date('m',$reserv_date_arr[0]),
                 'rc_day' => date('d',$reserv_date_arr[0]),
                 'rc_hour' => date('H',$reserv_date_arr[0]),
                 'rc_minutes' => date('i',$reserv_date_arr[0])
             );
             foreach ($dateArr as $k => $v)
             {
                 echo '<input type="hidden" name="'.$k.'_cr" id="'.$k.'_cr" value="'.$v.'">';
             }
         ?>
     </div>
 <?php 
     wp_editor($reserv_content, $rc_content_name);
     }
 }
 
 // save post meta
 add_action('save_post','savePostmeta');
 function savePostmeta($post_id)
 {
     if(isset($_POST) && isset($_POST['post_type']))
     {
765926c5
         if(isset($_POST['schroeder']) && !wp_verify_nonce($_POST['schroeder'], plugin_basename(__FILE__))){
             return;
         }
         if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
             return;
         }
e7e80c88
         $rcKeys = getRcMetas();
b4c3c653
         $acceptPostType = getRcSetting();
a12e515d
         if(in_array($_POST['post_type'], $acceptPostType))
e7e80c88
         {
a12e515d
             $date = mktime($_POST['rc_hour'], $_POST['rc_minutes'], 00, $_POST['rc_month'], $_POST['rc_day'], $_POST['rc_year']);
             if($date)
e7e80c88
             {
a12e515d
                 $_POST[$rcKeys['date']] = date('Y-m-d H:i:s',$date);
             } else {
                 $_POST[$rcKeys['date']] = "";
             }
             if(!isset($_POST[$rcKeys['accept']])){
                 $_POST[$rcKeys['accept']]  = "0";
             } else if($_POST[$rcKeys['accept']] != "1"){
                 $_POST[$rcKeys['accept']] = "0";
e7e80c88
             }
         }
44e6ce1f
         if($_POST[$rcKeys['accept']] == "1")
e7e80c88
         {
a12e515d
             foreach ($rcKeys as $key => $val)
             {
                 savePostMetaBase($post_id, $val);
             }
e7e80c88
             $reservDate = strtotime(get_gmt_from_date($_POST[$rcKeys['date']]) . " GMT");
44e6ce1f
             if(in_array($_POST['post_type'], $acceptPostType) || $_POST['post_type'] != 'revision')
e7e80c88
             {
81f9bb6c
                 wp_schedule_single_event($reservDate, RC_CRON_HOOK, array($post_id));
e7e80c88
             }
44e6ce1f
         } else if($_POST[$rcKeys['accept']] == "0") {
             // delete schedule
81f9bb6c
             wp_clear_scheduled_hook(RC_CRON_HOOK, array($post_id));
e7e80c88
         }
     }
 }
 
b4c3c653
 /**
  * save, update, delete post_meta
  * 
  * @param int $post_id
  * @param string $post_metakey
  */
e7e80c88
 function savePostMetaBase($post_id, $post_metakey)
 {
     if(isset($_POST))
     {
         $post_data = "";
         if(isset($_POST[$post_metakey]))
         {
             $post_data = $_POST[$post_metakey];
         }
765926c5
         $meta = get_post_meta($post_id, $post_metakey,true);
        if ($post_data != $meta) {
             update_post_meta($post_id, $post_metakey, $post_data, $meta);
e7e80c88
         } elseif("" == $post_data) {
             delete_post_meta($post_id, $post_metakey);
         }
     }
 }
 
 // update post for wp-cron
 add_action('wp_reserv_content_update', 'updateReservedContent','10',1);
 function updateReservedContent($post_id)
 {
     $rcMetas = getRcMetas($post_id);
     if("1" == $rcMetas['accept'])
     {
         $updates = array(
             'ID' => $post_id,
             'post_content' => $rcMetas['content'],
         );
        wp_update_post($updates,true);
     }
81f9bb6c
     wp_clear_scheduled_hook(RC_CRON_HOOK, array($post_id));
e7e80c88
     $dels = getRcMetas();
765926c5
     foreach ($dels as $key => $del)
e7e80c88
     {
         delete_post_meta($post_id, $del);
     }
 }
 
a91b433a
 // add update message
 add_filter('post_updated_messages','addRcMessage');
 function addRcMessage($messages)
 {
     global  $post, $post_ID;
     $arrPostTypes = getRcSetting(true);
     $postType = get_post_type($post);
     if(in_array($postType, $arrPostTypes))
     {
         $rcMetas = getRcMetas($post_ID);
         if("1" == $rcMetas['accept'])
         {
468efc5c
             $addMessageDate = date('Y/m/d @ H:i',  strtotime($rcMetas['date']));
             $str = __('registered reservation update content _RC_DATETIME_',RC_TXT_DOMAIN);
             $addMessage = '<br>' . strtr($str, array('_RC_DATETIME_' => $addMessageDate));
a91b433a
             // published
             $messages[$postType][1] .= $addMessage;
             $messages[$postType][4] .= $addMessage;
             $messages[$postType][6] .= $addMessage;
             // saved
             $messages[$postType][7] .= $addMessage;
             // submited
             $messages[$postType][8] .= $addMessage;
             // scheduled
             $messages[$postType][9] .= $addMessage;
         }
     }
     return $messages;
 }
 
e7e80c88
 // add reservation info at postlist
 function manageRucyCols($columns) {
765926c5
     $columns['subtitle'] = __("Reservation Update DateTime", RC_TXT_DOMAIN);
e7e80c88
     return $columns;
 }
 function addRucyCol($column_name, $post_id) {
     $rcMetas = getRcMetas($post_id);
765926c5
     $s = "";
e7e80c88
     if($column_name == 'subtitle')
     {
         $s = $rcMetas['accept'];
     }
     if($s == "1")
     {
         echo $rcMetas['date'];
     } else {
         echo __('None');
     }
 }
 
765926c5
 foreach (array('pages','posts') as $p){
     add_filter('manage_'.$p.'_columns', 'manageRucyCols');
     add_action('manage_'.$p.'_custom_column', 'addRucyCol', 10, 2);    
 }
e7e80c88
 
49267e52
 // setting page
 add_action('admin_menu','admin_menu_rucy');
 function admin_menu_rucy()
 {
     add_options_page('Rucy', 'Rucy', 'manage_options',  'rucy', 'addRcSetting');
 }
 function addRcSetting()
 {
     $post = $_POST;
     $isCheckedPost = "";
     $isCheckedPage = "";
     $customPostTypes = "";
8d113771
     $errorClass = "form-invalid";
81f9bb6c
     $basicPostTypes = array('page','post');
     $invalidPostTypes = array('attachment','revision');
8d113771
     $message = array();
     $error = 0;
49267e52
     if(isset($post['page_options']))
     {
         $res = "";
         if(isset($post['rc_post']) && $post['rc_post'] == 'post')
         {
             $res .= $post['rc_post'];
             $isCheckedPost = "checked";
8d113771
         } else {
             $error += 1;
49267e52
         }
         if(isset($post['rc_page']) && $post['rc_page'] == 'page') {
             $res .= "," . $post['rc_page'];
             $isCheckedPage = "checked";
44e6ce1f
         } else {
8d113771
             $error += 1;
         }
         if($error == 2){
             $message['post_page'] = __("post or page is not allow.", RC_TXT_DOMAIN);
49267e52
         }
         if(isset($post['rc_custom_post']) && $post['rc_custom_post'] != "") {
             $customCheck = explode(',', $post['rc_custom_post']);
81f9bb6c
             foreach ($customCheck as $check)
             {
                 if(in_array($check, $basicPostTypes))
49267e52
                 {
8d113771
                     $message['custom_post'] = __('Do not input "post" or "page". ', RC_TXT_DOMAIN);
                 } else if(!preg_match('/[a-zA-Z0-9_-]/', $check)) {
                     $message['custom_post'] = __("Please input alphabet or numeric. And do not input sequencial commas.", RC_TXT_DOMAIN);
81f9bb6c
                 } else if(in_array($check, $invalidPostTypes)){
                     $message['custom_post'] = __('Do not input "attachment" or "revision". ',RC_TXT_DOMAIN);
49267e52
                 }
             }
             $res .= "," . $post['rc_custom_post'];
             $customPostTypes = $post['rc_custom_post'];
         }
8d113771
         if($res != "" && count($message) == 0)
49267e52
         {
8d113771
             update_option(RC_SETTING_OPTION_KEY, $res);
49267e52
         }
     } else {
8d113771
         $message = array();
49267e52
         $arrSetting = getRcSetting();
         $isCheckedPost = (in_array('post', $arrSetting) == TRUE) ? 'checked' : "";
         $isCheckedPage = (in_array('page', $arrSetting) == TRUE) ? 'checked' : "";
         $arrCustomPostTypes = array();
         foreach ($arrSetting as $v)
         {
a12e515d
             if(!in_array($v, $basicPostTypes))
49267e52
             {
                 array_push($arrCustomPostTypes, $v);
             }
         }
         $customPostTypes = implode(',', $arrCustomPostTypes);
     }
 ?>
 <div class="wrap">
     <h2>Rucy Settings</h2>
765926c5
     <p><?php _e('Configure content types reservation update.',RC_TXT_DOMAIN); ?></p>
49267e52
     <form method="post" action="#">
         <?php wp_nonce_field('update-options'); ?>
         <table class="form-table">
8d113771
             <tr class="<?php echo (isset($message['post_page']) == true) ? $errorClass : ""; ?>">
765926c5
                 <th><?php _e('post type',RC_TXT_DOMAIN) ?><br><small>*<?php _e('Require',RC_TXT_DOMAIN) ?></small></th>
49267e52
                 <td>
                     <ul>
8d113771
                         <li><label for="rc_post"><input type="checkbox" id="rc_post" name="rc_post" value="post" <?php echo $isCheckedPost ?>><?php _e('post',RC_TXT_DOMAIN) ?></label></li>
                         <li><label for="rc_page"><input type="checkbox" id="rc_page" name="rc_page" value="page" <?php echo $isCheckedPage ?>><?php _e('page',RC_TXT_DOMAIN) ?></label></li>
49267e52
                     </ul>
8d113771
                     <?php 
                         if(isset($message['post_page']))
                         {
                             echo '<p>'.$message['post_page'].'</p>';
                         }
                     ?>
49267e52
                 </td>
             </tr>
8d113771
             <tr class="<?php echo (isset($message['custom_post']) == true) ? $errorClass : ""; ?>">
                 <th><?php _e('custom post type',RC_TXT_DOMAIN) ?></th>
49267e52
                 <td>
8d113771
                     <input type="text" value="<?php echo $customPostTypes ?>" name="rc_custom_post" placeholder="<?php _e('Separated by commas',RC_TXT_DOMAIN) ?>">
                     <?php 
                         if(isset($message['custom_post']))
                         {
                             echo '<p>'.$message['custom_post'].'</p>';
                         }
                     ?>
49267e52
                 </td>
             </tr>
         </table>
         <input type="hidden" name="action" value="update" />
8d113771
         <input type="hidden" name="page_options" value="<?php echo RC_SETTING_OPTION_KEY ?>"/>
49267e52
         <p class="submit">
             <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
         </p>
     </form>
0f52aed2
     <h3><?php _e("Contact",RC_TXT_DOMAIN) ?></h3>
     <p>
     <?php _e('Rucy is maintained by <a href="http://profiles.wordpress.org/gips-nita/">nita</a>.<br>', RC_TXT_DOMAIN) ?>
44e6ce1f
     <?php _e('If you have found a bug or would like to make a suggestion or contribution why not join the <a href="https://wordpress.org/support/plugin/rucy">Support Form @ wordpress.org</a><br />',RC_TXT_DOMAIN);?>
     <?php _e("Please consider donating if you like this plugin. I've put a lot of my free time into this plugin and donations help to justify it.<br />",RC_TXT_DOMAIN); ?>
0f52aed2
     </p>
44e6ce1f
     <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
         <input type="hidden" name="cmd" value="_donations">
         <input type="hidden" name="business" value="J2GV73KGN5MKN">
         <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif"border="0" name="submit"alt="PayPal - The safer, easier way to pay online!">
     </form>
49267e52
 </div>
 <?php
 }
b4c3c653
 /**
  * get post type allowed rucy
  * 
  * @param boolean $isArray
  * @return string
  */
49267e52
 function getRcSetting($isArray = true)
 {
     $rc_setting = get_option(RC_SETTING_OPTION_KEY);
     $res = "";
     if(!$rc_setting)
     {
         $rc_setting = RC_POSTTYPE_DEFAULT;
     }
     if($isArray)
     {
         $res = explode(',', $rc_setting);
     } else {
         $res = $rc_setting;
     }
     return $res;
 }
 
e7e80c88
 // uninstall
 if(function_exists('register_uninstall_hook'))
 {
b4c3c653
     register_uninstall_hook(__FILE__, 'goodbyeRucy');
e7e80c88
 }
 
b4c3c653
 function goodbyeRucy()
e7e80c88
 {
81f9bb6c
     wp_clear_scheduled_hook(RC_CRON_HOOK);
e7e80c88
     delete_option(RC_SETTING_OPTION_KEY);
     $allposts = get_posts('numberposts=-1&post_status=');
     $meta_keys = getRcMetas();
     foreach ($allposts as $postinfo)
     {
765926c5
         foreach ($meta_keys as $k => $val)
e7e80c88
         {
765926c5
             delete_post_meta($postinfo->ID, $val);
e7e80c88
         }
     }
 }
0f52aed2
 
 // link to setting
 add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'helloRucy');
 function helloRucy($links){
     $links[] = '<a href="' . get_admin_url(null, 'options-general.php?page=rucy') . '">' . __('Settings') . '</a>';
     return $links;
 }