Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 4
CRAP
n/a
0 / 0
append_wpcom_media_url_upload
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
enqueue_wpcom_media_url_upload_form
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
12
wpcom_handle_media_url_upload
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
42
load_wpcom_media_url_upload_form
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2/**
3 * Allows uploading media from URL in Media Library.
4 *
5 * @package automattic/jetpack-mu-wpcom
6 */
7
8/**
9 * Appends the wpcom media URL upload form.
10 */
11function append_wpcom_media_url_upload() {
12    ?>
13    <div id="wpcom-media-url-upload"></div>
14    <?php
15}
16
17/**
18 * Enqueue the assets of the wpcom media URL upload form
19 */
20function enqueue_wpcom_media_url_upload_form() {
21    global $pagenow;
22
23    $handle = jetpack_mu_wpcom_enqueue_assets( 'wpcom-media-url-upload', array( 'js', 'css' ) );
24
25    $page = 'editor';
26    if ( $pagenow === 'upload.php' ) {
27        $page = 'media-library';
28    } elseif ( $pagenow === 'media-new.php' ) {
29        $page = 'media-new';
30    }
31
32    $data = wp_json_encode(
33        array(
34            'ajaxUrl' => admin_url( 'admin-ajax.php' ),
35            'action'  => 'wpcom_media_url_upload',
36            'nonce'   => wp_create_nonce( 'wpcom_media_url_upload' ),
37            'page'    => $page,
38        ),
39        JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP
40    );
41
42    wp_add_inline_script(
43        $handle,
44        "window.JETPACK_MU_WPCOM_MEDIA_URL_UPLOAD = $data;",
45        'before'
46    );
47}
48
49/**
50 * AJAX handler for the wpcom media URL upload.
51 */
52function wpcom_handle_media_url_upload() {
53    check_ajax_referer( 'wpcom_media_url_upload' );
54
55    if ( ! isset( $_POST['url'] ) ) {
56        return;
57    }
58
59    $url = esc_url_raw( wp_unslash( $_POST['url'] ) );
60
61    $tmp_file = download_url( $url );
62    if ( is_wp_error( $tmp_file ) ) {
63        // @phan-suppress-next-line PhanTypeMismatchArgumentProbablyReal -- It takes null, but its phpdoc only says int.
64        return wp_send_json_error( $tmp_file, null, JSON_UNESCAPED_SLASHES );
65    }
66
67    if ( is_multisite() ) {
68        add_filter( 'wp_handle_sideload_prefilter', 'check_upload_size' );
69    }
70
71    $attachment_id = media_handle_sideload(
72        array(
73            'name'     => basename( wp_parse_url( $url, PHP_URL_PATH ) ),
74            'tmp_name' => $tmp_file,
75        )
76    );
77
78    if ( file_exists( $tmp_file ) ) {
79        wp_delete_file( $tmp_file );
80    }
81
82    if ( is_wp_error( $attachment_id ) ) {
83        // @phan-suppress-next-line PhanTypeMismatchArgumentProbablyReal -- It takes null, but its phpdoc only says int.
84        return wp_send_json_error( $attachment_id, null, JSON_UNESCAPED_SLASHES );
85    } else {
86        // @phan-suppress-next-line PhanTypeMismatchArgumentProbablyReal -- It takes null, but its phpdoc only says int.
87        return wp_send_json_success( array( 'attachment_id' => $attachment_id ), null, JSON_UNESCAPED_SLASHES );
88    }
89}
90
91/**
92 * Load the wpcom media URL upload form.
93 */
94function load_wpcom_media_url_upload_form() {
95    if ( ! is_admin() || ! current_user_can( 'upload_files' ) ) {
96        return;
97    }
98
99    add_action( 'wp_ajax_wpcom_media_url_upload', 'wpcom_handle_media_url_upload' );
100
101    global $pagenow;
102    if ( $pagenow !== 'media-new.php' ) {
103        add_action( 'pre-upload-ui', 'append_wpcom_media_url_upload', 9 );
104    }
105
106    add_action( 'post-plupload-upload-ui', 'enqueue_wpcom_media_url_upload_form' );
107}
108load_wpcom_media_url_upload_form();