Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 102
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Jetpack_Network_Sites_List_Table
0.00% covered (danger)
0.00%
0 / 98
0.00% covered (danger)
0.00%
0 / 8
342
0.00% covered (danger)
0.00%
0 / 1
 get_columns
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 prepare_items
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
6
 column_blogname
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
2
 column_blog_path
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 column_connected
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
30
 get_bulk_actions
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 column_cb
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 process_bulk_action
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
42
1<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2/**
3 * Jetpack network sites list table.
4 *
5 * @package automattic/jetpack
6 */
7
8if ( ! defined( 'ABSPATH' ) ) {
9    exit( 0 );
10}
11
12if ( ! class_exists( 'WP_List_Table' ) ) {
13    require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
14}
15
16/**
17 * Jetpack network sites list table.
18 */
19class Jetpack_Network_Sites_List_Table extends WP_List_Table {
20
21    /**
22     * Get columns.
23     *
24     * @return array name => header HTML.
25     */
26    public function get_columns() {
27        // site name, status, username connected under.
28        $columns = array(
29            'cb'        => '<input type="checkbox" />',
30            'blogname'  => __( 'Site Name', 'jetpack' ),
31            'blog_path' => __( 'Path', 'jetpack' ),
32            'connected' => __( 'Connected', 'jetpack' ),
33        );
34
35        return $columns;
36    }
37
38    /**
39     * Prepare items.
40     */
41    public function prepare_items() {
42        // Make sure Jetpack_Network is initialized.
43        Jetpack_Network::init();
44
45        // Deal with bulk actions if any were requested by the user.
46        $this->process_bulk_action();
47
48        $sites = get_sites(
49            array(
50                'site__not_in' => array( get_current_blog_id() ),
51                'archived'     => false,
52                'number'       => 0,
53                'network_id'   => get_current_network_id(),
54            )
55        );
56
57        // Setup pagination.
58        $per_page     = 25;
59        $current_page = $this->get_pagenum();
60        $total_items  = is_countable( $sites ) ? count( $sites ) : 0;
61        $sites        = array_slice( $sites, ( ( $current_page - 1 ) * $per_page ), $per_page );
62        $this->set_pagination_args(
63            array(
64                'total_items' => $total_items,
65                'per_page'    => $per_page,
66            )
67        );
68
69        $columns               = $this->get_columns();
70        $hidden                = array();
71        $sortable              = array();
72        $this->_column_headers = array( $columns, $hidden, $sortable );
73        $this->items           = $sites;
74    }
75
76    /**
77     * Column blogname.
78     *
79     * @param object|array $item Item.
80     * @return string HTML.
81     */
82    public function column_blogname( $item ) {
83        // <http://jpms/wp-admin/network/site-info.php?id=1>.
84        switch_to_blog( $item->blog_id );
85        $jp_url = admin_url( 'admin.php?page=jetpack' );
86        restore_current_blog();
87
88        $actions = array(
89            'edit'                      => '<a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $item->blog_id ) ) . '">' . esc_html__( 'Edit', 'jetpack' ) . '</a>',
90            'dashboard'                 => '<a href="' . esc_url( get_admin_url( $item->blog_id, '', 'admin' ) ) . '">' . esc_html__( 'Dashboard', 'jetpack' ) . '</a>',
91            'view'                      => '<a href="' . esc_url( get_site_url( $item->blog_id, '', 'admin' ) ) . '">' . esc_html__( 'View', 'jetpack' ) . '</a>',
92            'jetpack-' . $item->blog_id => '<a href="' . esc_url( $jp_url ) . '">Jetpack</a>',
93        );
94
95        return sprintf( '%1$s %2$s', '<strong>' . get_blog_option( $item->blog_id, 'blogname' ) . '</strong>', $this->row_actions( $actions ) );
96    }
97
98    /**
99     * Column blog path.
100     *
101     * @param object|array $item Item.
102     * @return string HTML.
103     */
104    public function column_blog_path( $item ) {
105        return '<a href="' .
106            get_site_url( $item->blog_id, '', 'admin' ) .
107            '">' .
108            str_replace( array( 'http://', 'https://' ), '', get_site_url( $item->blog_id, '', 'admin' ) ) .
109            '</a>';
110    }
111
112    /**
113     * Column connected.
114     *
115     * @param object|array $item Item.
116     * @return string HTML.
117     */
118    public function column_connected( $item ) {
119        $jpms = Jetpack_Network::init();
120        $jp   = Jetpack::init();
121
122        switch_to_blog( $item->blog_id );
123
124        // Checks for both the stock version of Jetpack and the one managed by the Jetpack Beta Plugin.
125        if ( ! is_plugin_active( 'jetpack/jetpack.php' ) && ! is_plugin_active( 'jetpack-dev/jetpack.php' ) && ! array_key_exists( 'jetpack.php', get_mu_plugins() ) ) {
126            $title  = __( 'Jetpack is not active on this site.', 'jetpack' );
127            $action = array(
128                'manage-plugins' => '<a href="' . get_admin_url( $item->blog_id, 'plugins.php', 'admin' ) . '">' . __( 'Manage Plugins', 'jetpack' ) . '</a>',
129            );
130            restore_current_blog();
131            return sprintf( '%1$s %2$s', $title, $this->row_actions( $action ) );
132        }
133
134        if ( $jp->is_connection_ready() ) {
135            // Build url for disconnecting.
136            $url = $jpms->get_url(
137                array(
138                    'name'    => 'subsitedisconnect',
139                    'site_id' => $item->blog_id,
140
141                )
142            );
143            restore_current_blog();
144            return '<a href="' . wp_nonce_url( $url, 'jetpack-subsite-disconnect' ) . '">' . esc_html__( 'Disconnect', 'jetpack' ) . '</a>';
145        }
146        restore_current_blog();
147
148        // Build URL for connecting.
149        $url = $jpms->get_url(
150            array(
151                'name'    => 'subsiteregister',
152                'site_id' => $item->blog_id,
153            )
154        );
155        return '<a href="' . wp_nonce_url( $url, 'jetpack-subsite-register' ) . '">' . esc_html__( 'Connect', 'jetpack' ) . '</a>';
156    }
157
158    /**
159     * Get bulk actions.
160     *
161     * @return array Code => HTML.
162     */
163    public function get_bulk_actions() {
164        $actions = array(
165            'connect'    => esc_html__( 'Connect', 'jetpack' ),
166            'disconnect' => esc_html__( 'Disconnect', 'jetpack' ),
167        );
168
169        return $actions;
170    }
171
172    /**
173     * Column checkbox.
174     *
175     * @param object|array $item Item.
176     * @return string HTML.
177     */
178    public function column_cb( $item ) {
179            return sprintf(
180                '<input type="checkbox" name="bulk[]" value="%s" />',
181                $item->blog_id
182            );
183    }
184
185    /**
186     * Process bulk actions.
187     */
188    public function process_bulk_action() {
189        // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Check if we have anything to do before checking the nonce.
190        if ( empty( $_POST['bulk'] ) ) {
191            return; // Thou shall not pass! There is nothing to do.
192        }
193
194        check_admin_referer( 'bulk-toplevel_page_jetpack-network' );
195
196        $jpms = Jetpack_Network::init();
197
198        $action = $this->current_action();
199        switch ( $action ) {
200
201            case 'connect':
202                $bulk = wp_unslash( $_POST['bulk'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
203                foreach ( $bulk as $site ) {
204                    $jpms->do_subsiteregister( $site );
205                }
206                break;
207            case 'disconnect':
208                $bulk = wp_unslash( $_POST['bulk'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
209                foreach ( $bulk as $site ) {
210                    $jpms->do_subsitedisconnect( $site );
211                }
212                break;
213        }
214    }
215} // end h