Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
21.31% covered (danger)
21.31%
13 / 61
25.00% covered (danger)
25.00%
2 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Publicize_Setup
21.31% covered (danger)
21.31%
13 / 61
25.00% covered (danger)
25.00%
2 / 8
409.99
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 / 27
0.00% covered (danger)
0.00%
0 / 1
72
 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
169    /**
170     * If the current_screen has 'edit' as the base, add filter to change the post list tables.
171     *
172     * @param object $current_screen The current screen.
173     */
174    public static function add_filters_and_actions_for_screen( $current_screen ) {
175        if ( 'edit' !== $current_screen->base ) {
176            return;
177        }
178
179        /**
180         * Filter to enable/disable the Share action on the post list screen.
181         *
182         * The Share action allows users to reshare published posts via Jetpack Social.
183         * It is automatically enabled for plans that support the 'republicize' feature,
184         * but can be disabled via this filter.
185         *
186         * @since 0.2.0 Originally in jetpack-post-list package.
187         * @since $$NEXT_VERSION$$ Moved to jetpack-publicize package.
188         *
189         * @param bool   $show_share Whether to show the share action. Default true.
190         * @param string $post_type  The current post type.
191         */
192        $show_share_action = Current_Plan::supports( 'republicize' )
193            && apply_filters( 'jetpack_post_list_display_share_action', true, $current_screen->post_type );
194
195        if ( $show_share_action ) {
196            self::maybe_add_share_action( $current_screen->post_type );
197        }
198    }
199
200    /**
201     * Add the Share action for post types that support publicize.
202     *
203     * @param string $post_type The post type.
204     */
205    public static function maybe_add_share_action( $post_type ) {
206        if (
207            post_type_supports( $post_type, 'publicize' ) &&
208            use_block_editor_for_post_type( $post_type )
209        ) {
210            add_filter( 'post_row_actions', array( self::class, 'add_share_action' ), 20, 2 );
211            add_filter( 'page_row_actions', array( self::class, 'add_share_action' ), 20, 2 );
212        }
213    }
214
215    /**
216     * Add the Share action link to the post row actions.
217     *
218     * @param array    $post_actions The current post actions.
219     * @param \WP_Post $post The post object.
220     * @return array Modified post actions.
221     */
222    public static function add_share_action( $post_actions, $post ) {
223        $edit_url = get_edit_post_link( $post->ID, 'raw' );
224        if ( ! $edit_url || 'publish' !== $post->post_status ) {
225            return $post_actions;
226        }
227
228        $url   = add_query_arg( 'jetpack-editor-action', 'share_post', $edit_url );
229        $text  = _x( 'Share', 'Share the post on social networks', 'jetpack-publicize-pkg' );
230        $title = _draft_or_post_title( $post );
231        /* translators: post title */
232        $label                 = sprintf( __( 'Share "%s" via Jetpack Social', 'jetpack-publicize-pkg' ), $title );
233        $post_actions['share'] = sprintf( '<a href="%s" aria-label="%s">%s</a>', esc_url( $url ), esc_attr( $label ), esc_html( $text ) );
234
235        return $post_actions;
236    }
237
238    /**
239     * Retrieves the blog ID based on the environment we're running in.
240     *
241     * @return int The WPCOM blog ID.
242     */
243    public static function get_blog_id() {
244        return defined( 'IS_WPCOM' ) && IS_WPCOM ? get_current_blog_id() : \Jetpack_Options::get_option( 'id' );
245    }
246}