Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
Comment
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 2
156
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 create_item
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 1
132
1<?php
2/**
3 * Comments REST route
4 *
5 * @package automattic/jetpack-import
6 */
7
8namespace Automattic\Jetpack\Import\Endpoints;
9
10use WP_Error;
11use WP_REST_Request;
12use WP_REST_Response;
13
14if ( ! defined( 'ABSPATH' ) ) {
15    exit( 0 );
16}
17
18/**
19 * Class Comment
20 */
21class Comment extends \WP_REST_Comments_Controller {
22
23    /**
24     * Base class
25     */
26    use Import;
27
28    /**
29     * The Import ID add a new item to the schema.
30     */
31    use Import_ID;
32
33    /**
34     * Whether the controller supports batching.
35     *
36     * @var array
37     */
38    protected $allow_batch = array( 'v1' => true );
39
40    /**
41     * Constructor.
42     */
43    public function __construct() {
44        parent::__construct();
45
46        // @see add_comment_meta
47        $this->import_id_meta_type = 'comment';
48    }
49
50    /**
51     * Creates a comment.
52     *
53     * @param WP_REST_Request $request Full details about the request.
54     * @return WP_REST_Response|WP_Error Response object on success, or error object on failure.
55     */
56    public function create_item( $request ) {
57        // Set the WP_IMPORTING constant to prevent sync notifications
58        $this->set_importing();
59        // Resolve comment post ID.
60        if ( ! empty( $request['post'] ) ) {
61            $posts = \get_posts( $this->get_import_db_query( $request['post'] ) );
62
63            // Overwrite the comment parent post ID.
64            $request['post'] = is_array( $posts ) && count( $posts ) ? $posts[0] : 0;
65        }
66
67        // Resolve comment parent ID.
68        if ( ! empty( $request['parent'] ) ) {
69            $comments = \get_comments( $this->get_import_db_query( $request['parent'] ) );
70
71            // Overwrite the comment parent post ID.
72            $request['parent'] = is_array( $comments ) && count( $comments ) ? $comments[0] : 0;
73        }
74
75        $duplicated_id = null;
76
77        /**
78         * Core comment creation function doesn't return the duplicated comment ID.
79         * Add a filter to get the ID.
80         *
81         * phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
82         */
83        $get_id_func = function ( $dupe_id, $commentdata ) use ( &$duplicated_id ) {
84            if ( $dupe_id !== null ) {
85                $duplicated_id = $dupe_id;
86            }
87
88            return $dupe_id;
89        };
90
91        // Add the filter.
92        \add_filter( 'duplicate_comment_id', $get_id_func, 10, 2 );
93
94        $response = parent::create_item( $request );
95
96        // Check if the comment is duplicated.
97        if (
98            $duplicated_id !== null &&
99            is_wp_error( $response ) &&
100            $response->get_error_code() === 'comment_duplicate' ) {
101            $data = $response->get_error_data( 'comment_duplicate' );
102
103            // Add the comment ID.
104            $data['comment_id'] = $duplicated_id;
105
106            $response->add_data( $data );
107        }
108
109        // Remove the filter.
110        \remove_filter( 'duplicate_comment_id', $get_id_func );
111
112        return $this->add_import_id_metadata( $request, $response );
113    }
114}