| | 2553 | |
| | 2554 | /** |
| | 2555 | * Handles the submission of a comment, usually posted to wp-comments-post.php via a comment form. |
| | 2556 | * |
| | 2557 | * @param array $comment_data { |
| | 2558 | * Comment data. |
| | 2559 | * |
| | 2560 | * @type string|int $comment_post_ID The ID of the post that relates to the comment. |
| | 2561 | * @type string $author The name of the comment author. |
| | 2562 | * @type string $email The comment author email address. |
| | 2563 | * @type string $url The comment author URL. |
| | 2564 | * @type string $comment The content of the comment. |
| | 2565 | * @type string|int $comment_parent The ID of this comment's parent, if any. Default 0. |
| | 2566 | * @type string $_wp_unfiltered_html_comment The nonce value for allowing unfiltered HTML. |
| | 2567 | * } |
| | 2568 | * @return WP_Comment|WP_Error A WP_Comment object on success, a WP_Error object on failure. |
| | 2569 | */ |
| | 2570 | function wp_handle_comment_post( $comment_data ) { |
| | 2571 | |
| | 2572 | $comment_post_ID = isset( $comment_data['comment_post_ID'] ) |
| | 2573 | ? (int) $comment_data['comment_post_ID'] |
| | 2574 | : 0; |
| | 2575 | $comment_author = ( isset( $comment_data['author'] ) && is_string( $comment_data['author'] ) ) |
| | 2576 | ? trim( strip_tags( $comment_data['author'] ) ) |
| | 2577 | : null; |
| | 2578 | $comment_author_email = ( isset( $comment_data['email'] ) && is_email( $comment_data['email'] ) ) |
| | 2579 | ? trim( $comment_data['email'] ) |
| | 2580 | : null; |
| | 2581 | $comment_author_url = ( isset( $comment_data['url'] ) && is_string( $comment_data['url'] ) ) |
| | 2582 | ? trim( $comment_data['url'] ) |
| | 2583 | : null; |
| | 2584 | $comment_content = ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) |
| | 2585 | ? trim( $comment_data['comment'] ) |
| | 2586 | : null; |
| | 2587 | $comment_parent = isset( $comment_data['comment_parent'] ) |
| | 2588 | ? absint( $comment_data['comment_parent'] ) |
| | 2589 | : 0; |
| | 2590 | $_wp_unfiltered_html_comment = ( isset( $comment_data['_wp_unfiltered_html_comment'] ) && is_string( $comment_data['_wp_unfiltered_html_comment'] ) ) |
| | 2591 | ? trim( $comment_data['_wp_unfiltered_html_comment'] ) |
| | 2592 | : null; |
| | 2593 | |
| | 2594 | $post = get_post( $comment_post_ID ); |
| | 2595 | |
| | 2596 | if ( empty( $post->comment_status ) ) { |
| | 2597 | |
| | 2598 | /** |
| | 2599 | * Fires when a comment is attempted on a post that does not exist. |
| | 2600 | * |
| | 2601 | * @since 1.5.0 |
| | 2602 | * |
| | 2603 | * @param int $comment_post_ID Post ID. |
| | 2604 | */ |
| | 2605 | do_action( 'comment_id_not_found', $comment_post_ID ); |
| | 2606 | |
| | 2607 | return new WP_Error( 'comment_id_not_found' ); |
| | 2608 | |
| | 2609 | } |
| | 2610 | |
| | 2611 | // get_post_status() will get the parent status for attachments. |
| | 2612 | $status = get_post_status( $post ); |
| | 2613 | |
| | 2614 | $status_obj = get_post_status_object( $status ); |
| | 2615 | |
| | 2616 | if ( ! comments_open( $comment_post_ID ) ) { |
| | 2617 | |
| | 2618 | /** |
| | 2619 | * Fires when a comment is attempted on a post that has comments closed. |
| | 2620 | * |
| | 2621 | * @since 1.5.0 |
| | 2622 | * |
| | 2623 | * @param int $comment_post_ID Post ID. |
| | 2624 | */ |
| | 2625 | do_action( 'comment_closed', $comment_post_ID ); |
| | 2626 | |
| | 2627 | return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 ); |
| | 2628 | |
| | 2629 | } elseif ( 'trash' == $status ) { |
| | 2630 | |
| | 2631 | /** |
| | 2632 | * Fires when a comment is attempted on a trashed post. |
| | 2633 | * |
| | 2634 | * @since 2.9.0 |
| | 2635 | * |
| | 2636 | * @param int $comment_post_ID Post ID. |
| | 2637 | */ |
| | 2638 | do_action( 'comment_on_trash', $comment_post_ID ); |
| | 2639 | |
| | 2640 | return new WP_Error( 'comment_on_trash' ); |
| | 2641 | |
| | 2642 | } elseif ( ! $status_obj->public && ! $status_obj->private ) { |
| | 2643 | |
| | 2644 | /** |
| | 2645 | * Fires when a comment is attempted on a post in draft mode. |
| | 2646 | * |
| | 2647 | * @since 1.5.1 |
| | 2648 | * |
| | 2649 | * @param int $comment_post_ID Post ID. |
| | 2650 | */ |
| | 2651 | do_action( 'comment_on_draft', $comment_post_ID ); |
| | 2652 | |
| | 2653 | return new WP_Error( 'comment_on_draft' ); |
| | 2654 | |
| | 2655 | } elseif ( post_password_required( $comment_post_ID ) ) { |
| | 2656 | |
| | 2657 | /** |
| | 2658 | * Fires when a comment is attempted on a password-protected post. |
| | 2659 | * |
| | 2660 | * @since 2.9.0 |
| | 2661 | * |
| | 2662 | * @param int $comment_post_ID Post ID. |
| | 2663 | */ |
| | 2664 | do_action( 'comment_on_password_protected', $comment_post_ID ); |
| | 2665 | |
| | 2666 | return new WP_Error( 'comment_on_password_protected' ); |
| | 2667 | |
| | 2668 | } else { |
| | 2669 | |
| | 2670 | /** |
| | 2671 | * Fires before a comment is posted. |
| | 2672 | * |
| | 2673 | * @since 2.8.0 |
| | 2674 | * |
| | 2675 | * @param int $comment_post_ID Post ID. |
| | 2676 | */ |
| | 2677 | do_action( 'pre_comment_on_post', $comment_post_ID ); |
| | 2678 | |
| | 2679 | } |
| | 2680 | |
| | 2681 | // If the user is logged in |
| | 2682 | $user = wp_get_current_user(); |
| | 2683 | if ( $user->exists() ) { |
| | 2684 | if ( empty( $user->display_name ) ) { |
| | 2685 | $user->display_name=$user->user_login; |
| | 2686 | } |
| | 2687 | $comment_author = $user->display_name; |
| | 2688 | $comment_author_email = $user->user_email; |
| | 2689 | $comment_author_url = $user->user_url; |
| | 2690 | if ( current_user_can( 'unfiltered_html' ) ) { |
| | 2691 | if ( ! isset( $comment_data['_wp_unfiltered_html_comment'] ) |
| | 2692 | || ! wp_verify_nonce( $comment_data['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_ID ) |
| | 2693 | ) { |
| | 2694 | kses_remove_filters(); // start with a clean slate |
| | 2695 | kses_init_filters(); // set up the filters |
| | 2696 | } |
| | 2697 | } |
| | 2698 | } else { |
| | 2699 | if ( get_option( 'comment_registration' ) || 'private' == $status ) { |
| | 2700 | return new WP_Error( 'not_logged_in', __( 'Sorry, you must be logged in to post a comment.' ), 403 ); |
| | 2701 | } |
| | 2702 | } |
| | 2703 | |
| | 2704 | $comment_type = ''; |
| | 2705 | |
| | 2706 | if ( get_option( 'require_name_email' ) && ! $user->exists() ) { |
| | 2707 | if ( 6 > strlen( $comment_author_email ) || '' == $comment_author ) { |
| | 2708 | return new WP_Error( 'require_name_email', __( '<strong>ERROR</strong>: please fill the required fields (name, email).' ), 200 ); |
| | 2709 | } elseif ( ! is_email( $comment_author_email ) ) { |
| | 2710 | return new WP_Error( 'require_valid_email', __( '<strong>ERROR</strong>: please enter a valid email address.' ), 200 ); |
| | 2711 | } |
| | 2712 | } |
| | 2713 | |
| | 2714 | if ( '' == $comment_content ) { |
| | 2715 | return new WP_Error( 'require_valid_comment', __( '<strong>ERROR</strong>: please type a comment.' ), 200 ); |
| | 2716 | } |
| | 2717 | |
| | 2718 | $commentdata = compact( |
| | 2719 | 'comment_post_ID', |
| | 2720 | 'comment_author', |
| | 2721 | 'comment_author_email', |
| | 2722 | 'comment_author_url', |
| | 2723 | 'comment_content', |
| | 2724 | 'comment_type', |
| | 2725 | 'comment_parent', |
| | 2726 | 'user_ID' |
| | 2727 | ); |
| | 2728 | |
| | 2729 | $comment_id = wp_new_comment( wp_slash( $commentdata ) ); |
| | 2730 | if ( ! $comment_id ) { |
| | 2731 | return new WP_Error( 'comment_save_error', __( '<strong>ERROR</strong>: The comment could not be saved. Please try again later.' ), 500 ); |
| | 2732 | } |
| | 2733 | |
| | 2734 | return get_comment( $comment_id ); |
| | 2735 | |
| | 2736 | } |