XylotrechusZ
<?php
/*
* Goodlayers Revision
* ---------------------------------------------------------------------
* File which store the revision
* ---------------------------------------------------------------------
*/
if( !class_exists('gdlr_core_revision') ){
class gdlr_core_revision{
// static function for field registration
private static $revision_fields = array();
static function add_field( $field ){
self::$revision_fields[] = $field;
}
// starting revision object
private $num_revision;
function __construct( $num_revision = 5 ){
// for revision
$this->num_revision = $num_revision;
add_filter('wp_revisions_to_keep', array(&$this, 'filter_function_name'), 10, 2);
add_action('init', array(&$this, 'add_revision_action'));
// for preview button
// add_action('wp_creating_autosave', array(&$this, 'autosave_page_preview'), 10, 4);
// add_filter('get_post_metadata', array(&$this, 'apply_page_preview_content'), 10, 4);
}
function add_revision_action(){
add_filter('wp_save_post_revision_post_has_changed', array(&$this, 'check_revision_field_changes'), 10, 3);
add_action('_wp_put_post_revision', array(&$this, 'update_revision_meta_field'));
add_action('wp_restore_post_revision', array(&$this, 'restore_revision_meta_filed'), 10, 2);
// for preview revision
global $pagenow;
if( !empty($pagenow) && ( $pagenow == 'revision.php' || ($pagenow == 'admin-ajax.php' && !empty($_POST['action']) && $_POST['action'] == 'get-revision-diffs') ) ){
add_filter('_wp_post_revision_fields', array(&$this, 'add_preview_revision_fields'));
foreach( self::$revision_fields as $revision_field ){
if( !empty($revision_field['callback']) ){
add_filter('_wp_post_revision_field_' . $revision_field['meta_key'], $revision_field['callback']);
}
}
}
}
// define the number of revision user can stored
function filter_function_name( $num, $post ) {
return $this->num_revision;
}
// check if there are any changes to meta fields
function check_revision_field_changes( $post_has_changed, $last_revision, $post ){
foreach( self::$revision_fields as $revision_field ){
if( get_post_meta($post->ID, $revision_field['meta_key'], true) != get_post_meta($last_revision->ID, $revision_field['meta_key'], true) ){
$post_has_changed = true;
}
}
return $post_has_changed;
}
// update meta field when revision is updated
function update_revision_meta_field( $revision_id ){
$post_parent = wp_is_post_revision($revision_id);
foreach( self::$revision_fields as $revision_field ){
$meta_value = get_post_meta($post_parent, $revision_field['meta_key'], true);
if( !empty($meta_value) ){
add_metadata('post', $revision_id, $revision_field['meta_key'], $meta_value);
}
}
}
// restore meta field when revision is restored
function restore_revision_meta_filed( $post_id, $revision_id ){
foreach( self::$revision_fields as $revision_field ){
$revision_data = get_post_meta($revision_id, $revision_field['meta_key'], true);
if( !empty($revision_data) ){
update_post_meta($post_id, $revision_field['meta_key'], $revision_data);
}
}
}
// for previewing the revision
function add_preview_revision_fields( $fields ){
foreach( self::$revision_fields as $revision_field ){
$fields[$revision_field['meta_key']] = $revision_field['meta_name'];
}
return $fields;
}
// save the page preview
function autosave_page_preview($new_autosave){
if( !empty($new_autosave['ID']) ){
foreach( self::$revision_fields as $revision_field ){
if( !empty($_POST[$revision_field['meta_key']]) ){
$value = json_decode(gdlr_core_process_post_data($_POST[$revision_field['meta_key']]), true);
$value = wp_slash($value);
if( is_array($value) ){
delete_metadata('post', $new_autosave['ID'], $revision_field['meta_key']);
update_metadata('post', $new_autosave['ID'], $revision_field['meta_key'], $value);
}
}
}
}
}
// fetching the value for preview page
function apply_page_preview_content($value, $object_id, $meta_key, $single){
if(empty($_GET['preview'])) return $value;
$is_meta_field = false;
foreach(self::$revision_fields as $revision_field){
if( $meta_key == $revision_field['meta_key']){
$is_meta_field = true;
}
}
$post = get_post();
if(empty($post) || $post->ID != $object_id || !$is_meta_field || 'revision' == $post->post_type){
return $value;
}
$preview = wp_get_post_autosave($post->ID);
if(!is_object($preview)) return $value;
if( $single ){
return array(get_post_meta($preview->ID, $meta_key, $single));
}else{
return get_post_meta($preview->ID, $meta_key, $single);
}
}
} // gdlr_core_revision
} // class_exists