WordPress.org

Making WordPress.org

Ticket #1781: 1781.2.diff

File 1781.2.diff, 11.0 KB (added by DrewAPicture, 4 years ago)
  • inc/explanations.php

     
    3636                $this->post_types = DevHub\get_parsed_post_types();
    3737
    3838                // Setup.
    39                 add_action( 'init',                    array( $this, 'register_post_type'     ), 0   );
    40                 add_action( 'init',                    array( $this, 'remove_editor_support'  ), 100 );
    41                 add_action( 'edit_form_after_title',   array( $this, 'post_to_expl_controls'  )      );
    42                 add_action( 'edit_form_top',           array( $this, 'expl_to_post_controls'  )      );
    43                 add_action( 'admin_bar_menu',          array( $this, 'toolbar_edit_link'      ), 100 );
     39                add_action( 'init',                    array( $this, 'register_post_type'     ), 0     );
     40                add_action( 'init',                    array( $this, 'remove_editor_support'  ), 100   );
     41                add_action( 'edit_form_after_title',   array( $this, 'post_to_expl_controls'  )        );
     42                add_action( 'edit_form_top',           array( $this, 'expl_to_post_controls'  )        );
     43                add_action( 'admin_bar_menu',          array( $this, 'toolbar_edit_link'      ), 100   );
    4444
     45                // Permissions.
     46                add_action( 'after_switch_theme',      array( $this, 'add_roles'              )        );
     47                add_filter( 'user_has_cap',            array( $this, 'grant_caps'             )        );
     48                add_filter( 'post_row_actions',        array( $this, 'expl_row_action'        ), 10, 2 );
     49
    4550                // Script and styles.
    46                 add_action( 'admin_enqueue_scripts',   array( $this, 'admin_enqueue_scripts'  )      );
     51                add_action( 'admin_enqueue_scripts',   array( $this, 'admin_enqueue_scripts'  )        );
    4752
    4853                // AJAX.
    49                 add_action( 'wp_ajax_new_explanation', array( $this, 'new_explanation'        )      );
    50                 add_action( 'wp_ajax_un_publish',      array( $this, 'un_publish_explanation' )      );
     54                add_action( 'wp_ajax_new_explanation', array( $this, 'new_explanation'        )        );
     55                add_action( 'wp_ajax_un_publish',      array( $this, 'un_publish_explanation' )        );
    5156
    5257                // Content tweaks.
    5358                add_filter( 'syntaxhighlighter_precode', 'html_entity_decode' );
     
    7580                        'show_ui'           => true,
    7681                        'show_in_menu'      => false,
    7782                        'show_in_nav_menus' => false,
     83                        'capability_type'   => 'explanation',
     84                        'map_meta_cap'      => true,
    7885                        'supports'          => array( 'editor', 'revisions' ),
    7986                        'rewrite'           => false,
    8087                        'query_var'         => false,
     
    153160                if ( $this->exp_post_type !== $post->post_type ) {
    154161                        return;
    155162                }
    156 
    157                 $parent = is_a( $post, 'WP_Post' ) ? $post->post_parent : get_post( $post )->post_parent;
    158 
    159                 if ( 0 !== $parent ) :
    160                         $prefix = '<strong>' . __( 'Associated with: ', 'wporg' ) . '</strong>';
    161                         ?>
    162                         <div class="postbox-container" style="margin-top:20px;width:100%;">
    163                                 <div class="postbox">
    164                                         <div class="inside" style="padding-bottom:0;">
    165                                                 <?php edit_post_link( get_the_title( $parent ), $prefix, '', $parent ); ?>
    166                                         </div>
     163                ?>
     164                <div class="postbox-container" style="margin-top:20px;width:100%;">
     165                        <div class="postbox">
     166                                <div class="inside" style="padding-bottom:0;">
     167                                        <strong><?php _e( 'Associated with: ', 'wporg' ); ?></strong>
     168                                        <?php
     169                                        // Edit link if the current user can edit, otherwise view link.
     170                                        if ( current_user_can( 'edit_post', $post->post_parent ) ) :
     171                                                edit_post_link( get_the_title( $post->post_parent ), '', '', $post->post_parent );
     172                                        else :
     173                                                printf( '<a href="%1$s">%2$s</a>',
     174                                                        esc_url( get_permalink( $post->post_parent ) ),
     175                                                        str_replace( 'Explanation: ', '', get_the_title( $post->post_parent ) )
     176                                                );
     177                                        endif;
     178                                        ?>
    167179                                </div>
    168180                        </div>
     181                </div>
    169182                <?php
    170                 endif;
    171183        }
    172184
    173185        /**
     
    201213        }
    202214
    203215        /**
     216         * Adds the 'Explanation Editor' role.
     217         *
     218         * @access public
     219         */
     220        public function add_roles() {
     221                add_role(
     222                        'expl_editor',
     223                        __( 'Explanation Editor', 'wporg' ),
     224                        array(
     225                                'unfiltered_html'             => true,
     226                                'read'                        => true,
     227                                'edit_explanations'           => true,
     228                                'edit_others_explanations'    => true,
     229                                'edit_published_explanations' => true,
     230                                'edit_private_explanations'   => true,
     231                                'read_private_explanations'   => true,
     232                        )
     233                );
     234        }
     235
     236        /**
     237         * Grants explanation capabilities to users.
     238         *
     239         * @access public
     240         *
     241         * @param array $caps Capabilities.
     242         * @return array Modified capabilities array.
     243         */
     244        public function grant_caps( $caps ) {
     245
     246                if ( ! is_user_member_of_blog() ) {
     247                        return $caps;
     248                }
     249
     250                $role = wp_get_current_user()->roles[0];
     251
     252                // Only grant explanation post type caps for admins, editors, and explanation editors.
     253                if ( in_array( $role, array( 'administrator', 'editor', 'expl_editor' ) ) ) {
     254                        $base_caps = array(
     255                                'edit_explanations', 'edit_others_explanations',
     256                                'edit_published_explanations', 'edit_posts'
     257                        );
     258
     259                        foreach ( $base_caps as $cap ) {
     260                                $caps[ $cap ] = true;
     261                        }
     262
     263                        $editor_caps = array(
     264                                'publish_explanations',
     265                                'delete_explanations', 'delete_others_explanations',
     266                                'delete_published_explanations', 'delete_private_explanations',
     267                                'edit_private_explanations', 'read_private_explanations'
     268                        );
     269
     270                        if ( ! empty( $caps['edit_pages'] ) ) {
     271                                foreach ( $editor_caps as $cap ) {
     272                                        $caps[ $cap ] = true;
     273                                }
     274                        }
     275                }
     276
     277                return $caps;
     278        }
     279
     280        /**
     281         * Adds the 'Add/Edit Explanation' row actions to the parsed post type list tables.
     282         *
     283         * @access public
     284         *
     285         * @param array    $actions Row actions.
     286         * @param \WP_Post $post    Parsed post object.
     287         * @return array (Maybe) filtered row actions.
     288         */
     289        public function expl_row_action( $actions, $post ) {
     290                if ( ! in_array( $post->post_type, \DevHub\get_parsed_post_types() ) ) {
     291                        return $actions;
     292                }
     293
     294                $expl = \DevHub\get_explanation( $post );
     295
     296                $expl_action = array();
     297
     298                if ( $expl ) {
     299                        if ( ! current_user_can( 'edit_posts', $expl->ID ) ) {
     300                                return $actions;
     301                        }
     302
     303                        $expl_action['edit-expl'] = sprintf( '<a href="%1$s" alt="%2$s">%3$s</a>',
     304                                esc_url( get_edit_post_link( $expl->ID ) ),
     305                                esc_attr__( 'Edit Explanation', 'wporg' ),
     306                                __( 'Edit Explanation', 'wporg' )
     307                        );
     308                } else {
     309                        $expl_action['add-expl'] = sprintf( '<a href="" class="create-expl" data-nonce="%1$s" data-id="%2$s">%3$s</a>',
     310                                esc_attr( wp_create_nonce( 'create-expl' ) ),
     311                                esc_attr( $post->ID ),
     312                                __( 'Add Explanation', 'wporg' )
     313                        );
     314                }
     315
     316                return array_merge( $expl_action, $actions );
     317        }
     318
     319        /**
    204320         * Output the Explanation status controls.
    205321         *
    206322         * @access public
     
    215331                        ?>
    216332                        <span id="expl-row-actions" class="expl-row-actions">
    217333                                <a id="edit-expl" href="<?php echo get_edit_post_link( $explanation->ID ); ?>">
    218                                         <?php _e( 'Edit Content', 'wporg' ); ?>
     334                                        <?php _e( 'Edit Explanation', 'wporg' ); ?>
    219335                                </a>
    220336                                <?php if ( 'publish' == get_post_status( $explanation ) ) : ?>
    221337                                        <a href="#unpublish" id="unpublish-expl" data-nonce="<?php echo wp_create_nonce( 'unpublish-expl' ); ?>" data-id="<?php the_ID(); ?>">
    222                                                 <?php _e( 'Un-publish', 'wporg' ); ?>
     338                                                <?php _e( 'Unpublish', 'wporg' ); ?>
    223339                                        </a>
    224340                                <?php endif; ?>
    225341                        </span><!-- .expl-row-actions -->
     
    249365
    250366                switch( $status = $post->post_status ) {
    251367                        case 'draft' :
    252                                 $label = __( 'Drafted', 'wporg' );
     368                                $label = __( 'Draft', 'wporg' );
    253369                                break;
    254370                        case 'pending' :
    255371                                $label = __( 'Pending Review', 'wporg' );
     
    273389         */
    274390        public function admin_enqueue_scripts() {
    275391
     392                $parsed_post_types = array();
     393
     394                foreach ( \DevHub\get_parsed_post_types() as $post_type ) {
     395                        $parsed_post_types[] = $post_type;
     396                        $parsed_post_types[] = "edit-{$post_type}";
     397                }
     398
    276399                if ( in_array( get_current_screen()->id, array_merge(
    277                                 DevHub\get_parsed_post_types(),
     400                                $parsed_post_types,
    278401                                array( 'wporg_explanations', 'edit-wporg_explanations' )
    279402                ) ) ) {
    280403                        wp_enqueue_style( 'wporg-admin', get_template_directory_uri() . '/stylesheets/admin.css', array(), '20141218' );
     
    281404                        wp_enqueue_script( 'wporg-explanations', get_template_directory_uri() . '/js/explanations.js', array( 'jquery', 'wp-util' ), '20141218', true );
    282405
    283406                        wp_localize_script( 'wporg-explanations', 'wporg', array(
    284                                 'editContentLabel' => __( 'Edit Content', 'wporg' ),
     407                                'editContentLabel' => __( 'Edit Explanation', 'wporg' ),
    285408                                'statusLabel'      => array(
    286                                         'draft'        => __( 'Drafted', 'wporg' ),
     409                                        'draft'        => __( 'Draft', 'wporg' ),
    287410                                        'pending'      => __( 'Pending Review', 'wporg' ),
    288411                                        'publish'      => __( 'Published', 'wporg' ),
    289412                                ),
     
    300423                check_ajax_referer( 'create-expl', 'nonce' );
    301424
    302425                $post_id = empty( $_REQUEST['post_id'] ) ? 0 : absint( $_REQUEST['post_id'] );
     426                $context = empty( $_REQUEST['context'] ) ? '' : sanitize_text_field( $_REQUEST['context'] );
    303427
    304428                if ( DevHub\get_explanation( $post_id ) ) {
    305429                        wp_send_json_error( new WP_Error( 'post_exists', __( 'Explanation already exists.', 'wporg' ) ) );
     
    315439
    316440                        if ( ! is_wp_error( $explanation ) && 0 !== $explanation ) {
    317441                                wp_send_json_success( array(
    318                                         'post_id' => $explanation
     442                                        'post_id'   => $explanation,
     443                                        'parent_id' => $post_id,
     444                                        'context'   => $context
    319445                                ) );
    320446                        } else {
    321447                                wp_send_json_error(
  • js/explanations.js

     
    1313                unPublishLink = $( '#unpublish-expl' ),
    1414                rowActions    = $( '#expl-row-actions' );
    1515
     16        var     rowCreateLink = $( '.create-expl' );
     17
    1618        /**
    1719         * AJAX handler for creating and associating a new explanation post.
    1820         *
     
    2628                        error:   createExplError,
    2729                        data:    {
    2830                                nonce:   $( this ).data( 'nonce' ),
    29                                 post_id: $( this ).data( 'id' )
     31                                post_id: $( this ).data( 'id' ),
     32                                context: event.data.context
    3033                        }
    3134                } );
    3235        }
     
    3740         * @param {object} data Data response object.
    3841         */
    3942        function createExplSuccess( data ) {
    40                 createLink.hide();
    41                 rowActions.html( '<a href="post.php?post=' + data.post_id + '&action=edit">' + wporg.editContentLabel + '</a>' );
    42                 statusLabel.text( wporg.statusLabel.draft );
     43                var editLink = '<a href="post.php?post=' + data.post_id + '&action=edit">' + wporg.editContentLabel + '</a>';
     44
     45                if ( 'edit' == data.context ) {
     46                        // Action in the parsed post type edit screen.
     47                        createLink.hide();
     48                        rowActions.html( editLink );
     49                        statusLabel.text( wporg.statusLabel.draft );
     50                } else {
     51                        // Row link in the list table.
     52                        $( '#post-' + data.parent_id + ' .add-expl' ).html( editLink + ' | ' );
     53                }
    4354        }
    4455
    4556        /**
     
    8798        function unPublishError( data ) {}
    8899
    89100        // Events.
    90         $( '#create-expl' ).on( 'click', createExplanation );
    91         $( '#unpublish-expl' ).on( 'click', unPublishExplantaion );
     101        createLink.on( 'click', { context: 'edit' }, createExplanation );
     102        rowCreateLink.on( 'click', { context: 'list' }, createExplanation );
     103        unPublishLink.on( 'click', unPublishExplantaion );
    92104
    93105} )( jQuery );