WordPress.org

Making WordPress.org


Ignore:
Timestamp:
09/03/16 00:40:00 (16 months ago)
Author:
jmdodd
Message:

Support Forums: Add "archived" queue for moderator use.

Archived posts are those that should not be visible, but may need to be referenced later.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/inc/class-moderators.php

    r3913 r3937  
    55class Moderators { 
    66 
     7    const ARCHIVED       = 'archived'; 
     8    const ARCHIVED_META  = '_wporg_bbp_unarchived_post_status'; 
     9    const DEFAULT_STATUS = 'publish'; 
     10 
    711    public function __construct() { 
    8         add_action( 'parse_query', array( $this, 'register_views' ), 1 ); 
     12        // Moderator-specific views. 
     13        add_action( 'bbp_register_views', array( $this, 'register_views' ), 1 ); 
     14 
     15        // Scripts and styles. 
     16        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles' ) ); 
     17 
     18        // Archived post status. 
     19        add_action( 'bbp_register_post_statuses',       array( $this, 'register_post_statuses' ) ); 
     20        add_action( 'bbp_get_request',                  array( $this, 'archive_handler' ) ); 
     21        add_filter( 'bbp_after_has_topics_parse_args',  array( $this, 'add_post_status_to_query' ) ); 
     22        add_filter( 'bbp_after_has_replies_parse_args', array( $this, 'add_post_status_to_query' ) ); 
     23        add_filter( 'bbp_topic_admin_links',            array( $this, 'admin_links' ), 10, 2 ); 
     24        add_filter( 'bbp_reply_admin_links',            array( $this, 'admin_links' ), 10, 2 ); 
    925    } 
    1026 
     
    4359            ) 
    4460        ); 
     61 
     62        bbp_register_view( 
     63            'archived', 
     64            __( 'Archived', 'wporg-forums' ), 
     65            array( 
     66                'meta_key'      => null, 
     67                'post_type'     => array( 
     68                    'topic', 
     69                    'reply', 
     70                ), 
     71                'post_status'   => 'archived', 
     72                'show_stickies' => false, 
     73                'orderby'       => 'ID', 
     74            ) 
     75        ); 
     76    } 
     77 
     78    public function enqueue_styles() { 
     79        if ( current_user_can( 'moderate' ) ) { 
     80            wp_enqueue_style( 'support-forums-moderators', plugins_url( 'css/styles-moderators.css', __DIR__ ) ); 
     81        } 
     82    } 
     83 
     84    public function register_post_statuses() { 
     85 
     86        /** 
     87         * Add archived post status. 
     88         * 
     89         * Archived posts are intended for moderator use in determining a pattern 
     90         * of behavior. They are not duplicates, or spam, but should not be moved 
     91         * to the trash because they record user activity. 
     92         */ 
     93        register_post_status( 
     94            self::ARCHIVED, 
     95            array( 
     96                'label'                     => _x( 'Archived', 'post', 'wporg-forums' ), 
     97                'label_count'               => _nx_noop( 'Archived <span class="count">(%s)</span>', 'Archived <span class="count">(%s)</span>', 'post', 'wporg-forums' ), 
     98                'protected'                 => true, 
     99                'exclude_from_search'       => true, 
     100                'show_in_admin_status_list' => true, 
     101                'show_in_admin_add_list'    => false, 
     102            ) 
     103        ); 
     104 
     105    } 
     106 
     107    public function archive_handler( $action = '' ) { 
     108        if ( ! current_user_can( 'moderate' ) ) { 
     109            return; 
     110        } 
     111        $user_id = get_current_user_id(); 
     112 
     113        if ( ! in_array( $action, $this->get_valid_actions() ) ) { 
     114            return; 
     115        } 
     116 
     117        if ( empty( $_GET['post_id'] ) ) { 
     118            return; 
     119        } 
     120 
     121        $post = get_post( absint( $_GET['post_id'] ) ); 
     122        if ( ! $post ) { 
     123            return false; 
     124        } 
     125 
     126        // Check for empty post id. 
     127        if ( ! $post ) { 
     128            bbp_add_error( 'wporg_bbp_archive_post_id', __( '<strong>ERROR</strong>: No post was found! Which post are you archiving?', 'wporg-forums' ) ); 
     129 
     130        // Check for current user. 
     131        } elseif ( empty( $user_id ) ) { 
     132            bbp_add_error( 'wporg_bbp_archive_logged_in', __( '<strong>ERROR</strong>: You must be logged in to do this!', 'wporg-forums' ) ); 
     133 
     134        // Check nonce. 
     135        } elseif ( ! bbp_verify_nonce_request( 'toggle-post-archive_' . $user_id . '_' . $post->ID ) ) { 
     136            bbp_add_error( 'wporg_bbp_archive_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'wporg-forums' ) ); 
     137 
     138        } 
     139 
     140        if ( bbp_has_errors() ) { 
     141            return; 
     142        } 
     143 
     144        $is_archived = $this->is_post_archived( $post->ID ); 
     145        $success = false; 
     146        $add_view_all = false; 
     147 
     148        if ( true == $is_archived && 'wporg_bbp_unarchive_post' === $action ) { 
     149            $success = $this->unarchive_post( $post->ID ); 
     150        } elseif ( false == $is_archived && 'wporg_bbp_archive_post' === $action ) { 
     151            $success = $this->archive_post( $post->ID ); 
     152            $add_view_all = true; 
     153        } 
     154 
     155        $permalink = $this->get_permalink( $post->ID ); 
     156        if ( $add_view_all ) { 
     157            $permalink = bbp_add_view_all( $permalink, true ); 
     158        } 
     159 
     160        if ( true === $success ) { 
     161            $redirect = $this->get_permalink( $post->ID ); 
     162            bbp_redirect( $redirect ); 
     163        } elseif ( true === $is_archived && 'wporg_bbp_archive_post' === $action ) { 
     164            bbp_add_error( 'wporg_bbp_archive_post', __( '<strong>ERROR</strong>: There was a problem archiving that post!', 'wporg-forums' ) ); 
     165        } elseif ( false === $is_archived && 'wporg_bbp_unarchive_post' === $action ) { 
     166            bbp_add_error( 'wporg_bbp_unarchive_post', __( '<strong>ERROR</strong>: There was a problem unarchiving that post!', 'wporg-forums' ) ); 
     167        } 
     168    } 
     169 
     170    public function add_post_status_to_query( $args = array() ) { 
     171        if ( bbp_get_view_all() ) { 
     172            $post_stati = explode( ',', $args['post_status'] ); 
     173            $post_stati[] = self::ARCHIVED; 
     174            $args['post_status'] = implode( ',', $post_stati ); 
     175        } 
     176        return $args; 
     177    } 
     178 
     179    public function admin_links( $r, $post_id ) { 
     180        $r['archive'] = $this->get_archive_link( array( 'post_id' => $post_id ) ); 
     181        return $r; 
     182    } 
     183 
     184    public function get_archive_link( $args = array() ) { 
     185        if ( ! current_user_can( 'moderate' ) ) { 
     186            return false; 
     187        } 
     188        $user_id = get_current_user_id(); 
     189 
     190        $r = bbp_parse_args( $args, array( 
     191            'post_id' => get_the_ID(), 
     192            'archive' => esc_html__( 'Archive', 'wporg-forums' ), 
     193            'unarchive' => esc_html__( 'Unarchive', 'wporg-forums' ), 
     194        ), 'get_post_archive_link' ); 
     195        if ( empty( $r['post_id'] ) ) { 
     196            return false; 
     197        } 
     198        $post_id = $r['post_id']; 
     199 
     200        $post = get_post( $post_id ); 
     201        if ( ! $post ) { 
     202            return false; 
     203        } 
     204 
     205        if ( $this->is_post_archived( $post->ID ) ) { 
     206            $text = $r['unarchive']; 
     207            $query_args = array( 'action' => 'wporg_bbp_unarchive_post', 'post_id' => $post->ID ); 
     208        } else { 
     209            $text = $r['archive']; 
     210            $query_args = array( 'action' => 'wporg_bbp_archive_post', 'post_id' => $post->ID ); 
     211        } 
     212 
     213        $permalink = $this->get_permalink( $post->ID ); 
     214 
     215        $url = esc_url( wp_nonce_url( add_query_arg( $query_args, $permalink ), 'toggle-post-archive_' . $user_id . '_' . $post->ID ) ); 
     216        return sprintf( "<a href='%s'>%s</a>", $url, esc_html( $text ) ); 
     217    } 
     218 
     219    public function is_post_archived( $post_id ) { 
     220        $post = get_post( $post_id ); 
     221        if ( ! $post ) { 
     222            return false; 
     223        } 
     224 
     225        return $post->post_status == self::ARCHIVED; 
     226    } 
     227 
     228    public function archive_post( $post_id ) { 
     229        if ( empty( $post_id ) ) { 
     230            return false; 
     231        } 
     232 
     233        $post = get_post( $post_id ); 
     234        if ( ! $post ) { 
     235            return false; 
     236        } 
     237 
     238        if ( ! $this->is_post_archived( $post->ID ) ) { 
     239            $post_id = wp_update_post( array( 
     240                'ID'          => $post->ID, 
     241                'post_status' => self::ARCHIVED, 
     242            ), true ); 
     243            if ( $post_id ) { 
     244                update_post_meta( $post->ID, self::ARCHIVED_META, $post->post_status ); 
     245                return true; 
     246            } 
     247        } 
     248 
     249        return false; 
     250    } 
     251 
     252    public function unarchive_post( $post_id ) { 
     253        if ( empty( $post_id ) ) { 
     254            return false; 
     255        } 
     256 
     257        $post = get_post( $post_id ); 
     258        if ( ! $post ) { 
     259            return false; 
     260        } 
     261 
     262        if ( $this->is_post_archived( $post->ID ) ) { 
     263            $post_status = get_post_meta( $post->ID, self::ARCHIVED_META, true ); 
     264            if ( ! $post_status ) { 
     265                $post_status = self::DEFAULT_STATUS; 
     266            } 
     267            $post_id = wp_update_post( array( 
     268                'ID'          => $post->ID, 
     269                'post_status' => $post_status, 
     270            ) ); 
     271            if ( $post_id ) { 
     272                delete_post_meta( $post->ID, self::ARCHIVED_META ); 
     273                return true; 
     274            } 
     275        } 
     276 
     277        return false; 
     278    } 
     279 
     280    public function get_permalink( $post_id ) { 
     281        if ( empty( $post_id ) ) { 
     282            return false; 
     283        } 
     284 
     285        $post = get_post( $post_id ); 
     286        if ( ! $post ) { 
     287            return false; 
     288        } 
     289 
     290        switch ( $post->post_type ) { 
     291            case 'topic' : 
     292                $permalink = bbp_get_topic_permalink( $post->ID ); 
     293                break; 
     294            case 'reply' : 
     295                $permalink = bbp_get_topic_permalink( bbp_get_reply_topic_id( $post->ID ) ); 
     296                break; 
     297            case 'post' : 
     298            default : 
     299                $permalink = get_permalink( $post->ID ); 
     300        } 
     301 
     302        return $permalink; 
     303    } 
     304 
     305    public function get_valid_actions() { 
     306        return array( 
     307            'wporg_bbp_archive_post', 
     308            'wporg_bbp_unarchive_post', 
     309        ); 
    45310    } 
    46311} 
Note: See TracChangeset for help on using the changeset viewer.