Making WordPress.org


Ignore:
Timestamp:
10/19/2018 10:56:22 PM (6 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.