Plugin Directory

Changeset 475708


Ignore:
Timestamp:
12/15/2011 05:37:24 AM (14 years ago)
Author:
mohanjith
Message:

1.0.7

Location:
wordpress-wiki-plugin/trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • wordpress-wiki-plugin/trunk/css/style.css

    r382610 r475708  
    3737    border-width: 1px 1px 0 1px !important;
    3838    padding-bottom: 0.1em !important;
    39     margin: 0 0.5em 0 0 !important;
     39    margin: 0 5px 0 0 !important;
    4040    color: #333 !important;
    4141    background: #efefef !important;
     
    4343
    4444.incsub_wiki_tabs .right li {
    45     margin: 0 0 0 0.5em !important;
     45    margin: 0 0 0 5px !important;
    4646}
    4747
  • wordpress-wiki-plugin/trunk/readme.txt

    r411786 r475708  
    9292== Changelog ==
    9393
     94= 1.0.7 =
     95* WordPress 3.3 compatibility
     96* More minor improvements
     97
    9498= 1.0.6 =
    9599* Remove update notifier
  • wordpress-wiki-plugin/trunk/wiki.php

    r411786 r475708  
    1 <?php
    2 /*
    3  Plugin Name: Wiki
    4  Plugin URI: http://premium.wpmudev.org/project/wiki
    5  Description: Add a wiki to your blog
    6  Author: S H Mohanjith (Incsub)
    7  WDP ID: 225
    8  Version: 1.0.6
    9  Stable tag: trunk
    10  Author URI: http://premium.wpmudev.org
    11 */
    12 /**
    13  * @global  object  $wiki   Convenient access to the chat object
    14  */
    15 global $wiki;
    16 
    17 /**
    18  * Wiki object (PHP4 compatible)
    19  *
    20  * Add a wiki to your blog
    21  *
    22  * @since 1.0.0
    23  * @author S H Mohanjith <[email protected]>
    24  */
    25 class Wiki {
    26     /**
    27      * @todo Update version number for new releases
    28      *
    29      * @var     string  $current_version    Current version
    30      */
    31     var $current_version = '1.0.5';
    32     /**
    33      * @var     string  $translation_domain Translation domain
    34      */
    35     var $translation_domain = 'wiki';
    36    
    37     var $db_prefix = '';
    38    
    39     /**
    40      * @var     array   $_options       Consolidated options
    41      */
    42     var $_options = array();
    43    
    44     /**
    45      * Get the table name with prefixes
    46      *
    47      * @global  object  $wpdb
    48      * @param   string  $table  Table name
    49      * @return  string          Table name complete with prefixes
    50      */
    51     function tablename($table) {
    52     global $wpdb;
    53         // We use a single table for all chats accross the network
    54         return $wpdb->base_prefix.'wiki_'.$table;
    55     }
    56    
    57     /**
    58      * Initializing object
    59      *
    60      * Plugin register actions, filters and hooks.
    61      */
    62     function Wiki() {
    63     global $wpdb;
    64    
    65     // Activation deactivation hooks
    66     register_activation_hook(__FILE__, array(&$this, 'install'));
    67     register_deactivation_hook(__FILE__, array(&$this, 'uninstall'));
    68    
    69         // Actions
    70     add_action('init', array(&$this, 'init'), 0);
    71     add_action('init', array(&$this, 'post_action'));
    72     add_action('wp_head', array(&$this, 'output_css'));
    73     add_action('wp_head', array(&$this, 'output_js'), 0);
    74        
    75     add_action('admin_print_styles-settings_page_wiki', array(&$this, 'admin_styles'));
    76         add_action('admin_print_scripts-settings_page_wiki', array(&$this, 'admin_scripts'));
    77    
    78     add_action('add_meta_boxes_incsub_wiki', array(&$this, 'meta_boxes') );
    79     add_action('wp_insert_post', array(&$this, 'save_wiki_meta'), 10, 2 );
    80    
    81         add_filter('admin_menu', array(&$this, 'admin_menu'));
    82    
    83     add_action('widgets_init', array(&$this, 'widgets_init'));
    84     add_action('pre_post_update', array(&$this, 'send_notifications'), 50, 1);
    85     add_action('template_redirect', array(&$this, 'load_templates') );
    86    
    87     add_filter('post_type_link', array(&$this, 'post_type_link'), 10, 3);
    88     add_filter('name_save_pre', array(&$this, 'name_save'));
    89     // add_filter('the_content', array(&$this, 'the_content'));
    90     add_filter('role_has_cap', array(&$this, 'role_has_cap'), 10, 3);
    91     add_filter('user_has_cap', array(&$this, 'user_has_cap'), 10, 3);
    92    
    93     add_filter('get_edit_post_link', array(&$this, 'get_edit_post_link'));
    94     add_filter('comments_open', array(&$this, 'comments_open'), 10, 1);
    95    
    96     add_filter('rewrite_rules_array', array(&$this, 'add_rewrite_rules'));
    97     add_action('option_rewrite_rules', array(&$this, 'check_rewrite_rules'));
    98    
    99     add_filter('user_can_richedit', array(&$this, 'user_can_richedit'));
    100    
    101     // White list the options to make sure non super admin can save wiki options
    102     // add_filter('whitelist_options', array(&$this, 'whitelist_options'));
    103    
    104     if ( !empty($wpdb->base_prefix) ) {
    105         $this->db_prefix = $wpdb->base_prefix;
    106     } else {
    107         $this->db_prefix = $wpdb->prefix;
    108     }
    109    
    110     $this->_options['default'] = get_option('wiki_default', array('slug' => 'wiki'));
    111     }
    112    
    113     function load_templates() {
    114     global $wp_query;
    115    
    116     if ($wp_query->is_single && $wp_query->query_vars['post_type'] == 'incsub_wiki') {
    117         //check for custom theme templates
    118         $wiki_name = get_query_var('incsub_wiki');
    119         $wiki_id = (int) $wp_query->get_queried_object_id();
    120         $templates = array();
    121        
    122         if ( $product_name ) {
    123         $templates[] = "incsub_wiki-$wiki_name.php";
    124         }
    125        
    126         if ( $product_id ) {
    127         $templates[] = "incsub_wiki-$wiki_id.php";
    128         }
    129         $templates[] = "incsub_wiki.php";
    130        
    131         if ($this->wiki_template = locate_template($templates)) {
    132           add_filter('template_include', array(&$this, 'custom_template') );
    133         } else {
    134           //otherwise load the page template and use our own theme
    135           $wp_query->is_single = null;
    136           $wp_query->is_page = 1;
    137           add_filter('the_content', array(&$this, 'theme'), 99 );
    138         }
    139         $this->is_wiki_page = true;
    140     }
    141     }
    142    
    143     function custom_template() {
    144     return $this->wiki_template;
    145     }
    146    
    147     function user_can_richedit($wp_rich_edit) {
    148     global $post;
    149    
    150     if ($post->post_type) {
    151         return true;
    152     }
    153     return $wp_rich_edit;
    154     }
    155    
    156     function add_rewrite_rules($rules){
    157     $settings = get_option('incsub_wiki_settings');
    158    
    159     $new_rules = array();
    160    
    161     $new_rules[$this->_options['default']['slug'].'/(.+?)/?$'] = 'index.php?incsub_wiki=$matches[1]';
    162    
    163     return array_merge($new_rules, $rules);
    164     }
    165    
    166     function check_rewrite_rules($value) {
    167     //prevent an infinite loop
    168     if ( ! post_type_exists( 'incsub_wiki' ) )
    169         return;
    170    
    171     if (!is_array($value))
    172         $value = array();
    173    
    174     $array_key = $this->_options['default']['slug'].'/(.+?)';
    175     if ( !array_key_exists($array_key, $value) ) {
    176         $this->flush_rewrite();
    177     }
    178     }
    179    
    180     function flush_rewrite() {
    181     global $wp_rewrite;
    182     $wp_rewrite->flush_rules();
    183     }
    184    
    185     function comments_open($open) {
    186     global $post, $incsub_tab_check;
    187    
    188     if ($post->post_type == 'incsub_wiki' && $_REQUEST['action'] != 'discussion') {
    189         if ($incsub_tab_check == 0 && !isset($_POST['submit'])) {
    190         return false;
    191         }
    192     }
    193     return $open;
    194     }
    195    
    196     /**
    197      * Rename $_POST data from form names to DB post columns.
    198      *
    199      * Manipulates $_POST directly.
    200      *
    201      * @package WordPress
    202      * @since 2.6.0
    203      *
    204      * @param bool $update Are we updating a pre-existing post?
    205      * @param array $post_data Array of post data. Defaults to the contents of $_POST.
    206      * @return object|bool WP_Error on failure, true on success.
    207      */
    208     function _translate_postdata( $update = false, $post_data = null ) {
    209     if ( empty($post_data) )
    210         $post_data = &$_POST;
    211 
    212     if ( $update )
    213         $post_data['ID'] = (int) $post_data['post_ID'];
    214     $post_data['post_content'] = isset($post_data['content']) ? $post_data['content'] : '';
    215     $post_data['post_excerpt'] = isset($post_data['excerpt']) ? $post_data['excerpt'] : '';
    216     $post_data['post_parent'] = isset($post_data['parent_id'])? $post_data['parent_id'] : '';
    217     if ( isset($post_data['trackback_url']) )
    218         $post_data['to_ping'] = $post_data['trackback_url'];
    219 
    220     if ( !isset($post_data['user_ID']) )
    221         $post_data['user_ID'] = $GLOBALS['user_ID'];
    222 
    223     if (!empty ( $post_data['post_author_override'] ) ) {
    224         $post_data['post_author'] = (int) $post_data['post_author_override'];
    225     } else {
    226         if (!empty ( $post_data['post_author'] ) ) {
    227             $post_data['post_author'] = (int) $post_data['post_author'];
    228         } else {
    229             $post_data['post_author'] = (int) $post_data['user_ID'];
    230         }
    231     }
    232 
    233     $ptype = get_post_type_object( $post_data['post_type'] );
    234     if ( isset($post_data['user_ID']) && ($post_data['post_author'] != $post_data['user_ID']) ) {
    235         if ( !current_user_can( $ptype->cap->edit_others_posts ) ) {
    236             if ( 'page' == $post_data['post_type'] ) {
    237                 return new WP_Error( 'edit_others_pages', $update ?
    238                     __( 'You are not allowed to edit pages as this user.' ) :
    239                     __( 'You are not allowed to create pages as this user.' )
    240                 );
    241             } else {
    242                 return new WP_Error( 'edit_others_posts', $update ?
    243                     __( 'You are not allowed to edit posts as this user.' ) :
    244                     __( 'You are not allowed to post as this user.' )
    245                 );
    246             }
    247         }
    248     }
    249 
    250     // What to do based on which button they pressed
    251     if ( isset($post_data['saveasdraft']) && '' != $post_data['saveasdraft'] )
    252         $post_data['post_status'] = 'draft';
    253     if ( isset($post_data['saveasprivate']) && '' != $post_data['saveasprivate'] )
    254         $post_data['post_status'] = 'private';
    255     if ( isset($post_data['publish']) && ( '' != $post_data['publish'] ) && ( !isset($post_data['post_status']) || $post_data['post_status'] != 'private' ) )
    256         $post_data['post_status'] = 'publish';
    257     if ( isset($post_data['advanced']) && '' != $post_data['advanced'] )
    258         $post_data['post_status'] = 'draft';
    259     if ( isset($post_data['pending']) && '' != $post_data['pending'] )
    260         $post_data['post_status'] = 'pending';
    261 
    262     if ( isset( $post_data['ID'] ) )
    263         $post_id = $post_data['ID'];
    264     else
    265         $post_id = false;
    266     $previous_status = $post_id ? get_post_field( 'post_status', $post_id ) : false;
    267 
    268     // Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published.
    269     // Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts.
    270     if ( isset($post_data['post_status']) && ('publish' == $post_data['post_status'] && !current_user_can( $ptype->cap->publish_posts )) )
    271         if ( $previous_status != 'publish' || !current_user_can( 'edit_post', $post_id ) )
    272             $post_data['post_status'] = 'pending';
    273 
    274     if ( ! isset($post_data['post_status']) )
    275         $post_data['post_status'] = $previous_status;
    276 
    277     if (!isset( $post_data['comment_status'] ))
    278         $post_data['comment_status'] = 'closed';
    279 
    280     if (!isset( $post_data['ping_status'] ))
    281         $post_data['ping_status'] = 'closed';
    282 
    283     foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
    284         if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) {
    285             $post_data['edit_date'] = '1';
    286             break;
    287         }
    288     }
    289 
    290     if ( !empty( $post_data['edit_date'] ) ) {
    291         $aa = $post_data['aa'];
    292         $mm = $post_data['mm'];
    293         $jj = $post_data['jj'];
    294         $hh = $post_data['hh'];
    295         $mn = $post_data['mn'];
    296         $ss = $post_data['ss'];
    297         $aa = ($aa <= 0 ) ? date('Y') : $aa;
    298         $mm = ($mm <= 0 ) ? date('n') : $mm;
    299         $jj = ($jj > 31 ) ? 31 : $jj;
    300         $jj = ($jj <= 0 ) ? date('j') : $jj;
    301         $hh = ($hh > 23 ) ? $hh -24 : $hh;
    302         $mn = ($mn > 59 ) ? $mn -60 : $mn;
    303         $ss = ($ss > 59 ) ? $ss -60 : $ss;
    304         $post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
    305         $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
    306     }
    307 
    308     return $post_data;
    309     }
    310    
    311     /**
    312      * Update an existing post with values provided in $_POST.
    313      *
    314      * @since 1.5.0
    315      *
    316      * @param array $post_data Optional.
    317      * @return int Post ID.
    318      */
    319     function edit_post( $post_data = null ) {
    320 
    321     if ( empty($post_data) )
    322         $post_data = &$_POST;
    323    
    324     $post_ID = (int) $post_data['post_ID'];
    325    
    326     $ptype = get_post_type_object($post_data['post_type']);
    327    
    328     if ( !current_user_can( $ptype->cap->edit_post, $post_ID ) ) {
    329         if ( 'page' == $post_data['post_type'] )
    330         wp_die( __('You are not allowed to edit this page.' ));
    331         else
    332         wp_die( __('You are not allowed to edit this post.' ));
    333     }
    334    
    335     // Autosave shouldn't save too soon after a real save
    336     if ( 'autosave' == $post_data['action'] ) {
    337         $post =& get_post( $post_ID );
    338         $now = time();
    339         $then = strtotime($post->post_date_gmt . ' +0000');
    340         $delta = AUTOSAVE_INTERVAL / 2;
    341         if ( ($now - $then) < $delta )
    342         return $post_ID;
    343     }
    344    
    345     $post_data = $this->_translate_postdata( true, $post_data );
    346     $post_data['post_status'] = 'publish';
    347     if ( is_wp_error($post_data) )
    348         wp_die( $post_data->get_error_message() );
    349     if ( 'autosave' != $post_data['action']  && 'auto-draft' == $post_data['post_status'] )
    350         $post_data['post_status'] = 'draft';
    351    
    352     if ( isset($post_data['visibility']) ) {
    353         switch ( $post_data['visibility'] ) {
    354         case 'public' :
    355             $post_data['post_password'] = '';
    356             break;
    357         case 'password' :
    358             unset( $post_data['sticky'] );
    359             break;
    360         case 'private' :
    361             $post_data['post_status'] = 'private';
    362             $post_data['post_password'] = '';
    363             unset( $post_data['sticky'] );
    364             break;
    365         }
    366     }
    367    
    368     // Post Formats
    369     if ( current_theme_supports( 'post-formats' ) && isset( $post_data['post_format'] ) ) {
    370         $formats = get_theme_support( 'post-formats' );
    371         if ( is_array( $formats ) ) {
    372         $formats = $formats[0];
    373         if ( in_array( $post_data['post_format'], $formats ) ) {
    374             set_post_format( $post_ID, $post_data['post_format'] );
    375         } elseif ( '0' == $post_data['post_format'] ) {
    376             set_post_format( $post_ID, false );
    377         }
    378         }
    379     }
    380     // print_r($post_data); exit();
    381     // Meta Stuff
    382     if ( isset($post_data['meta']) && $post_data['meta'] ) {
    383         foreach ( $post_data['meta'] as $key => $value ) {
    384         if ( !$meta = get_post_meta_by_id( $key ) )
    385             continue;
    386         if ( $meta->post_id != $post_ID )
    387             continue;
    388         update_meta( $key, $value['key'], $value['value'] );
    389         }
    390     }
    391    
    392     if ( isset($post_data['deletemeta']) && $post_data['deletemeta'] ) {
    393         foreach ( $post_data['deletemeta'] as $key => $value ) {
    394         if ( !$meta = get_post_meta_by_id( $key ) )
    395             continue;
    396         if ( $meta->post_id != $post_ID )
    397             continue;
    398         delete_meta( $key );
    399         }
    400     }
    401    
    402     // add_meta( $post_ID );
    403    
    404     update_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID );
    405    
    406     wp_update_post( $post_data );
    407    
    408     // Reunite any orphaned attachments with their parent
    409     if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
    410         $draft_ids = array();
    411     if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) )
    412         _relocate_children( $draft_temp_id, $post_ID );
    413    
    414     $this->set_post_lock( $post_ID, $GLOBALS['current_user']->ID );
    415    
    416     if ( current_user_can( $ptype->cap->edit_others_posts ) ) {
    417         if ( ! empty( $post_data['sticky'] ) )
    418         stick_post( $post_ID );
    419         else
    420         unstick_post( $post_ID );
    421     }
    422    
    423     return $post_ID;
    424     }
    425    
    426     function post_action() {
    427     global $post;
    428    
    429     switch ($_REQUEST['action']) {
    430         case 'editpost':
    431         if (wp_verify_nonce($_POST['_wpnonce'], "wiki-editpost_{$_POST['post_ID']}")) {
    432             $post_id = $this->edit_post($_POST);
    433             wp_redirect(get_permalink($post_id));
    434             exit();
    435         }
    436         break;
    437     }
    438     }
    439 
    440     function theme($content) {
    441     global $post;
    442    
    443     $new_content  = '<div class="incsub_wiki incsub_wiki_single">';
    444     $new_content .= '<div class="incsub_wiki_tabs incsub_wiki_tabs_top">' . $this->tabs() . '<div class="incsub_wiki_clear"></div></div>';
    445    
    446     $revision_id = isset($_REQUEST['revision'])?absint($_REQUEST['revision']):0;
    447         $left        = isset($_REQUEST['left'])?absint($_REQUEST['left']):0;
    448     $right       = isset($_REQUEST['right'])?absint($_REQUEST['right']):0;
    449     $action      = isset($_REQUEST['action'])?$_REQUEST['action']:'view';
    450    
    451     switch ($_REQUEST['action']) {
    452         case 'discussion':
    453         break;
    454         case 'edit':
    455         set_include_path(get_include_path().PATH_SEPARATOR.ABSPATH.'wp-admin');
    456        
    457         $post_type_object = get_post_type_object($post->post_type);
    458        
    459         $p = $post;
    460        
    461         if ( empty($post->ID) )
    462             wp_die( __('You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?') );
    463        
    464         if ( !current_user_can($post_type_object->cap->edit_post, $post_id) )
    465             wp_die( __('You are not allowed to edit this item.') );
    466            
    467         if ( 'trash' == $post->post_status )
    468             wp_die( __('You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.') );
    469            
    470         if ( null == $post_type_object )
    471             wp_die( __('Unknown post type.') );
    472            
    473         $post_type = $post->post_type;
    474        
    475         if ( $last = $this->check_post_lock( $post->ID ) ) {
    476             add_action('admin_notices', '_admin_notice_post_locked' );
    477         } else {
    478             $this->set_post_lock( $post->ID );
    479             wp_enqueue_script('autosave');
    480         }
    481        
    482         $title = $post_type_object->labels->edit_item;
    483         $post = $this->post_to_edit($post_id);
    484        
    485         $new_content .= $this->get_edit_form();
    486         break;
    487         case 'restore':
    488         if ( !$revision = wp_get_post_revision( $revision_id ) )
    489             break;
    490         if ( !current_user_can( 'edit_post', $revision->post_parent ) )
    491             break;
    492         if ( !$post = get_post( $revision->post_parent ) )
    493             break;
    494        
    495         // Revisions disabled and we're not looking at an autosave
    496         if ( ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) && !wp_is_post_autosave( $revision ) ) {
    497             $redirect = get_permalink().'?action=edit';
    498             break;
    499         }
    500        
    501         check_admin_referer( "restore-post_$post->ID|$revision->ID" );
    502        
    503         wp_restore_post_revision( $revision->ID );
    504         $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_permalink().'?action=edit' );
    505         break;
    506         case 'diff':
    507         if ( !$left_revision  = get_post( $left ) ) {
    508             break;
    509         }
    510         if ( !$right_revision = get_post( $right ) ) {
    511             break;
    512         }
    513        
    514         /*if ( !current_user_can( 'read_post', $left_revision->ID ) || !current_user_can( 'read_post', $right_revision->ID ) ) {
    515             break;
    516         }*/
    517        
    518         // If we're comparing a revision to itself, redirect to the 'view' page for that revision or the edit page for that post
    519         if ( $left_revision->ID == $right_revision->ID ) {
    520             $redirect = get_edit_post_link( $left_revision->ID );
    521             include( ABSPATH . 'wp-admin/js/revisions-js.php' );
    522             break;
    523         }
    524        
    525         // Don't allow reverse diffs?
    526         if ( strtotime($right_revision->post_modified_gmt) < strtotime($left_revision->post_modified_gmt) ) {
    527             $redirect = add_query_arg( array( 'left' => $right, 'right' => $left ) );
    528             break;
    529         }
    530        
    531         if ( $left_revision->ID == $right_revision->post_parent ) // right is a revision of left
    532             $post =& $left_revision;
    533         elseif ( $left_revision->post_parent == $right_revision->ID ) // left is a revision of right
    534             $post =& $right_revision;
    535         elseif ( $left_revision->post_parent == $right_revision->post_parent ) // both are revisions of common parent
    536             $post = get_post( $left_revision->post_parent );
    537         else
    538             break; // Don't diff two unrelated revisions
    539        
    540         if ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) { // Revisions disabled
    541             if (
    542             // we're not looking at an autosave
    543                 ( !wp_is_post_autosave( $left_revision ) && !wp_is_post_autosave( $right_revision ) )
    544             ||
    545             // we're not comparing an autosave to the current post
    546             ( $post->ID !== $left_revision->ID && $post->ID !== $right_revision->ID )
    547             ) {
    548             $redirect = get_permalink().'?action=edit';
    549             break;
    550             }
    551         }
    552        
    553         if (
    554             // They're the same
    555             $left_revision->ID == $right_revision->ID
    556             ||
    557             // Neither is a revision
    558             ( !wp_get_post_revision( $left_revision->ID ) && !wp_get_post_revision( $right_revision->ID ) )
    559             ) {
    560             break;
    561         }
    562        
    563         $post_title = '<a href="' . get_permalink().'?action=edit' . '">' . get_the_title() . '</a>';
    564         $h2 = sprintf( __( 'Compare Revisions of &#8220;%1$s&#8221;' ), $post_title );
    565         $title = __( 'Revisions' );
    566        
    567         $left  = $left_revision->ID;
    568         $right = $right_revision->ID;
    569         case 'history':
    570         $args = array( 'format' => 'form-table', 'parent' => false, 'right' => $right, 'left' => $left );
    571         if ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) {
    572             $args['type'] = 'autosave';
    573         }
    574        
    575         if (!isset($h2)) {
    576             $post_title = '<a href="' . get_permalink().'?action=edit' . '">' . get_the_title() . '</a>';
    577             $revisions = wp_get_post_revisions( $post->ID );
    578             $revision = array_shift($revisions);
    579             $revision_title = wp_post_revision_title( $revision, false );
    580             $h2 = sprintf( __( 'Revision for &#8220;%1$s&#8221; created on %2$s' ), $post_title, $revision_title );
    581         }
    582        
    583         $new_content .= '<h3 class="long-header">'.$h2.'</h3>';
    584         $new_content .= '<table class="form-table ie-fixed">';
    585         $new_content .= '<col class="th" />';
    586        
    587         if ( 'diff' == $action ) :
    588             $new_content .= '<tr id="revision">';
    589             $new_content .= '<th scope="row"></th>';
    590             $new_content .= '<th scope="col" class="th-full">';
    591             $new_content .= '<span class="alignleft">'.sprintf( __('Older: %s', $this->translation_domain), wp_post_revision_title( $left_revision, false ) ).'</span>';
    592             $new_content .= '<span class="alignright">'.sprintf( __('Newer: %s', $this->translation_domain), wp_post_revision_title( $right_revision, false ) ).'</span>';
    593             $new_content .= '</th>';
    594             $new_content .= '</tr>';
    595         endif;
    596        
    597         // use get_post_to_edit filters?
    598         $identical = true;
    599         foreach ( _wp_post_revision_fields() as $field => $field_title ) :
    600             if ( 'diff' == $action ) {
    601             $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field );
    602             $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field );
    603             if ( !$rcontent = wp_text_diff( $left_content, $right_content ) )
    604                     continue; // There is no difference between left and right
    605             $identical = false;
    606             } else {
    607             add_filter( "_wp_post_revision_field_$field", 'htmlspecialchars' );
    608             $rcontent = apply_filters( "_wp_post_revision_field_$field", $revision->$field, $field );
    609             }
    610             $new_content .= '<tr id="revision-field-<?php echo $field; ?>">';
    611             $new_content .= '<th scope="row">'.esc_html( $field_title ).'</th>';
    612             $new_content .= '<td><div class="pre">'.$rcontent.'</div></td>';
    613             $new_content .= '</tr>';
    614         endforeach;
    615        
    616         if ( 'diff' == $action && $identical ) :
    617             $new_content .= '<tr><td colspan="2"><div class="updated"><p>'.__( 'These revisions are identical.', $this->translation_domain ). '</p></div></td></tr>';
    618         endif;
    619        
    620         $new_content .= '</table>';
    621 
    622         $new_content .= '<br class="clear" />';
    623         $new_content .= '<div class="incsub_wiki_revisions">' . $this->list_post_revisions( $post, $args ) . '</div>';
    624         $redirect = false;
    625         break;
    626         default:
    627         $top = "";
    628        
    629         $crumbs = array();
    630         foreach($post->ancestors as $parent_pid) {
    631             $parent_post = get_post($parent_pid);
    632            
    633             $crumbs[] = '<a href="'.get_permalink($parent_pid).'" class="incsub_wiki_crumbs">'.$parent_post->post_title.'</a>';
    634         }
    635        
    636         $crumbs[] = '<span class="incsub_wiki_crumbs">'.$post->post_title.'</span>';
    637        
    638         sort($crumbs);
    639        
    640         $top .= join(get_option("incsub_meta_seperator", " > "), $crumbs);
    641        
    642         $children = get_children('post_parent='.$post->ID.'&post_type=incsub_wiki');
    643        
    644         $crumbs = array();
    645         foreach($children as $child) {
    646             $crumbs[] = '<a href="'.get_permalink($child->ID).'" class="incsub_wiki_crumbs">'.$child->post_title.'</a>';
    647         }
    648        
    649         $bottom = "<h3>".__('Sub Wikis', $this->translation_domain) . "</h3> <ul><li>";
    650        
    651         $bottom .= join("</li><li>", $crumbs);
    652        
    653         if (count($crumbs) == 0) {
    654             $bottom = "";
    655         } else {
    656             $bottom .= "</li></ul>";
    657         }
    658        
    659         $revisions = wp_get_post_revisions($post->ID);
    660        
    661         if (current_user_can('edit_wiki')) {
    662             $bottom .= '<div class="incsub_wiki-meta">';
    663             if (is_array($revisions) && count($revisions) > 0) {
    664             $revision = array_shift($revisions);
    665             }
    666             $bottom .= '</div>';
    667         }
    668        
    669         $notification_meta = get_post_custom($post->ID, array('incsub_wiki_email_notification' => 'enabled'));
    670        
    671         if ($notification_meta['incsub_wiki_email_notification'][0] == 'enabled' && !$this->is_subscribed()) {
    672             if (is_user_logged_in()) {
    673                 $bottom .= '<div class="incsub_wiki-subscribe"><a href="'.wp_nonce_url(add_query_arg(array('post_id' => $post->ID, 'subscribe' => 1)), "wiki-subscribe-wiki_$post->ID" ).'">'.__('Notify me of changes', $this->translation_domain).'</a></div>';
    674             } else {
    675             if (!empty($_COOKIE['incsub_wiki_email'])) {
    676                 $user_email = $_COOKIE['incsub_wiki_email'];
    677             } else {
    678                 $user_email = "";
    679             }
    680             $bottom .= '<div class="incsub_wiki-subscribe">'.
    681             '<form action="" method="post">'.
    682             '<label>'.__('E-mail', $this->translation_domain).': <input type="text" name="email" id="email" value="'.$user_email.'" /></label> &nbsp;'.
    683             '<input type="hidden" name="post_id" id="post_id" value="'.$post->ID.'" />'.
    684             '<input type="submit" name="subscribe" id="subscribe" value="'.__('Notify me of changes', $this->translation_domain).'" />'.
    685             '<input type="hidden" name="_wpnonce" id="_wpnonce" value="'.wp_create_nonce("wiki-subscribe-wiki_$post->ID").'" />'.
    686             '</form>'.
    687             '</div>';
    688             }
    689         }
    690         $new_content  = '<div class="incsub_wiki_top">' . $top . '</div>'. $new_content;
    691         $new_content .= '<div class="incsub_wiki_content">' . $content . '</div>';
    692         $new_content .= '<div class="incsub_wiki_bottom">' . $bottom . '</div>';
    693         $redirect = false;
    694     }
    695    
    696     $new_content .= '</div>';
    697    
    698     if ( !comments_open() ) {
    699         $new_content .= '<style type="text/css">'.
    700         '#comments { display: none; }'.
    701         '</style>';
    702     } else {
    703         $new_content .= '<style type="text/css">'.
    704         '.hentry { margin-bottom: 5px; }'.
    705         '</style>';
    706     }
    707    
    708     // Empty post_type means either malformed object found, or no valid parent was found.
    709     if ( !$redirect && empty($post->post_type) ) {
    710         $redirect = 'edit.php';
    711     }
    712    
    713     if ( !empty($redirect) ) {
    714         echo '<script type="text/javascript">'.
    715         'window.location = "'.$redirect.'";'.
    716         '</script>';
    717         exit;
    718     }
    719    
    720     return $new_content;
    721     }
    722 
    723     /**
    724      * Default post information to use when populating the "Write Post" form.
    725      *
    726      * @since 2.0.0
    727      *
    728      * @param string $post_type A post type string, defaults to 'post'.
    729      * @return object stdClass object containing all the default post data as attributes
    730      */
    731     function get_default_post_to_edit( $post_type = 'post', $create_in_db = false, $parent_id = 0 ) {
    732     global $wpdb;
    733 
    734     $post_title = '';
    735     if ( !empty( $_REQUEST['post_title'] ) )
    736         $post_title = esc_html( stripslashes( $_REQUEST['post_title'] ));
    737 
    738     $post_content = '';
    739     if ( !empty( $_REQUEST['content'] ) )
    740         $post_content = esc_html( stripslashes( $_REQUEST['content'] ));
    741 
    742     $post_excerpt = '';
    743     if ( !empty( $_REQUEST['excerpt'] ) )
    744         $post_excerpt = esc_html( stripslashes( $_REQUEST['excerpt'] ));
    745 
    746     if ( $create_in_db ) {
    747         // Cleanup old auto-drafts more than 7 days old
    748         $old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date" );
    749         foreach ( (array) $old_posts as $delete )
    750         wp_delete_post( $delete, true ); // Force delete
    751         $post_id = wp_insert_post( array( 'post_parent' => $parent_id, 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
    752         $post = get_post( $post_id );
    753         if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) )
    754         set_post_format( $post, get_option( 'default_post_format' ) );
    755     } else {
    756         $post->ID = 0;
    757         $post->post_author = '';
    758         $post->post_date = '';
    759         $post->post_date_gmt = '';
    760         $post->post_password = '';
    761         $post->post_type = $post_type;
    762         $post->post_status = 'draft';
    763         $post->to_ping = '';
    764         $post->pinged = '';
    765         $post->comment_status = get_option( 'default_comment_status' );
    766         $post->ping_status = get_option( 'default_ping_status' );
    767         $post->post_pingback = get_option( 'default_pingback_flag' );
    768         $post->post_category = get_option( 'default_category' );
    769         $post->page_template = 'default';
    770         $post->post_parent = 0;
    771         $post->menu_order = 0;
    772     }
    773 
    774     $post->post_content = apply_filters( 'default_content', $post_content, $post );
    775     $post->post_title   = apply_filters( 'default_title',   $post_title, $post   );
    776     $post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt, $post );
    777     $post->post_name = '';
    778 
    779     return $post;
    780     }
    781 
    782     function enqueue_comment_hotkeys_js() {
    783         if ( 'true' == get_user_option( 'comment_shortcuts' ) )
    784             wp_enqueue_script( 'jquery-table-hotkeys' );
    785     }
    786    
    787     /**
    788      * Get an existing post and format it for editing.
    789      *
    790      * @since 2.0.0
    791      *
    792      * @param unknown_type $id
    793      * @return unknown
    794      */
    795     function post_to_edit( $id ) {
    796     $post = get_post( $id, OBJECT, 'edit' );
    797    
    798     if ( $post->post_type == 'page' )
    799         $post->page_template = get_post_meta( $id, '_wp_page_template', true );
    800     return $post;
    801     }
    802    
    803     /**
    804      * Check to see if the post is currently being edited by another user.
    805      *
    806      * @since 2.5.0
    807      *
    808      * @param int $post_id ID of the post to check for editing
    809      * @return bool|int False: not locked or locked by current user. Int: user ID of user with lock.
    810      */
    811     function check_post_lock( $post_id ) {
    812     if ( !$post = get_post( $post_id ) )
    813         return false;
    814    
    815     if ( !$lock = get_post_meta( $post->ID, '_edit_lock', true ) )
    816         return false;
    817    
    818     $lock = explode( ':', $lock );
    819     $time = $lock[0];
    820     $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true );
    821    
    822     $time_window = apply_filters( 'wp_check_post_lock_window', AUTOSAVE_INTERVAL * 2 );
    823    
    824     if ( $time && $time > time() - $time_window && $user != get_current_user_id() )
    825            return $user;
    826        return false;
    827     }
    828    
    829     /**
    830      * Mark the post as currently being edited by the current user
    831      *
    832      * @since 2.5.0
    833      *
    834      * @param int $post_id ID of the post to being edited
    835      * @return bool Returns false if the post doesn't exist of there is no current user
    836      */
    837     function set_post_lock( $post_id ) {
    838     if ( !$post = get_post( $post_id ) )
    839         return false;
    840     if ( 0 == ($user_id = get_current_user_id()) )
    841         return false;
    842    
    843     $now = time();
    844     $lock = "$now:$user_id";
    845    
    846     update_post_meta( $post->ID, '_edit_lock', $lock );
    847     }
    848    
    849     function get_edit_form() {
    850     global $post;
    851    
    852     $xcontent  = '<h3>'.__('Edit', $this->translation_domain).'</h3>';
    853     $xcontent .= '<form action="'.get_permalink().'" method="post">';
    854     if (isset($_REQUEST['eaction']) && $_REQUEST['eaction'] == 'create') {
    855         $edit_post = $this->get_default_post_to_edit($post->post_type, true, $post->ID);
    856         $xcontent .= '<input type="hidden" name="parent_id" id="parent_id" value="'.$post->ID.'" />';
    857         $xcontent .= '<input type="hidden" name="original_publish" id="original_publish" value="Publish" />';
    858         $xcontent .= '<input type="hidden" name="publish" id="publish" value="Publish" />';
    859     } else {
    860         $edit_post = $post;
    861         $xcontent .= '<input type="hidden" name="parent_id" id="parent_id" value="'.$edit_post->post_parent.'" />';
    862         $xcontent .= '<input type="hidden" name="original_publish" id="original_publish" value="Update" />';
    863     }
    864     $xcontent .= '<input type="hidden" name="post_type" id="post_type" value="'.$edit_post->post_type.'" />';
    865     $xcontent .= '<input type="hidden" name="post_ID" id="wiki_id" value="'.$edit_post->ID.'" />';
    866     $xcontent .= '<input type="hidden" name="post_status" id="wiki_id" value="published" />';
    867     $xcontent .= '<input type="hidden" name="comment_status" id="comment_status" value="open" />';
    868     $xcontent .= '<input type="hidden" name="action" id="wiki_action" value="editpost" />';
    869     $xcontent .= '<div><input type="text" name="post_title" id="wiki_title" value="'.$edit_post->post_title.'" class="incsub_wiki_title" size="30" /></div>';
    870     $xcontent .= '<div><textarea tabindex="2" name="content" id="wiki_content" class="incusb_wiki_tinymce" cols="40" rows="10" >'.$edit_post->post_content.'</textarea></div>';
    871     $xcontent .= '<input type="hidden" name="_wpnonce" id="_wpnonce" value="'.wp_create_nonce("wiki-editpost_{$edit_post->ID}").'" />';
    872    
    873     if (is_user_logged_in()) {
    874         $xcontent .= $this->get_meta_form();
    875     }
    876     $xcontent .= '<div class="incsub_wiki_clear">';
    877     $xcontent .= '<input type="submit" name="save" id="btn_save" value="'.__('Save', $this->translation_domain).'" />&nbsp;';
    878     $xcontent .= '<a href="'.get_permalink().'?action=edit">'.__('Cancel', $this->translation_domain).'</a>';
    879     $xcontent .= '</div>';
    880     $xcontent .= '</form>';
    881    
    882     $wiki_admin = new WikiAdmin();
    883    
    884     $wiki_admin->tiny_mce(true, array("editor_selector" => "incusb_wiki_tinymce"));
    885    
    886     return $xcontent;
    887     }
    888    
    889     function get_meta_form() {
    890     global $post;
    891    
    892     $content  = '';
    893    
    894     $content .= '<div class="incsub_wiki_meta_box">'.$this->notifications_meta_box(false).'</div>';
    895    
    896     return $content;
    897     }
    898    
    899     function tabs() {
    900     global $post, $incsub_tab_check;
    901    
    902     $incsub_tab_check = 1;
    903    
    904     $classes['page'] = array('incsub_wiki_link_page');
    905     $classes['discussion'] = array('incsub_wiki_link_discussion');
    906     $classes['history'] = array('incsub_wiki_link_history');
    907     $classes['edit'] = array('incsub_wiki_link_edit');
    908     $classes['advanced_edit'] = array('incsub_wiki_link_advanced_edit');
    909     $classes['create'] = array('incsub_wiki_link_create');
    910    
    911     if (!isset($_REQUEST['action'])) {
    912         $classes['page'][] = 'current';
    913     }
    914     if (isset($_REQUEST['action'])) {
    915         switch ($_REQUEST['action']) {
    916         case 'page':
    917             $classes['page'][] = 'current';
    918             break;
    919         case 'discussion':
    920             $classes['discussion'][] = 'current';
    921             break;
    922         case 'restore':
    923         case 'diff':
    924         case 'history':
    925             $classes['history'][] = 'current';
    926             break;
    927         case 'edit':
    928             if (isset($_REQUEST['eaction']) && $_REQUEST['eaction'] == 'create')
    929             $classes['create'][] = 'current';
    930             else
    931             $classes['edit'][] = 'current';
    932             break;
    933         }
    934     }
    935    
    936     $seperator = (preg_match('/\?/i', get_permalink()) > 0)? '&' : '?';
    937    
    938     $tabs  = '<ul class="left">';
    939     $tabs .= '<li class="'.join(' ', $classes['page']).'" ><a href="'.get_permalink().'" >' . __('Page', $this->translation_domain) . '</a></li>';
    940     if (comments_open()) {
    941         $tabs .= '<li class="'.join(' ', $classes['discussion']).'" ><a href="'.get_permalink().$seperator.'action=discussion" >' . __('Discussion', $this->translation_domain) . '</a></li>';
    942     }
    943     $tabs .= '<li class="'.join(' ', $classes['history']).'" ><a href="'.get_permalink().$seperator.'action=history" >' . __('History', $this->translation_domain) . '</a></li>';
    944     $tabs .= '</ul>';
    945    
    946     $post_type_object = get_post_type_object( $post->post_type );
    947    
    948     if (current_user_can($post_type_object->cap->edit_post, $post->ID)) {
    949         $tabs .= '<ul class="right">';
    950         $tabs .= '<li class="'.join(' ', $classes['edit']).'" ><a href="'.get_permalink().$seperator.'action=edit" >' . __('Edit', $this->translation_domain) . '</a></li>';
    951         if (is_user_logged_in()) {
    952         $tabs .= '<li class="'.join(' ', $classes['advanced_edit']).'" ><a href="'.get_edit_post_link().'" >' . __('Advanced', $this->translation_domain) . '</a></li>';
    953         }
    954         $tabs .= '<li class="'.join(' ', $classes['create']).'"><a href="'.get_permalink().$seperator.'action=edit&eaction=create">'.__('Create new', $this->translation_domain).'</a></li>';
    955         $tabs .= '</ul>';
    956     }
    957    
    958     $incsub_tab_check = 0;
    959    
    960     return $tabs;
    961     }
    962    
    963     function get_edit_post_link($url, $id = 0, $context = 'display') {
    964     global $post;
    965     return $url;
    966     }
    967    
    968     /**
    969      * Display list of a post's revisions.
    970      *
    971      * Can output either a UL with edit links or a TABLE with diff interface, and
    972      * restore action links.
    973      *
    974      * Second argument controls parameters:
    975      *   (bool)   parent : include the parent (the "Current Revision") in the list.
    976      *   (string) format : 'list' or 'form-table'.  'list' outputs UL, 'form-table'
    977      *                     outputs TABLE with UI.
    978      *   (int)    right  : what revision is currently being viewed - used in
    979      *                     form-table format.
    980      *   (int)    left   : what revision is currently being diffed against right -
    981      *                     used in form-table format.
    982      *
    983      * @package WordPress
    984      * @subpackage Post_Revisions
    985      * @since 2.6.0
    986      *
    987      * @uses wp_get_post_revisions()
    988      * @uses wp_post_revision_title()
    989      * @uses get_edit_post_link()
    990      * @uses get_the_author_meta()
    991      *
    992      * @todo split into two functions (list, form-table) ?
    993      *
    994      * @param int|object $post_id Post ID or post object.
    995      * @param string|array $args See description {@link wp_parse_args()}.
    996      * @return null
    997      */
    998     function list_post_revisions( $post_id = 0, $args = null ) {
    999     if ( !$post = get_post( $post_id ) )
    1000         return;
    1001    
    1002     $content = '';
    1003     $defaults = array( 'parent' => false, 'right' => false, 'left' => false, 'format' => 'list', 'type' => 'all' );
    1004     extract( wp_parse_args( $args, $defaults ), EXTR_SKIP );
    1005     switch ( $type ) {
    1006         case 'autosave' :
    1007         if ( !$autosave = wp_get_post_autosave( $post->ID ) )
    1008             return;
    1009         $revisions = array( $autosave );
    1010         break;
    1011         case 'revision' : // just revisions - remove autosave later
    1012         case 'all' :
    1013         default :
    1014         if ( !$revisions = wp_get_post_revisions( $post->ID ) )
    1015            return;
    1016         break;
    1017     }
    1018    
    1019     // print_r($revisions);
    1020    
    1021     /* translators: post revision: 1: when, 2: author name */
    1022     $titlef = _x( '%1$s by %2$s', 'post revision' );
    1023    
    1024     if ( $parent )
    1025         array_unshift( $revisions, $post );
    1026        
    1027     $rows = '';
    1028         $class = false;
    1029     $can_edit_post = current_user_can( 'edit_wiki', $post->ID );
    1030         foreach ( $revisions as $revision ) {
    1031         /*if ( !current_user_can( 'read_post', $revision->ID ) )
    1032         continue;*/
    1033         if ( 'revision' === $type && wp_is_post_autosave( $revision ) )
    1034         continue;
    1035        
    1036         $date = wp_post_revision_title( $revision, false );
    1037         $name = get_the_author_meta( 'display_name', $revision->post_author );
    1038        
    1039         if ( 'form-table' == $format ) {
    1040         if ( $left )
    1041             $left_checked = $left == $revision->ID ? ' checked="checked"' : '';
    1042         else
    1043             $left_checked = $right_checked ? ' checked="checked"' : ''; // [sic] (the next one)
    1044        
    1045         $right_checked = $right == $revision->ID ? ' checked="checked"' : '';
    1046        
    1047         $class = $class ? '' : " class='alternate'";
    1048        
    1049         if ( $post->ID != $revision->ID && $can_edit_post && current_user_can( 'read_post', $revision->ID ) )
    1050             $actions = '<a href="' . wp_nonce_url( add_query_arg( array( 'revision' => $revision->ID, 'action' => 'restore' ) ), "restore-post_$post->ID|$revision->ID" ) . '">' . __( 'Restore' ) . '</a>';
    1051         else
    1052             $actions = ' ';
    1053            
    1054         $rows .= "<tr$class>\n";
    1055             $rows .= "\t<td style='white-space: nowrap' scope='row'><input type='radio' name='left' value='{$revision->ID}' {$left_checked} /></td>\n";
    1056             $rows .= "\t<td style='white-space: nowrap' scope='row'><input type='radio' name='right' value='{$revision->ID}' {$right_checked} /></td>\n";
    1057         $rows .= "\t<td>$date</td>\n";
    1058         $rows .= "\t<td>$name</td>\n";
    1059             $rows .= "\t<td class='action-links'>$actions</td>\n";
    1060         $rows .= "</tr>\n";
    1061         } else {
    1062         $title = sprintf( $titlef, $date, $name );
    1063         $rows .= "\t<li>$title</li>\n";
    1064         }
    1065         }
    1066     if ( 'form-table' == $format ) :
    1067         $content .= '<form action="'.get_permalink().'" method="get">';
    1068         $content .= '<div class="tablenav">';
    1069         $content .= '<div class="alignleft">';
    1070         $content .= '<input type="submit" class="button-secondary" value="'.esc_attr( 'Compare Revisions' ).'" />';
    1071         $content .= '<input type="hidden" name="action" value="diff" />';
    1072         $content .= '<input type="hidden" name="post_type" value="'.esc_attr($post->post_type).'" />';
    1073         $content .= '</div>';
    1074         $content .= '</div>';
    1075         $content .= '<br class="clear" />';
    1076         $content .= '<table class="widefat post-revisions" cellspacing="0" id="post-revisions">';
    1077         $content .= '<col /><col /><col style="width: 33%" /><col style="width: 33%" /><col style="width: 33%" />';
    1078         $content .= '<thead>';
    1079         $content .= '<tr>';
    1080         $content .= '<th scope="col">'._x( 'Old', 'revisions column name', $this->translation_domain ).'</th>';
    1081         $content .= '<th scope="col">'._x( 'New', 'revisions column name', $this->translation_domain ).'</th>';
    1082         $content .= '<th scope="col">'._x( 'Date Created', 'revisions column name', $this->translation_domain ).'</th>';
    1083         $content .= '<th scope="col">'.__( 'Author', $this->translation_domain, $this->translation_domain ).'</th>';
    1084         $content .= '<th scope="col" class="action-links">'.__( 'Actions', $this->translation_domain ).'</th>';
    1085         $content .= '</tr>';
    1086         $content .= '</thead>';
    1087         $content .= '<tbody>';
    1088         $content .= $rows;
    1089         $content .= '</tbody>';
    1090         $content .= '</table>';
    1091         $content .= '</form>';
    1092        else :
    1093         $content .= "<ul class='post-revisions'>\n";
    1094         $content .= $rows;
    1095         $content .= "</ul>";
    1096     endif;
    1097     return $content;
    1098     }
    1099    
    1100     function user_has_cap($allcaps, $caps = null, $args = null) {
    1101     global $current_user, $blog_id, $post;
    1102    
    1103     $capable = false;
    1104    
    1105     if (preg_match('/(_wiki|_wikis)/i', join($caps, ',')) > 0) {
    1106         if (in_array('administrator', $current_user->roles)) {
    1107         foreach ($caps as $cap) {
    1108             $allcaps[$cap] = 1;
    1109         }
    1110         return $allcaps;
    1111         }
    1112         foreach ($caps as $cap) {
    1113         $capable = false;
    1114         switch ($cap) {
    1115             case 'read_wiki':
    1116             $capable = true;
    1117             break;
    1118             case 'edit_others_wikis':
    1119             case 'edit_published_wikis':
    1120             case 'edit_wikis':
    1121             case 'edit_wiki':
    1122             if (current_user_can('edit_posts')) {
    1123                 $capable = true;
    1124             }
    1125             break;
    1126             default:
    1127             if (isset($args[1]) && isset($args[2])) {
    1128                 if (current_user_can(preg_replace('/_wiki/i', '_post', $cap), $args[1], $args[2])) {
    1129                 $capable = true;
    1130                 }
    1131             } else if (isset($args[1])) {
    1132                 if (current_user_can(preg_replace('/_wiki/i', '_post', $cap), $args[1])) {
    1133                 $capable = true;
    1134                 }
    1135             } else if (current_user_can(preg_replace('/_wiki/i', '_post', $cap))) {
    1136                 $capable = true;
    1137             }
    1138             break;
    1139         }
    1140        
    1141         if ($capable) {
    1142             $allcaps[$cap] = 1;
    1143         }
    1144         }
    1145     }
    1146     return $allcaps;
    1147     }
    1148    
    1149     function role_has_cap($capabilities, $cap, $name) {
    1150     // nothing to do
    1151     }
    1152    
    1153     /**
    1154      * Activation hook
    1155      *
    1156      * Create tables if they don't exist and add plugin options
    1157      *
    1158      * @see     http://codex.wordpress.org/Function_Reference/register_activation_hook
    1159      *
    1160      * @global  object  $wpdb
    1161      */
    1162     function install() {
    1163         global $wpdb;
    1164        
    1165         /**
    1166          * WordPress database upgrade/creation functions
    1167          */
    1168         require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    1169        
    1170         // Get the correct character collate
    1171         if ( ! empty($wpdb->charset) )
    1172             $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
    1173     if ( ! empty($wpdb->collate) )
    1174         $charset_collate .= " COLLATE $wpdb->collate";
    1175    
    1176     // Setup the subscription table
    1177     $sql_main =
    1178     "CREATE TABLE `" . $this->db_prefix . "wiki_subscriptions` (
    1179         `ID` bigint(20) unsigned NOT NULL auto_increment,
    1180         `blog_id` bigint(20) NOT NULL,
    1181         `wiki_id` bigint(20) NOT NULL,
    1182         `user_id` bigint(20),
    1183         `email` VARCHAR(255),
    1184         PRIMARY KEY  (`ID`)
    1185     ) ENGINE=MyISAM;";
    1186    
    1187     dbDelta($sql_main);
    1188    
    1189     // Default chat options
    1190     $this->_options['default'] = get_option('wiki_default', array('slug' => 'wiki'));
    1191 
    1192     if (!is_array($this->_options['default'])) {
    1193          $this->_options['default'] = array('slug' => 'wiki');
    1194     }
    1195 
    1196     update_option('wiki_default', $this->_options['default']);
    1197     }
    1198    
    1199     /**
    1200      * Add the admin menus
    1201      *
    1202      * @see     http://codex.wordpress.org/Adding_Administration_Menus
    1203      */
    1204     function admin_menu() {
    1205     $page = add_submenu_page('edit.php?post_type=incsub_wiki', __('Wiki Settings', $this->translation_domain), __('Wiki Settings', $this->translation_domain), 'manage_options', 'incsub_wiki', array(&$this, 'options_page'));
    1206     add_action( 'admin_print_scripts-' . $page, array(&$this, 'admin_script_settings') );
    1207     add_action( 'admin_print_styles-' . $page, array(&$this, 'admin_css_settings') );
    1208     }
    1209    
    1210     function admin_script_settings() {
    1211     // Nothing to do
    1212     }
    1213    
    1214     function admin_css_settings() {
    1215     // Nothing to do
    1216     }
    1217    
    1218     function options_page() {
    1219     if(!current_user_can('manage_options')) {
    1220         echo "<p>" . __('Nice Try...', $this->translation_domain) . "</p>";  //If accessed properly, this message doesn't appear.
    1221         return;
    1222     }
    1223     if (wp_verify_nonce($_POST['_wpnonce'], 'incsub_wiki-update-options')) {
    1224         $this->_options['default']['slug'] = $_POST['wiki_default']['slug'];
    1225         update_option('wiki_default', $this->_options['default']);
    1226         wp_redirect('edit.php?post_type=incsub_wiki&page=incsub_wiki&incsub_wiki_settings_saved=1');
    1227     }
    1228     if ($_GET['incsub_wiki_settings_saved'] == 1) {
    1229           echo '<div class="updated fade"><p>'.__('Settings saved.', $this->translation_domain).'</p></div>';
    1230         }
    1231     ?>
    1232     <div class="wrap">
    1233         <h2><?php _e('Wiki Settings', $this->translation_domain); ?></h2>
    1234         <form method="post" action="edit.php?post_type=incsub_wiki&amp;page=incsub_wiki">
    1235             <?php wp_nonce_field('incsub_wiki-update-options'); ?>
    1236             <table>
    1237                 <tr valign="top">
    1238                     <td><label for="incsub_wiki-slug"><?php _e('Wiki Slug', $this->translation_domain); ?></label> </td>
    1239                     <td> /<input type="text" size="20" id="incsub_wiki-slug" name="wiki_default[slug]" value="<?php print $this->_options['default']['slug']; ?>" /></td>
    1240                 </tr>
    1241             </table>
    1242            
    1243             <p class="submit">
    1244             <input type="submit" name="submit_settings" value="<?php _e('Save Changes', $this->translation_domain) ?>" />
    1245             </p>
    1246         </form>
    1247 
    1248 <div style="-moz-border-radius: 5px;-khtml-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;border: 1px solid #F6C600;background-color: #FFFFC4;padding: 5px 20px;margin: 5px 0px 10px;font-size: 110%;">
    1249     <h3><a href="https://premium.wpmudev.org/subscribe/">Join WPMU DEV now to download over 300 plugins, themes and videos - and get and the best WordPress support on the web!</a></h3>
    1250     <div class="vzaar_media_player" style="float:left;margin-left:50px;">
    1251         <object id="video" type="application/x-shockwave-flash" data="http://view.vzaar.com/572452.flashplayer" height="284" width="486"><param name="movie" value="http://view.vzaar.com/572452.flashplayer"><param name="allowScriptAccess" value="always"><param name="allowFullScreen" value="true"><param name="wmode" value="transparent"><param name="flashvars" value="border=none"><embed src="http://view.vzaar.com/572452.flashplayer" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" flashvars="border=none" height="284" width="486"><video src="http://view.vzaar.com/572452.mobile" poster="http://view.vzaar.com/572452.image" controls="controls" onclick="this.play();" height="720" width="1280"></video></object>
    1252     </div>
    1253 
    1254     <div style="float:left;margin-left:50px;">
    1255     <h3>As a member of WPMU DEV you get:</h3>
    1256     <ul>
    1257         <li><strong>Unlimited</strong> use of our 300+ plugins & themes, forever!</li>
    1258         <li>Over 35 white label video manuals for you, your users and clients</li>
    1259         <li>Upgrades and support <strong>guaranteed</strong></li>
    1260         <li>Helpful<strong> live chat</strong> and <strong>support forums</strong></li>
    1261         <li>Access to all new plugins & themes</li>
    1262         <li>New feature development requests</li>
    1263         <li>Full access to WPMU Jobs</li>
    1264         <li>Comprehensive manuals & eBooks</li>
    1265         <li>It's like having your own personal developer!</li>
    1266     </ul>
    1267     </div>
    1268     <div style="margin-left:50px;clear:both;"><a href="https://premium.wpmudev.org/join/"><img title="Click Here To Find Out More..." src="http://premium.wpmudev.org/wp-content/themes/wp-wpmudev/images/promo.png" alt="Click here to find out more" height="179" width="848"></a></div>
    1269 </div>
    1270 
    1271     </div>
    1272     <?php
    1273     }
    1274    
    1275     /**
    1276      * Deactivation hook
    1277      *
    1278      * @see     http://codex.wordpress.org/Function_Reference/register_deactivation_hook
    1279      *
    1280      * @global  object  $wpdb
    1281      */
    1282     function uninstall() {
    1283         global $wpdb;
    1284     // Nothing to do
    1285     }
    1286    
    1287     /**
    1288      * Initialize the plugin
    1289      *
    1290      * @see     http://codex.wordpress.org/Plugin_API/Action_Reference
    1291      * @see     http://adambrown.info/p/wp_hooks/hook/init
    1292      */
    1293     function init() {
    1294     global $wpdb, $wp_rewrite, $current_user, $blog_id;
    1295    
    1296     if (preg_match('/mu\-plugin/', PLUGINDIR) > 0) {
    1297         load_muplugin_textdomain($this->translation_domain, dirname(plugin_basename(__FILE__)).'/languages');
    1298     } else {
    1299         load_plugin_textdomain($this->translation_domain, false, dirname(plugin_basename(__FILE__)).'/languages');
    1300     }
    1301    
    1302     wp_register_script('incsub_wiki_js', plugins_url('wordpress-wiki-plugin/js/wiki-utils.js'), null, $this->current_version);
    1303    
    1304     $labels = array(
    1305         'name' => __('Wikis', $this->translation_domain),
    1306         'singular_name' => __('Wiki', $this->translation_domain),
    1307         'add_new' => __('Add WIki', $this->translation_domain),
    1308         'add_new_item' => __('Add New Wiki', $this->translation_domain),
    1309         'edit_item' => __('Edit Wiki', $this->translation_domain),
    1310         'new_item' => __('New Wiki', $this->translation_domain),
    1311         'view_item' => __('View Wiki', $this->translation_domain),
    1312         'search_items' => __('Search Wiki', $this->translation_domain),
    1313         'not_found' =>  __('No Wiki found', $this->translation_domain),
    1314         'not_found_in_trash' => __('No wikis found in Trash', $this->translation_domain),
    1315         'menu_name' => __('Wikis', $this->translation_domain)
    1316     );
    1317    
    1318     $supports = array( 'title', 'editor', 'author', 'revisions', 'comments', 'page-attributes');
    1319    
    1320     register_post_type( 'incsub_wiki',
    1321         array(
    1322         'labels' => $labels,
    1323         'public' => true,
    1324         'show_ui' => true,
    1325         'publicly_queryable' => true,
    1326         'capability_type' => 'wiki',
    1327         'hierarchical' => true,
    1328         'map_meta_cap' => true,
    1329         'query_var' => true,
    1330         'supports' => $supports,
    1331         'rewrite' => false
    1332         )
    1333     );
    1334    
    1335     $wiki_structure = '/'.$this->_options['default']['slug'].'/%wiki%';
    1336    
    1337     $wp_rewrite->add_rewrite_tag("%wiki%", '(.+?)', "incsub_wiki=");
    1338     $wp_rewrite->add_permastruct('incsub_wiki', $wiki_structure, false);
    1339    
    1340     if (isset($_REQUEST['subscribe']) && wp_verify_nonce($_REQUEST['_wpnonce'], "wiki-subscribe-wiki_{$_REQUEST['post_id']}")) {
    1341         if (isset($_REQUEST['email'])) {
    1342         if ($wpdb->insert("{$this->db_prefix}wiki_subscriptions",
    1343             array('blog_id' => $blog_id,
    1344             'wiki_id' => $_REQUEST['post_id'],
    1345             'email' => $_REQUEST['email']))) {
    1346             setcookie('incsub_wiki_email', $_REQUEST['email'], time()+3600*24*365, '/');
    1347             wp_redirect(get_permalink($_REQUEST['post_id']));
    1348             exit();
    1349         }
    1350         } else if (is_user_logged_in()){
    1351         if ($wpdb->insert("{$this->db_prefix}wiki_subscriptions",
    1352             array('blog_id' => $blog_id,
    1353             'wiki_id' => $_REQUEST['post_id'],
    1354             'user_id' => $current_user->ID))) {
    1355             wp_redirect(get_permalink($_REQUEST['post_id']));
    1356             exit();   
    1357         }
    1358         }
    1359     }
    1360    
    1361     if (isset($_GET['action']) && $_GET['action'] == 'cancel-wiki-subscription') {
    1362         if ($wpdb->query("DELETE FROM {$this->db_prefix}wiki_subscriptions WHERE ID = ".intval($_GET['sid']).";")) {
    1363         wp_redirect(get_option('siteurl'));
    1364         exit(); 
    1365         }
    1366     }
    1367     }
    1368    
    1369     /**
    1370      * Output CSS
    1371      */
    1372     function output_css() {
    1373         echo '<link rel="stylesheet" href="' . plugins_url('wordpress-wiki-plugin/css/style.css') . '" type="text/css" />';
    1374     }
    1375    
    1376     function output_js() {
    1377     wp_enqueue_script('utils');
    1378     }
    1379    
    1380     function is_subscribed() {
    1381     global $wpdb, $current_user, $post;
    1382    
    1383     if (is_user_logged_in()) {
    1384         if ($wpdb->get_var("SELECT ID FROM {$this->db_prefix}wiki_subscriptions WHERE wiki_id = {$post->ID} AND user_id = {$current_user->ID}") > 0) {
    1385         return true;
    1386         }
    1387     } else if ($wpdb->get_var("SELECT ID FROM {$this->db_prefix}wiki_subscriptions WHERE wiki_id = {$post->ID} AND email = '{$_COOKIE['incsub_wiki_email']}'") > 0) {
    1388         return true;
    1389     }
    1390    
    1391     return false;
    1392     }
    1393    
    1394     function meta_boxes() {
    1395     global $post, $current_user;
    1396    
    1397     if ($post->post_author == $current_user->ID || current_user_can('edit_posts')) {
    1398         add_meta_box('incsub-wiki-notifications', __('Wiki E-mail Notifications', $this->translation_domain), array(&$this, 'notifications_meta_box'), 'incsub_wiki', 'side');
    1399     }
    1400     }
    1401    
    1402     function post_type_link($permalink, $post_id, $leavename) {
    1403     $post = get_post($post_id);
    1404    
    1405     $rewritecode = array(
    1406         '%wiki%',
    1407     );
    1408    
    1409     if ($post->post_type == 'incsub_wiki' && '' != $permalink) {
    1410        
    1411         $ptype = get_post_type_object($post->post_type);
    1412        
    1413         if ($ptype->hierarchical) {
    1414         $uri = get_page_uri($post);
    1415         $uri = untrailingslashit($uri);
    1416         $uri = strrev( stristr( strrev( $uri ), '/' ) );
    1417         $uri = untrailingslashit($uri);
    1418        
    1419         if (!empty($uri)) {
    1420             $uri .= '/';
    1421             $permalink = str_replace('%wiki%', "{$uri}%wiki%", $permalink);
    1422         }
    1423         }
    1424        
    1425         $rewritereplace = array(
    1426             ($post->post_name == "")?$post->id:$post->post_name
    1427         );
    1428         $permalink = str_replace($rewritecode, $rewritereplace, $permalink);
    1429     } else {
    1430         // if they're not using the fancy permalink option
    1431     }
    1432    
    1433     return $permalink;
    1434     }
    1435    
    1436     function name_save($post_name) {
    1437     if ($_POST['post_type'] == 'incsub_wiki' && empty($post_name)) {
    1438         $post_name = $_POST['post_title'];
    1439     }
    1440    
    1441     return $post_name;
    1442     }
    1443    
    1444     function notifications_meta_box($echo = true) {
    1445     global $post;
    1446     $settings = get_option('incsub_wiki_settings');
    1447     $meta = get_post_custom($post->ID);
    1448     if ($meta == array()) {
    1449         $meta = array('incsub_wiki_email_notification' => array('enabled'));
    1450     }
    1451     $content  = '';
    1452     $content .= '<input type="hidden" name="incsub_wiki_notifications_meta" value="1" />';
    1453     $content .= '<div class="alignleft">';
    1454     $content .= '<label><input type="checkbox" name="incsub_wiki_email_notification" value="enabled" '.(($meta["incsub_wiki_email_notification"][0] == "")?'':'checked="checked"').' /> '.__('Enable e-mail notifications', $this->translation_domain).'</label>';
    1455     $content .= '</div>';
    1456     $content .= '<div class="clear"></div>';
    1457    
    1458     if ($echo) {
    1459         echo $content;
    1460     }
    1461     return $content;
    1462     }
    1463    
    1464     function save_wiki_meta($post_id, $post = null) {
    1465     //skip quick edit
    1466     if ( defined('DOING_AJAX') )
    1467         return;
    1468    
    1469     if ( $post->post_type == "incsub_wiki" && isset( $_POST['incsub_wiki_notifications_meta'] ) ) {
    1470         $meta = get_post_custom($post_id);
    1471        
    1472         update_post_meta($post_id, 'incsub_wiki_email_notification', $_POST['incsub_wiki_email_notification']);
    1473        
    1474         //for any other plugin to hook into
    1475         do_action( 'incsub_wiki_save_notifications_meta', $post_id, $meta );
    1476     }
    1477     }
    1478    
    1479     function widgets_init() {
    1480     register_widget('WikiWidget');
    1481     }
    1482    
    1483     function send_notifications($post_id) {
    1484     global $wpdb;
    1485     // We do autosaves manually with wp_create_post_autosave()
    1486         if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
    1487             return;
    1488    
    1489         if ( !$post = get_post( $post_id, ARRAY_A ) )
    1490             return;
    1491    
    1492         if ( $post['post_type'] != 'incsub_wiki' || !post_type_supports($post['post_type'], 'revisions') )
    1493             return;
    1494    
    1495         // all revisions and (possibly) one autosave
    1496         $revisions = wp_get_post_revisions($post_id, array( 'order' => 'ASC' ));
    1497    
    1498         $revision = array_pop($revisions);
    1499    
    1500     $post = get_post($post_id);
    1501    
    1502     $cancel_url = get_option('siteurl') . '?action=cancel-wiki-subscription&sid=';
    1503     $admin_email = get_option('admin_email');
    1504     $post_title = $post->post_title;
    1505     $post_content = $post->post_content;
    1506     $post_url = get_permalink($post_id);
    1507    
    1508     $revisions = wp_get_post_revisions($post->ID);
    1509     $revision = array_shift($revisions);
    1510    
    1511     $revert_url = wp_nonce_url(add_query_arg(array('revision' => $revision->ID), admin_url('revision.php')), "restore-post_$post->ID|$revision->ID" );
    1512    
    1513     //cleanup title
    1514     $blog_name = get_option('blogname');
    1515     $post_title = strip_tags($post_title);
    1516     //cleanup content
    1517     $post_content = strip_tags($post_content);
    1518     //get excerpt
    1519     $post_excerpt = $post_content;
    1520     if (strlen($post_excerpt) > 255) {
    1521         $post_excerpt = substr($post_excerpt,0,252) . '...';
    1522     }
    1523    
    1524     $wiki_notification_content = array();
    1525     $wiki_notification_content['user'] = "Dear Subscriber,
    1526 
    1527 POST_TITLE was changed
    1528 
    1529 You can read the Wiki page in full here: POST_URL
    1530 
    1531 EXCERPT
    1532 
    1533 Thanks,
    1534 BLOGNAME
    1535 
    1536 Cancel subscription: CANCEL_URL";
    1537 
    1538     $wiki_notification_content['author'] = "Dear Author,
    1539 
    1540 POST_TITLE was changed
    1541 
    1542 You can read the Wiki page in full here: POST_URL
    1543 You can revert the changes: REVERT_URL
    1544 
    1545 EXCERPT
    1546 
    1547 Thanks,
    1548 BLOGNAME
    1549 
    1550 Cancel subscription: CANCEL_URL";
    1551 
    1552     //format notification text
    1553     foreach ($wiki_notification_content as $key => $content) {
    1554         $wiki_notification_content[$key] = str_replace("BLOGNAME",$blog_name,$wiki_notification_content[$key]);
    1555         $wiki_notification_content[$key] = str_replace("POST_TITLE",$post_title,$wiki_notification_content[$key]);
    1556         $wiki_notification_content[$key] = str_replace("EXCERPT",$post_excerpt,$wiki_notification_content[$key]);
    1557         $wiki_notification_content[$key] = str_replace("POST_URL",$post_url,$wiki_notification_content[$key]);
    1558         $wiki_notification_content[$key] = str_replace("REVERT_URL",$revert_url,$wiki_notification_content[$key]);
    1559         $wiki_notification_content[$key] = str_replace("\'","'",$wiki_notification_content[$key]);
    1560     }
    1561    
    1562     $query = "SELECT * FROM " . $this->db_prefix . "wiki_subscriptions WHERE wiki_id = {$post->ID}";
    1563     $subscription_emails = $wpdb->get_results( $query, ARRAY_A );
    1564    
    1565     if (count($subscription_emails) > 0){
    1566         foreach ($subscription_emails as $subscription_email){
    1567         $loop_notification_content = $wiki_notification_content['user'];
    1568        
    1569         $loop_notification_content = $wiki_notification_content['user'];
    1570        
    1571         if ($subscription_email['user_id'] > 0) {
    1572             if ($subscription_email['user_id'] == $post->post_author) {
    1573             $loop_notification_content = $wiki_notification_content['author'];
    1574             }
    1575             $user = get_userdata($subscription_email['user_id']);
    1576             $subscription_to = $user->user_email;
    1577         } else {
    1578             $subscription_to = $subscription_email['email'];
    1579         }
    1580        
    1581         $loop_notification_content = str_replace("CANCEL_URL",$cancel_url . $subscription_email['ID'],$loop_notification_content);
    1582         $subject_content = $blog_name . ': ' . __('Wiki Page Changes', $this->translation_domain);
    1583         $from_email = $admin_email;
    1584         $message_headers = "MIME-Version: 1.0\n" . "From: " . $blog_name .  " <{$from_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    1585         wp_mail($subscription_to, $subject_content, $loop_notification_content, $message_headers);
    1586         }
    1587     }
    1588     }
    1589 }
    1590 
    1591 class WikiWidget extends WP_Widget {
    1592    
    1593     /**
    1594      * @var     string  $translation_domain Translation domain
    1595      */
    1596     var $translation_domain = 'wiki';
    1597    
    1598     function WikiWidget() {
    1599     $widget_ops = array( 'description' => __('Display Wiki Pages', $this->translation_domain) );
    1600         $control_ops = array( 'title' => __('Wiki', $this->translation_domain), 'hierarchical' => 'yes' );
    1601         $this->WP_Widget( 'incsub_wiki', __('Wiki', $this->translation_domain), $widget_ops, $control_ops );
    1602     }
    1603    
    1604     function widget($args, $instance) {
    1605     global $wpdb, $current_site, $post, $wiki_tree;
    1606    
    1607     extract($args);
    1608    
    1609     $options = $instance;
    1610    
    1611     $title = apply_filters('widget_title', empty($instance['title']) ? __('Wiki', $this->translation_domain) : $instance['title'], $instance, $this->id_base);
    1612    
    1613     ?>
    1614     <?php echo $before_widget; ?>
    1615     <?php echo $before_title . $title . $after_title; ?>
    1616     <?php
    1617         $wiki_posts = get_posts('post_parent=0&post_type=incsub_wiki&order_by=menu_order');
    1618     ?>
    1619         <ul>
    1620         <?php
    1621         foreach ($wiki_posts as $wiki) {
    1622         ?>
    1623             <li><a href="<?php print get_permalink($wiki->ID); ?>" class="<?php print ($wiki->ID == $post->ID)?'current':''; ?>" ><?php print $wiki->post_title; ?></a>
    1624             <?php print $this->_print_sub_wikis($wiki); ?>
    1625             </li>
    1626         <?php
    1627         }
    1628         ?>
    1629         </ul>
    1630         <br />
    1631         <?php echo $after_widget; ?>
    1632     <?php
    1633     }
    1634    
    1635     function _print_sub_wikis($wiki) {
    1636     global $post;
    1637    
    1638     $sub_wikis = get_posts('post_parent='.$wiki->ID.'&post_type=incsub_wiki&order_by=menu_order');
    1639     ?>
    1640     <ul>
    1641         <?php
    1642         foreach ($sub_wikis as $sub_wiki) {
    1643         ?>
    1644             <li><a href="<?php print get_permalink($sub_wiki->ID); ?>" class="<?php print ($sub_wiki->ID == $post->ID)?'current':''; ?>" ><?php print $sub_wiki->post_title; ?></a>
    1645             <?php print $this->_print_sub_wikis($sub_wiki); ?>
    1646             </li>
    1647         <?php
    1648         }
    1649         ?>
    1650     </ul>
    1651     <?php
    1652     }
    1653    
    1654     function update($new_instance, $old_instance) {
    1655     $instance = $old_instance;
    1656         $new_instance = wp_parse_args( (array) $new_instance, array( 'title' => __('Wiki', $this->translation_domain), 'hierarchical' => 'yes') );
    1657         $instance['title'] = strip_tags($new_instance['title']);
    1658     $instance['hierarchical'] = $new_instance['hierarchical'];
    1659    
    1660         return $instance;
    1661     }
    1662    
    1663     function form($instance) {
    1664     $instance = wp_parse_args( (array) $instance, array( 'title' => __('Wiki', $this->translation_domain), 'hierarchical' => 'yes'));
    1665         $options = array('title' => strip_tags($instance['title']), 'hierarchical' => $instance['hierarchical']);
    1666    
    1667     ?>
    1668     <div style="text-align:left">
    1669             <label for="<?php echo $this->get_field_id('title'); ?>" style="line-height:35px;display:block;"><?php _e('Title', $this->translation_domain); ?>:<br />
    1670         <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" value="<?php echo $options['title']; ?>" type="text" style="width:95%;" />
    1671             </label>
    1672         <label for="<?php echo $this->get_field_id('hierarchical'); ?>" style="line-height:35px;display:block;"><?php _e('Only top level', $this->translation_domain); ?>:<br />
    1673                 <select id="<?php echo $this->get_field_id('hierarchical'); ?>" name="<?php echo $this->get_field_name('hierarchical'); ?>" >
    1674             <option value="no" <?php if ($options['hierarchical'] == 'no'){ echo 'selected="selected"'; } ?> ><?php _e('Yes', $this->translation_domain); ?></option>
    1675             <option value="yes" <?php if ($options['hierarchical'] == 'yes'){ echo 'selected="selected"'; } ?> ><?php _e('No', $this->translation_domain); ?></option>
    1676                 </select>
    1677             </label>
    1678         <input type="hidden" name="wiki-submit" id="wiki-submit" value="1" />
    1679     </div>
    1680     <?php
    1681     }
    1682 }
    1683 
    1684 class WikiAdmin {
    1685     /**
    1686      * Adds the TinyMCE editor used on the Write and Edit screens.
    1687      *
    1688      * @package WordPress
    1689      * @since 2.7.0
    1690      *
    1691      * TinyMCE is loaded separately from other Javascript by using wp-tinymce.php. It outputs concatenated
    1692      * and optionaly pre-compressed version of the core and all default plugins. Additional plugins are loaded
    1693      * directly by TinyMCE using non-blocking method. Custom plugins can be refreshed by adding a query string
    1694      * to the URL when queueing them with the mce_external_plugins filter.
    1695      *
    1696      * @param bool $teeny optional Output a trimmed down version used in Press This.
    1697      * @param mixed $settings optional An array that can add to or overwrite the default TinyMCE settings.
    1698      */
    1699     function tiny_mce( $teeny = false, $settings = false ) {
    1700     global $concatenate_scripts, $compress_scripts, $tinymce_version, $editor_styles;
    1701    
    1702     if ( ! user_can_richedit() )
    1703         return;
    1704    
    1705     $baseurl = includes_url('js/tinymce');
    1706    
    1707     $mce_locale = ( '' == get_locale() ) ? 'en' : strtolower( substr(get_locale(), 0, 2) ); // only ISO 639-1
    1708    
    1709     /*
    1710     The following filter allows localization scripts to change the languages displayed in the spellchecker's drop-down menu.
    1711     By default it uses Google's spellchecker API, but can be configured to use PSpell/ASpell if installed on the server.
    1712     The + sign marks the default language. More information:
    1713     http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker
    1714     */
    1715     $mce_spellchecker_languages = apply_filters('mce_spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv');
    1716    
    1717     if ( $teeny ) {
    1718         $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'fullscreen', 'wordpress', 'wplink', 'wpdialogs') );
    1719         $ext_plugins = '';
    1720     } else {
    1721         $plugins = array( 'inlinepopups', 'spellchecker', 'paste', 'wordpress', 'fullscreen', 'wpeditimage', 'wpgallery', 'tabfocus', 'wplink', 'wpdialogs' );
    1722        
    1723         /*
    1724         The following filter takes an associative array of external plugins for TinyMCE in the form 'plugin_name' => 'url'.
    1725         It adds the plugin's name to TinyMCE's plugins init and the call to PluginManager to load the plugin.
    1726         The url should be absolute and should include the js file name to be loaded. Example:
    1727         array( 'myplugin' => 'http://my-site.com/wp-content/plugins/myfolder/mce_plugin.js' )
    1728         If the plugin uses a button, it should be added with one of the "$mce_buttons" filters.
    1729         */
    1730         $mce_external_plugins = apply_filters('mce_external_plugins', array());
    1731        
    1732         $ext_plugins = '';
    1733         if ( ! empty($mce_external_plugins) ) {
    1734        
    1735         /*
    1736         The following filter loads external language files for TinyMCE plugins.
    1737         It takes an associative array 'plugin_name' => 'path', where path is the
    1738         include path to the file. The language file should follow the same format as
    1739         /tinymce/langs/wp-langs.php and should define a variable $strings that
    1740         holds all translated strings.
    1741         When this filter is not used, the function will try to load {mce_locale}.js.
    1742         If that is not found, en.js will be tried next.
    1743         */
    1744         $mce_external_languages = apply_filters('mce_external_languages', array());
    1745         $loaded_langs = array();
    1746         $strings = '';
    1747         if ( ! empty($mce_external_languages) ) {
    1748             foreach ( $mce_external_languages as $name => $path ) {
    1749             if ( @is_file($path) && @is_readable($path) ) {
    1750                 include_once($path);
    1751                 $ext_plugins .= $strings . "\n";
    1752                 $loaded_langs[] = $name;
    1753             }
    1754             }
    1755         }
    1756        
    1757         foreach ( $mce_external_plugins as $name => $url ) {
    1758             if ( is_ssl() ) $url = str_replace('http://', 'https://', $url);
    1759             $plugins[] = '-' . $name;
    1760             $plugurl = dirname($url);
    1761             $strings = $str1 = $str2 = '';
    1762             if ( ! in_array($name, $loaded_langs) ) {
    1763                 $path = str_replace( WP_PLUGIN_URL, '', $plugurl );
    1764                 $path = WP_PLUGIN_DIR . $path . '/langs/';
    1765                 if ( function_exists('realpath') )
    1766                 $path = trailingslashit( realpath($path) );
    1767             if ( @is_file($path . $mce_locale . '.js') )
    1768                 $strings .= @file_get_contents($path . $mce_locale . '.js') . "\n";
    1769             if ( @is_file($path . $mce_locale . '_dlg.js') )
    1770                 $strings .= @file_get_contents($path . $mce_locale . '_dlg.js') . "\n";
    1771             if ( 'en' != $mce_locale && empty($strings) ) {
    1772                 if ( @is_file($path . 'en.js') ) {
    1773                     $str1 = @file_get_contents($path . 'en.js');
    1774                     $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str1, 1 ) . "\n";
    1775                 }
    1776                 if ( @is_file($path . 'en_dlg.js') ) {
    1777                     $str2 = @file_get_contents($path . 'en_dlg.js');
    1778                     $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str2, 1 ) . "\n";
    1779                 }
    1780             }
    1781             if ( ! empty($strings) )
    1782                 $ext_plugins .= "\n" . $strings . "\n";
    1783             }
    1784             $ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n";
    1785             $ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . "\n";
    1786         }
    1787         }
    1788     }
    1789    
    1790     if ( $teeny ) {
    1791         $mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, link, unlink, fullscreen') );
    1792         $mce_buttons = implode($mce_buttons, ',');
    1793         $mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = '';
    1794     } else {
    1795         $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' ));
    1796         $mce_buttons = implode($mce_buttons, ',');
    1797         $mce_buttons_2 = array( 'formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', 'removeformat', '|', 'charmap', '|', 'outdent', 'indent', '|', 'undo', 'redo', 'wp_help' );
    1798         $mce_buttons_2 = apply_filters('mce_buttons_2', $mce_buttons_2);
    1799         $mce_buttons_2 = implode($mce_buttons_2, ',');
    1800         $mce_buttons_3 = apply_filters('mce_buttons_3', array());
    1801         $mce_buttons_3 = implode($mce_buttons_3, ',');
    1802         $mce_buttons_4 = apply_filters('mce_buttons_4', array());
    1803         $mce_buttons_4 = implode($mce_buttons_4, ',');
    1804     }
    1805     $no_captions = (bool) apply_filters( 'disable_captions', '' );
    1806 
    1807     // TinyMCE init settings
    1808     $initArray = array (
    1809         'mode' => 'specific_textareas',
    1810         'editor_selector' => 'theEditor',
    1811         'width' => '100%',
    1812         'theme' => 'advanced',
    1813         'skin' => 'wp_theme',
    1814         'theme_advanced_buttons1' => $mce_buttons,
    1815         'theme_advanced_buttons2' => $mce_buttons_2,
    1816         'theme_advanced_buttons3' => $mce_buttons_3,
    1817         'theme_advanced_buttons4' => $mce_buttons_4,
    1818         'language' => $mce_locale,
    1819         'spellchecker_languages' => $mce_spellchecker_languages,
    1820         'theme_advanced_toolbar_location' => 'top',
    1821         'theme_advanced_toolbar_align' => 'left',
    1822         'theme_advanced_statusbar_location' => 'bottom',
    1823         'theme_advanced_resizing' => true,
    1824         'theme_advanced_resize_horizontal' => false,
    1825         'dialog_type' => 'modal',
    1826         'formats' => "{
    1827         alignleft : [
    1828             {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}},
    1829             {selector : 'img,table', classes : 'alignleft'}
    1830         ],
    1831         aligncenter : [
    1832             {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}},
    1833             {selector : 'img,table', classes : 'aligncenter'}
    1834         ],
    1835         alignright : [
    1836             {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}},
    1837             {selector : 'img,table', classes : 'alignright'}
    1838         ],
    1839         strikethrough : {inline : 'del'}
    1840         }",
    1841         'relative_urls' => false,
    1842         'remove_script_host' => false,
    1843         'convert_urls' => false,
    1844         'apply_source_formatting' => false,
    1845         'remove_linebreaks' => true,
    1846         'gecko_spellcheck' => true,
    1847         'entities' => '38,amp,60,lt,62,gt',
    1848         'accessibility_focus' => true,
    1849         'tabfocus_elements' => 'major-publishing-actions',
    1850         'media_strict' => false,
    1851         'paste_remove_styles' => true,
    1852         'paste_remove_spans' => true,
    1853         'paste_strip_class_attributes' => 'all',
    1854         'paste_text_use_dialog' => true,
    1855         'wpeditimage_disable_captions' => $no_captions,
    1856         'plugins' => implode( ',', $plugins ),
    1857     );
    1858    
    1859     if ( ! empty( $editor_styles ) && is_array( $editor_styles ) ) {
    1860         $mce_css = array();
    1861         $style_uri = get_stylesheet_directory_uri();
    1862         if ( ! is_child_theme() ) {
    1863             foreach ( $editor_styles as $file )
    1864                 $mce_css[] = "$style_uri/$file";
    1865         } else {
    1866         $style_dir    = get_stylesheet_directory();
    1867         $template_uri = get_template_directory_uri();
    1868         $template_dir = get_template_directory();
    1869         foreach ( $editor_styles as $file ) {
    1870             if ( file_exists( "$template_dir/$file" ) )
    1871             $mce_css[] = "$template_uri/$file";
    1872             if ( file_exists( "$style_dir/$file" ) )
    1873                 $mce_css[] = "$style_uri/$file";
    1874         }
    1875         }
    1876         $mce_css = implode( ',', $mce_css );
    1877     } else {
    1878         $mce_css = '';
    1879     }
    1880     $mce_css = trim( apply_filters( 'mce_css', $mce_css ), ' ,' );
    1881     if ( ! empty($mce_css) )
    1882         $initArray['content_css'] = $mce_css;
    1883     if ( is_array($settings) )
    1884         $initArray = array_merge($initArray, $settings);
    1885     // For people who really REALLY know what they're doing with TinyMCE
    1886     // You can modify initArray to add, remove, change elements of the config before tinyMCE.init
    1887     // Setting "valid_elements", "invalid_elements" and "extended_valid_elements" can be done through "tiny_mce_before_init".
    1888     // Best is to use the default cleanup by not specifying valid_elements, as TinyMCE contains full set of XHTML 1.0.
    1889     if ( $teeny ) {
    1890         $initArray = apply_filters('teeny_mce_before_init', $initArray);
    1891     } else {
    1892         $initArray = apply_filters('tiny_mce_before_init', $initArray);
    1893     }
    1894     if ( empty($initArray['theme_advanced_buttons3']) && !empty($initArray['theme_advanced_buttons4']) ) {
    1895         $initArray['theme_advanced_buttons3'] = $initArray['theme_advanced_buttons4'];
    1896         $initArray['theme_advanced_buttons4'] = '';
    1897     }
    1898     if ( ! isset($concatenate_scripts) )
    1899         script_concat_settings();
    1900     $language = $initArray['language'];
    1901     $compressed = $compress_scripts && $concatenate_scripts && isset($_SERVER['HTTP_ACCEPT_ENCODING'])
    1902         && false !== strpos( strtolower($_SERVER['HTTP_ACCEPT_ENCODING']), 'gzip');
    1903     /**
    1904      * Deprecated
    1905      *
    1906      * The tiny_mce_version filter is not needed since external plugins are loaded directly by TinyMCE.
    1907      * These plugins can be refreshed by appending query string to the URL passed to mce_external_plugins filter.
    1908      * If the plugin has a popup dialog, a query string can be added to the button action that opens it (in the plugin's code).
    1909      */
    1910     $version = apply_filters('tiny_mce_version', '');
    1911     $version = 'ver=' . $tinymce_version . $version;
    1912     if ( 'en' != $language )
    1913         include_once(ABSPATH . WPINC . '/js/tinymce/langs/wp-langs.php');
    1914    
    1915     $mce_options = '';
    1916     foreach ( $initArray as $k => $v ) {
    1917         if ( is_bool($v) ) {
    1918         $val = $v ? 'true' : 'false';
    1919         $mce_options .= $k . ':' . $val . ', ';
    1920         continue;
    1921         } elseif ( !empty($v) && is_string($v) && ( '{' == $v{0} || '[' == $v{0} ) ) {
    1922         $mce_options .= $k . ':' . $v . ', ';
    1923         continue;
    1924         }
    1925         $mce_options .= $k . ':"' . $v . '", ';
    1926     }
    1927    
    1928     $mce_options = rtrim( trim($mce_options), '\n\r,' ); ?>
    1929    
    1930     <script type="text/javascript">
    1931     /* <![CDATA[ */
    1932     tinyMCEPreInit = {
    1933         base : "<?php echo $baseurl; ?>",
    1934         suffix : "",
    1935         query : "<?php echo $version; ?>",
    1936         mceInit : {<?php echo $mce_options; ?>},
    1937         load_ext : function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');}
    1938     };
    1939     /* ]]> */
    1940     </script>
    1941     <?php
    1942     if ( $compressed )
    1943         echo "<script type='text/javascript' src='$baseurl/wp-tinymce.php?c=1&amp;$version'></script>\n";
    1944     else
    1945         echo "<script type='text/javascript' src='$baseurl/tiny_mce.js?$version'></script>\n";
    1946    
    1947     if ( 'en' != $language && isset($lang) )
    1948         echo "<script type='text/javascript'>\n$lang\n</script>\n";
    1949     else
    1950         echo "<script type='text/javascript' src='$baseurl/langs/wp-langs-en.js?$version'></script>\n";
    1951     ?>
    1952     <script type="text/javascript">
    1953     /* <![CDATA[ */
    1954     <?php
    1955         if ( $ext_plugins )
    1956         echo "$ext_plugins\n";
    1957    
    1958         if ( ! $compressed ) {
    1959     ?>
    1960     (function(){var t=tinyMCEPreInit,sl=tinymce.ScriptLoader,ln=t.mceInit.language,th=t.mceInit.theme,pl=t.mceInit.plugins;sl.markDone(t.base+'/langs/'+ln+'.js');sl.markDone(t.base+'/themes/'+th+'/langs/'+ln+'.js');sl.markDone(t.base+'/themes/'+th+'/langs/'+ln+'_dlg.js');tinymce.each(pl.split(','),function(n){if(n&&n.charAt(0)!='-'){sl.markDone(t.base+'/plugins/'+n+'/langs/'+ln+'.js');sl.markDone(t.base+'/plugins/'+n+'/langs/'+ln+'_dlg.js');}});})();
    1961     <?php } ?>
    1962     tinyMCE.init(tinyMCEPreInit.mceInit);
    1963     /* ]]> */
    1964     </script>
    1965     <?php
    1966 
    1967     // Load additional inline scripts based on active plugins.
    1968     if ( in_array( 'wpdialogs', $plugins ) ) {
    1969         wp_print_scripts( array( 'wpdialogs-popup' ) );
    1970         wp_print_styles('wp-jquery-ui-dialog');
    1971     }
    1972     }
    1973    
    1974     function tiny_mce_preload_dialogs() { ?>
    1975     <div id="preloaded-dialogs" style="display:none;">
    1976     <?php do_action('tiny_mce_preload_dialogs'); ?>
    1977     </div>
    1978     <?php
    1979     }
    1980 }
    1981 
    1982 $wiki = new Wiki();
Note: See TracChangeset for help on using the changeset viewer.