Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
20.63% covered (danger)
20.63%
13 / 63
25.00% covered (danger)
25.00%
2 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Publicize_Setup
20.63% covered (danger)
20.63%
13 / 63
25.00% covered (danger)
25.00%
2 / 8
449.42
0.00% covered (danger)
0.00%
0 / 1
 configure
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 should_load
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 pre_initialization
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
20
 on_jetpack_feature_publicize_enabled
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
90
 add_filters_and_actions_for_screen
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
4
 maybe_add_share_action
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 add_share_action
33.33% covered (danger)
33.33%
3 / 9
0.00% covered (danger)
0.00%
0 / 1
5.67
 get_blog_id
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2/**
3 * Main Publicize class.
4 *
5 * @package automattic/jetpack
6 */
7
8namespace Automattic\Jetpack\Publicize;
9
10use Automattic\Jetpack\Current_Plan;
11use Automattic\Jetpack\Status;
12use Automattic\Jetpack\Status\Host;
13
14/**
15 * The class to configure and initialize the publicize package.
16 */
17class Publicize_Setup {
18
19    /**
20     * Whether to update the plan information from WPCOM when initialising the package.
21     *
22     * @var bool
23     */
24    public static $refresh_plan_info = false;
25
26    /**
27     * Whether the class has been initialized.
28     *
29     * @var bool
30     */
31    public static $initialized = false;
32
33    /**
34     * To configure the publicize package, when called via the Config package.
35     */
36    public static function configure() {
37        add_action( 'jetpack_feature_publicize_enabled', array( __CLASS__, 'on_jetpack_feature_publicize_enabled' ) );
38    }
39
40    /**
41     * Whether to load the Publicize module.
42     *
43     * @return bool
44     */
45    private static function should_load() {
46
47        /**
48         * We do not want to load Publicize on WPCOM private sites.
49         */
50        $is_wpcom_platform_private_site = ( new Host() )->is_wpcom_platform() && ( new Status() )->is_private_site();
51
52        $should_load = ! $is_wpcom_platform_private_site;
53
54        /**
55         * Filters the flag to decide whether to load the Publicize module.
56         *
57         * @since 0.64.0
58         *
59         * @param bool $should_load Whether to load the Publicize module.
60         */
61        return (bool) apply_filters( 'jetpack_publicize_should_load', $should_load );
62    }
63
64    /**
65     * Initialization of publicize logic that should always be loaded,
66     * regardless of whether Publicize is enabled or not.
67     *
68     * You should justify everyting that is done here, as it will be loaded on every pageload.
69     */
70    public static function pre_initialization() {
71        if ( ! self::should_load() ) {
72            return;
73        }
74
75        $is_wpcom_simple = ( new Host() )->is_wpcom_simple();
76
77        /**
78         * Assets are to be loaded in all cases.
79         *
80         * To allow loading of admin page and
81         * the editor placeholder when publicize is OFF.
82         */
83        Publicize_Assets::configure();
84
85        /**
86         * Social admin page is to be always registered.
87         */
88        Social_Admin_Page::init();
89
90        /**
91         * The connect popup (auth_flow=v2) is redirected back to a same-origin admin-post
92         * endpoint that broadcasts the result to the opener, so it must always be available.
93         */
94        Keyring_Result_Handler::init();
95
96        if ( ! $is_wpcom_simple ) {
97            /**
98             * We need this only on Jetpack sites for Google Site auto-verification.
99             */
100            add_action( 'init', array( Keyring_Helper::class, 'init' ), 9 );
101        }
102
103        if ( $is_wpcom_simple ) {
104            /**
105             * Publicize is always enabled on WPCOM,
106             * we can call the initialization method directly.
107             */
108            add_action( 'plugins_loaded', array( self::class, 'on_jetpack_feature_publicize_enabled' ) );
109        }
110    }
111
112    /**
113     * To configure the publicize package, when called via the Config package.
114     */
115    public static function on_jetpack_feature_publicize_enabled() {
116        if ( self::$initialized || ! self::should_load() ) {
117            return;
118        }
119
120        self::$initialized = true;
121
122        $is_wpcom_simple = ( new Host() )->is_wpcom_simple();
123
124        global $publicize;
125        /**
126         * If publicize is not initialzed on WPCOM,
127         * it means that we are either on a public facing page
128         * or a page where Publicize is not needed.
129         * So, we will skip the whole set up here.
130         */
131        if ( $is_wpcom_simple && ! $publicize ) {
132            return;
133        }
134
135        global $publicize_ui;
136
137        if ( ! isset( $publicize_ui ) ) {
138            $publicize_ui = new Publicize_UI();
139        }
140
141        $rest_controllers = array(
142            REST_API\Connections_Controller::class,
143            REST_API\Connections_Post_Field::class,
144            REST_API\Keyring_Result_Controller::class,
145            REST_API\Scheduled_Actions_Controller::class,
146            REST_API\Services_Controller::class,
147            REST_API\Share_Post_Controller::class,
148            REST_API\Share_Status_Controller::class,
149            REST_API\Social_Image_Generator_Controller::class,
150            REST_API\Render_Messages_Controller::class,
151            REST_API\Message_Templates_Placeholders_Controller::class,
152            Jetpack_Social_Settings\Settings::class,
153        );
154
155        // Load the REST controllers.
156        foreach ( $rest_controllers as $controller ) {
157            if ( $is_wpcom_simple ) {
158                wpcom_rest_api_v2_load_plugin( $controller );
159            } else {
160                new $controller();
161            }
162        }
163
164        add_action( 'current_screen', array( self::class, 'add_filters_and_actions_for_screen' ), 5 );
165
166        ( new Social_Image_Generator\Setup() )->init();
167
168        // Things that should not happen on WPCOM.
169        if ( ! $is_wpcom_simple ) {
170            add_action( 'rest_api_init', array( REST_Controller::class, 'register' ) );
171        }
172    }
173
174    /**
175     * If the current_screen has 'edit' as the base, add filter to change the post list tables.
176     *
177     * @param object $current_screen The current screen.
178     */
179    public static function add_filters_and_actions_for_screen( $current_screen ) {
180        if ( 'edit' !== $current_screen->base ) {
181            return;
182        }
183
184        /**
185         * Filter to enable/disable the Share action on the post list screen.
186         *
187         * The Share action allows users to reshare published posts via Jetpack Social.
188         * It is automatically enabled for plans that support the 'republicize' feature,
189         * but can be disabled via this filter.
190         *
191         * @since 0.2.0 Originally in jetpack-post-list package.
192         * @since $$NEXT_VERSION$$ Moved to jetpack-publicize package.
193         *
194         * @param bool   $show_share Whether to show the share action. Default true.
195         * @param string $post_type  The current post type.
196         */
197        $show_share_action = Current_Plan::supports( 'republicize' )
198            && apply_filters( 'jetpack_post_list_display_share_action', true, $current_screen->post_type );
199
200        if ( $show_share_action ) {
201            self::maybe_add_share_action( $current_screen->post_type );
202        }
203    }
204
205    /**
206     * Add the Share action for post types that support publicize.
207     *
208     * @param string $post_type The post type.
209     */
210    public static function maybe_add_share_action( $post_type ) {
211        if (
212            post_type_supports( $post_type, 'publicize' ) &&
213            use_block_editor_for_post_type( $post_type )
214        ) {
215            add_filter( 'post_row_actions', array( self::class, 'add_share_action' ), 20, 2 );
216            add_filter( 'page_row_actions', array( self::class, 'add_share_action' ), 20, 2 );
217        }
218    }
219
220    /**
221     * Add the Share action link to the post row actions.
222     *
223     * @param array    $post_actions The current post actions.
224     * @param \WP_Post $post The post object.
225     * @return array Modified post actions.
226     */
227    public static function add_share_action( $post_actions, $post ) {
228        $edit_url = get_edit_post_link( $post->ID, 'raw' );
229        if ( ! $edit_url || 'publish' !== $post->post_status ) {
230            return $post_actions;
231        }
232
233        $url   = add_query_arg( 'jetpack-editor-action', 'share_post', $edit_url );
234        $text  = _x( 'Share', 'Share the post on social networks', 'jetpack-publicize-pkg' );
235        $title = _draft_or_post_title( $post );
236        /* translators: post title */
237        $label                 = sprintf( __( 'Share "%s" via Jetpack Social', 'jetpack-publicize-pkg' ), $title );
238        $post_actions['share'] = sprintf( '<a href="%s" aria-label="%s">%s</a>', esc_url( $url ), esc_attr( $label ), esc_html( $text ) );
239
240        return $post_actions;
241    }
242
243    /**
244     * Retrieves the blog ID based on the environment we're running in.
245     *
246     * @return int The WPCOM blog ID.
247     */
248    public static function get_blog_id() {
249        return defined( 'IS_WPCOM' ) && IS_WPCOM ? get_current_blog_id() : \Jetpack_Options::get_option( 'id' );
250    }
251}