Making WordPress.org


Ignore:
Timestamp:
10/19/2018 10:56:22 PM (8 years ago)
Author:
coffee2code
Message:

developer.wordpress.org: Allow users to edit their own submitted notes that are still in moderation.

Props keesiemeijer.
Fixes #3572.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/user-content.php

    r7492 r7754  
    5151
    5252                // Enable shortcodes for comments
    53                 add_filter( 'comment_text',                    'do_shortcode');
     53                add_filter( 'comment_text',                    'do_shortcode' );
    5454
    5555                // Customize allowed tags
     
    6868                add_action( 'edit_comment',                    array( __CLASS__, 'comment_edit_allowed_html' ) );
    6969
     70                // Adds hidden fields to a comment form for editing
     71                add_filter( 'comment_form_submit_field',       array( __CLASS__, 'add_hidden_fields' ), 10, 2 );
    7072        }
    7173
     
    149151
    150152                $allowed_protocols = array( 'http', 'https' );
    151 
    152                 $comment_content = wp_kses( $comment_content, $allowed_html, $allowed_protocols );
    153                 $commentdata['comment_content'] = preg_replace( '/\r?\n|\r/', '', $comment_content );
     153                $comment_content   = wp_kses( $comment_content, $allowed_html, $allowed_protocols );
     154
     155                // Replace newlines with a space.
     156                $commentdata['comment_content'] = preg_replace( '/\r?\n|\r/', ' ', $comment_content );
    154157
    155158                return $commentdata;
     
    168171                        wp_enqueue_script( 'wporg-developer-user-notes-feedback', get_template_directory_uri() . '/js/user-notes-feedback.js', array( 'jquery', 'quicktags' ), '20180323', true );
    169172                        wp_localize_script( 'wporg-developer-user-notes-feedback', 'wporg_note_feedback', array(
    170                                 'show' => __( 'Show Feedback', 'wporg' ),
    171                                 'hide' => __( 'Hide Feedback', 'wporg' ),
     173                                'show'             => __( 'Show Feedback', 'wporg' ),
     174                                'hide'             => __( 'Hide Feedback', 'wporg' ),
    172175                        ) );
    173176                }
     
    177180         * Sets the default language for SyntaxHighlighter shortcode.
    178181         *
    179          * @param  array $atts Shortcode attributes.
     182         * @param array $atts Shortcode attributes.
    180183         * @return array
    181184         */
     
    188191         * Subverts capital_P_dangit for SyntaxHighlighter shortcode.
    189192         *
    190          * @param  string $code
     193         * @param string $code
    191194         * @return string
    192195         */
     
    196199
    197200        /**
     201         * Add hidden fields to the comment form if the context is 'edit'
     202         *
     203         * @param string $submit_field HTML string with the submit button fields.
     204         * @param array  $args         Arguments for the comment form.
     205         * @return HTML string with the submit button fields.
     206         */
     207        public static function add_hidden_fields( $submit_field, $args ) {
     208                $context = isset( $args['context'] ) ? $args['context'] : '';
     209                $comment = isset( $args['comment_edit'] ) ? $args['comment_edit'] : false;
     210                if ( ! ( $comment && ( 'edit' === $context ) ) ) {
     211                        return $submit_field;
     212                }
     213
     214                $comment_id = isset( $comment->comment_ID ) ? $comment->comment_ID : 0;
     215
     216                return $submit_field . self::get_edit_fields( $comment_id, $instance = 0 );
     217        }
     218
     219        /**
     220         * Get the comment form arguments by context.
     221         *
     222         * @param WP_Comment|false $comment Comment object or false. Default false.
     223         * @param string           $context Context of arguments. Accepts 'edit' or empty string.
     224         * @return array Array with comment form arguments.
     225         */
     226        public static function comment_form_args( $comment = false, $context = '' ) {
     227                $label = _x( 'Add Note or Feedback', 'noun', 'wporg' );
     228                if ( 'edit' === $context ) {
     229                        $label = _x( 'Edit Note', 'noun', 'wporg' );
     230                }
     231
     232                $user_identity = wp_get_current_user();
     233
     234                $args = array(
     235                        'logged_in_as'        => '<p class="logged-in-as">'
     236                        . sprintf(
     237                                /* translators: 1: user profile link, 2: accessibility text, 3: user name, 4: logout URL */
     238                                __( '<a href="%1$s" aria-label="%2$s">Logged in as %3$s</a>. <a href="%4$s">Log out?</a>' ),
     239                                'https://profiles.wordpress.org/' . esc_attr( $user_identity->user_nicename ),
     240                                /* translators: %s: user name */
     241                                esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity->display_name ) ),
     242                                $user_identity->display_name,
     243                                wp_logout_url( apply_filters( 'the_permalink', get_permalink() ) )
     244                        )
     245                        . '</p><p><ul><li>'
     246                        . __( 'Notes should supplement code reference entries, for example examples, tips, explanations, use-cases, and best practices.', 'wporg' )
     247                        . '</li><li>'
     248                        . __( 'Feedback can be to report errors or omissions with the documentation on this page. Such feedback will not be publicly posted.', 'wporg' )
     249                        . '</li><li>'
     250                        /* translators: 1: php button, 2: js button, 3: inline code button */
     251                        . sprintf(
     252                                __( 'You can enter text and code. Use the %1$s, %2$s, or %3$s buttons to wrap code snippets.', 'wporg' ),
     253                                '<span class="text-button">php</span>',
     254                                '<span class="text-button">js</span>',
     255                                '<span class="text-button">' . __( 'inline code', 'wporg' ) . '</span>'
     256                        )
     257                        . '</li></ul></p>',
     258                        'comment_notes_after' => '<p>' . __( 'Submission Notes:', 'wporg' ) . '</p>' . self::get_editor_rules(),
     259                        'label_submit'        => $label,
     260                        'cancel_reply_link'   => '',
     261                        'must_log_in'         => '<p>' . sprintf(
     262                                __( 'You must <a href="%s">log in</a> before being able to contribute a note or feedback.', 'wporg' ),
     263                                'https://login.wordpress.org/?redirect_to=' . urlencode( get_comments_link() )
     264                        ) . '</p>',
     265                        'title_reply'         => '', //'Add Example'
     266                        'title_reply_to'      => '',
     267                );
     268
     269                if ( class_exists( 'DevHub_Note_Preview' ) ) {
     270                        $args['comment_notes_after'] = DevHub_Note_Preview::comment_preview() . $args['comment_notes_after'];
     271                        $args['class_form']          = "comment-form tab-container";
     272                }
     273
     274                $args['comment_field'] = self::wp_editor_comments( $label, $comment );
     275
     276                // Args for adding hidden links after the comment form submit field.
     277                $args['context']      = $context;
     278                $args['comment_edit'] = $comment;
     279
     280                if ( $comment && ( 'edit' === $context ) ) {
     281                        $comment_id = isset( $comment->comment_ID ) ? $comment->comment_ID : 0;
     282                        $post_id    = isset( $comment->comment_post_ID ) ? $comment->comment_post_ID : 0;
     283
     284                        $args['action'] = get_permalink( $post_id ) . '#comment-' . $comment_id;
     285                }
     286
     287                return $args;
     288        }
     289
     290        /**
    198291         * Capture an {@see wp_editor()} instance as the 'User Contributed Notes' comment form.
    199292         *
    200293         * Uses output buffering to capture the editor instance for use with the {@see comments_form()}.
    201294         *
     295         * @param string           $label   Label used for the editor.
     296         * @param WP_Comment|false $comment Comment object or false. Default false.
    202297         * @return string HTML output for the wp_editor-ized comment form.
    203298         */
    204         public static function wp_editor_comments() {
     299        public static function wp_editor_comments( $label, $comment = false ) {
     300                $content = isset( $comment->comment_content ) ? trim( $comment->comment_content ) : '';
     301
     302                // wp_kses() converts htmlspecialchars in source code.
     303                $content = $content ? htmlspecialchars_decode( $content ) : '';
     304
    205305                ob_start();
    206                 echo '<h3><label for="comment">' . _x( 'Add Note or Feedback', 'noun', 'wporg' ) . '</label></h3>';
     306                echo '<h3><label for="comment">' . $label . '</label></h3>';
    207307
    208308                if ( class_exists( 'DevHub_Note_Preview' ) ) {
    209                         echo '<ul class="tablist" style="display:none;">';
     309                        echo "<ul class='tablist' style='display: none;'>";
    210310                        echo '<li><a href="#comment-form-comment">' . __( 'Write', 'wporg' ) . '</a></li>';
    211311                        echo '<li><a href="#comment-preview">' . __( 'Preview', 'wporg' ) . '</a></li></ul>';
    212312                }
    213313
     314                echo '<div class="comment-form-comment tab-section" id="comment-form-comment">';
     315                wp_editor( $content, 'comment', array(
     316                                'media_buttons' => false,
     317                                'editor_css'    => self::get_editor_style(),
     318                                'textarea_name' => 'comment',
     319                                'textarea_rows' => 8,
     320                                'quicktags'     => array(
     321                                        'buttons' => 'strong,em,ul,ol,li'
     322                                ),
     323                                'teeny'         => true,
     324                                'tinymce'       => false,
     325                        ) );
     326                echo '</div>';
     327                return ob_get_clean();
     328        }
     329
     330        /**
     331         * Capture an {@see wp_editor()} instance as the 'User Contributed Notes' feedback form.
     332         *
     333         * Uses output buffering to capture the editor instance.
     334         *
     335         * @param WP_Comment|false $comment Comment object or false. Default false.
     336         * @param string           $display Display the editor. Default 'show'.
     337         * @param bool             $edit    True if the editor used for editing a note. Default false.
     338         * @return string HTML output for the wp_editor-ized feedback form.
     339         */
     340        public static function wp_editor_feedback( $comment, $display = 'show', $edit = false ) {
     341
     342                if ( ! ( isset( $comment->comment_ID ) && absint( $comment->comment_ID ) ) ) {
     343                        return '';
     344                }
     345
     346                $comment_id = absint( $comment->comment_ID );
     347
     348                static $instance = 0;
     349                $instance++;
     350
     351                $display       = ( 'hide' === $display ) ? ' style="display: none;"' : '';
     352                $parent        = $comment_id;
     353                $action        = site_url( '/wp-comments-post.php' );
     354                $title         = __( 'Add feedback to this note', 'wporg' );
     355                $button_text   = __( 'Add Feedback', 'wporg' );
     356                $post_id       = isset( $comment->comment_post_ID ) ? $comment->comment_post_ID : get_the_ID();
     357                $content       = '';
     358                $form_type     = '';
     359                $note_link     = '';
     360                $class         = '';
     361
     362                if ( $edit ) {
     363                        $content       = isset( $comment->comment_content ) ? $comment->comment_content : '';
     364                        $title         = __( 'Edit feedback', 'wporg' );
     365                        $form_type     = '-edit';
     366                        $button_text   = __( 'Edit Note', 'wporg' );
     367                        $post_url      = get_permalink( $post_id );
     368                        $action        = $post_url ? $post_url . '#comment-' . $comment_id : '';
     369                        $parent        = isset( $comment->comment_parent ) ? $comment->comment_parent : 0;
     370                        $parent_author = \DevHub\get_note_author( $parent );
     371                        $class         = ' edit-feedback-editor';
     372
     373                        if ( $parent && $post_url && $parent_author ) {
     374                                $post_url  = $post_url . '#comment-' . $parent;
     375                                $parent_note = sprintf( __( 'note %d', 'wporg' ), $parent );
     376
     377                                /* translators: 1: note, 2: note author name */
     378                                $note_link = sprintf( __( '%1$s by %2$s', 'wporg' ), "<a href='{$post_url}'>{$parent_note}</a>", $parent_author );
     379                        }
     380                }
     381
     382                $allowed_tags = '';
     383                foreach ( array( '<strong>', '<em>', '<code>', '<a>' ) as $tag ) {
     384                        $allowed_tags .= '<code>' . htmlentities( $tag ) . '</code>, ';
     385                }
     386
     387                ob_start();
     388                echo "<div id='feedback-editor-{$comment_id}' class='feedback-editor{$class}'{$display}>\n";
     389                if ( ! $edit ) {
     390                        echo "<p class='feedback-editor-title'>{$title}</p>\n";
     391                }
     392
     393                echo "<form id='feedback-form-{$instance}{$form_type}' class='feedback-form' method='post' action='{$action}' name='feedback-form-{$instance}'>\n";
     394                echo self::get_editor_rules( 'feedback', $note_link );
     395                wp_editor( $content, 'feedback-' . $instance, array(
     396                                'media_buttons' => false,
     397                                'textarea_name' => 'comment',
     398                                'textarea_rows' => 3,
     399                                'quicktags'     => array(
     400                                        'buttons' => 'strong,em'
     401                                ),
     402                                'editor_css'    => self::get_editor_style(),
     403                                'teeny'         => true,
     404                                'tinymce'       => false,
     405                        ) );
     406
     407                echo '<p><strong>' . __( 'Note', 'wporg' ) . '</strong>: ' . __( 'No newlines allowed', 'wporg' ) . '. ';
     408                printf( __( 'Allowed tags: %s', 'wporg' ), trim( $allowed_tags, ', ' ) ) . "</p>\n";
     409                echo "<p><input id='submit-{$instance}' class='submit' type='submit' value='{$button_text}' name='submit-{$instance}'>\n";
     410                echo "<input type='hidden' name='comment_post_ID' value='{$post_id}' id='comment_post_ID-{$instance}' />\n";
     411                echo "<input type='hidden' name='comment_parent' id='comment_parent-{$instance}' value='{$parent}' />\n";
     412
     413                if ( $edit ) {
     414                        echo self::get_edit_fields( $comment_id, $instance );
     415                }
     416
     417                echo "</p>\n</form>\n</div><!-- #feedback-editor-{$comment_id} -->\n";
     418                return ob_get_clean();
     419        }
     420
     421        /**
     422         * Get the rules list for the comment form.
     423         *
     424         * @param string $context   Accepts 'feedback' or empty sring.
     425         * @param string $note_link Link to parent note.
     426         * @return string Editor rules.
     427         */
     428        public static function get_editor_rules( $context = '', $note_link = '' ) {
     429                $license_rule = sprintf(
     430                        /* translators: 1: GFDL link */
     431                        __( '<strong>NOTE:</strong> All contributions are licensed under %s and are moderated before appearing on the site.', 'wporg' ),
     432                        '<a href="https://gnu.org/licenses/fdl.html">GFDL</a>'
     433                );
     434
     435                if ( 'feedback' === $context ) {
     436                        $feedback_rule = __( 'Use this form to report errors or to add additional information to this note.', 'wporg' );
     437                        if ( $note_link ) {
     438                                $feedback_rule = sprintf( __( 'Use this form to report errors or to add additional information to %s.', 'wporg' ), $note_link );
     439                        }
     440
     441                        return '<ul><li>'
     442                                . __( 'Feedback is part of the documentation.', 'wporg' ) . ' '
     443                                . $feedback_rule
     444                                . '</li><li>'
     445                                . __( 'This form is not for support requests, spam, bug reports, complaints, or self-promotion. Entries of this nature will be deleted.', 'wporg' )
     446                                . '</li><li class="user-notes-are-gpl">'
     447                                . $license_rule
     448                                . '</li></ul>';
     449                }
     450
     451                return '<ul><li>'
     452                        . __( 'This form is not for support requests, discussions, spam, bug reports, complaints, or self-promotion. Entries of this nature will be deleted.', 'wporg' )
     453                        . '</li><li>'
     454                        . __( 'In the editing area the Tab key enters a tab character. To move below this area by pressing Tab, press the Esc key followed by the Tab key. In some cases the Esc key will need to be pressed twice before the Tab key will allow you to continue.', 'wporg' )
     455                        . '</li><li class="user-notes-are-gpl">'
     456                        . $license_rule
     457                        . '</li></ul>';
     458        }
     459
     460        /**
     461         * Get the editor styles.
     462         *
     463         * @return string Editor styles.
     464         */
     465        public static function get_editor_style() {
    214466                $style = '<style type="text/css">';
    215467                ob_start();
    216468                include get_stylesheet_directory() . '/stylesheets/editor-style.css';
    217469                $style .= ob_get_clean();
    218                 $style .=' </style>';
    219 
    220                 echo '<div class="comment-form-comment tab-section" id="comment-form-comment">';
    221                 wp_editor( '', 'comment', array(
    222                         'media_buttons' => false,
    223                         'editor_css'    => $style,
    224                         'textarea_name' => 'comment',
    225                         'textarea_rows' => 8,
    226                         'quicktags'     => array(
    227                                 'buttons' => 'strong,em,ul,ol,li'
    228                         ),
    229                         'teeny'         => true,
    230                         'tinymce'       => false,
    231                 ) );
    232                 echo '</div>';
    233                 return ob_get_clean();
    234         }
    235 
    236         /**
    237          * Capture an {@see wp_editor()} instance as the 'User Contributed Notes' feedback form.
    238          *
    239          * Uses output buffering to capture the editor instance.
    240          *
    241          * @return string HTML output for the wp_editor-ized feedback form.
    242          */
    243         public static function wp_editor_feedback( $comment, $display = 'show', $content = '' ) {
    244 
    245                 if ( ! ( isset( $comment->comment_ID ) && absint( $comment->comment_ID ) ) ) {
    246                         return '';
    247                 }
    248 
    249                 $comment_id = absint( $comment->comment_ID );
    250 
    251                 static $instance = 0;
    252                 $instance++;
    253 
    254                 $display     = ( 'hide' === $display ) ? ' style="display: none;"' : '';
    255                 $title       = __( 'Add feedback to this note', 'wporg' );
    256                 $form_type   = '';
    257                 $button_text = __( 'Add Feedback', 'wporg' );
    258 
    259                 if ( $content ) {
    260                         $title       = __( 'Edit feedback', 'wporg' );
    261                         $form_type   = '-edit';
    262                         $button_text = __( 'Edit Feedback', 'wporg' );
    263                 }
    264 
    265                 $allowed_tags = '';
    266                 foreach ( array( '<strong>', '<em>', '<code>', '<a>' ) as $tag ) {
    267                         $allowed_tags .= '<code>' . htmlentities( $tag ) . '</code>, ';
    268                 }
    269 
    270                 ob_start();
    271                 echo "<div id='feedback-editor-{$comment_id}' class='feedback-editor'{$display}>\n";
    272                 echo "<p class='feedback-editor-title'>{$title}</p>\n";
    273                 echo '<form id="feedback-form-' . $instance . $form_type . '" class="feedback-form" method="post" action="' . site_url( '/wp-comments-post.php' ) . '" name="feedback-form-' . $instance ."\">\n";
    274 
    275                 wp_editor( '', 'feedback-' . $instance, array(
    276                         'media_buttons' => false,
    277                         'textarea_name' => 'comment',
    278                         'textarea_rows' => 3,
    279                         'quicktags'     => array(
    280                                 'buttons' => 'strong,em'
    281                         ),
    282                         'teeny'         => true,
    283                         'tinymce'       => false,
    284                 ) );
    285 
    286                 echo '<p><strong>' . __( 'Note', 'wporg' ) . '</strong>: ' . __( 'No newlines allowed', 'wporg' ) . '. ';
    287                 printf( __( 'Allowed tags: %s', 'wporg' ), trim( $allowed_tags, ', ' ) ) . "</p>\n";
    288                 echo "<p><input id='submit-{$instance}' class='submit' type='submit' value='Add Feedback' name='submit-{$instance}'>\n";
    289                 echo "<input type='hidden' name='comment_post_ID' value='" . get_the_ID() . "' id='comment_post_ID-{$instance}' />\n";
    290                 echo "<input type='hidden' name='comment_parent' id='comment_parent-{$instance}' value='{$comment_id}' />\n";
    291                 echo "</p>\n</form>\n</div><!-- #feedback-editor-{$comment_id} -->\n";
    292                 return ob_get_clean();
     470                $style .= ' </style>';
     471                return $style;
     472        }
     473
     474        /**
     475         * Get the hidden input fields HTML used for editing a note.
     476         *
     477         * @param int     $comment_id Comment ID.
     478         * @param integer $instance   Comment form instance number used in HTML id's.
     479         * @return string Hidden input fields HTML.
     480         */
     481        public static function get_edit_fields( $comment_id, $instance = 0 ) {
     482                $fields = "<input type='hidden' name='comment_ID' id='comment_ID-{$instance}' value='{$comment_id}' />\n";
     483                $fields .= "<input type='hidden' name='update_user_note' id='update_user_note-{$instance}' value='1' />\n";
     484                $fields .= wp_nonce_field( 'update_user_note_' . $comment_id, '_wpnonce', true, false );
     485
     486                return $fields;
    293487        }
    294488
Note: See TracChangeset for help on using the changeset viewer.