Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
22.03% covered (danger)
22.03%
13 / 59
25.00% covered (danger)
25.00%
2 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Publicize_Setup
22.03% covered (danger)
22.03%
13 / 59
25.00% covered (danger)
25.00%
2 / 8
427.58
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 / 9
0.00% covered (danger)
0.00%
0 / 1
20
 on_jetpack_feature_publicize_enabled
0.00% covered (danger)
0.00%
0 / 26
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        if ( ! $is_wpcom_simple ) {
91            /**
92             * We need this only on Jetpack sites for Google Site auto-verification.
93             */
94            add_action( 'init', array( Keyring_Helper::class, 'init' ), 9 );
95        }
96
97        if ( $is_wpcom_simple ) {
98            /**
99             * Publicize is always enabled on WPCOM,
100             * we can call the initialization method directly.
101             */
102            add_action( 'plugins_loaded', array( self::class, 'on_jetpack_feature_publicize_enabled' ) );
103        }
104    }
105
106    /**
107     * To configure the publicize package, when called via the Config package.
108     */
109    public static function on_jetpack_feature_publicize_enabled() {
110        if ( self::$initialized || ! self::should_load() ) {
111            return;
112        }
113
114        self::$initialized = true;
115
116        $is_wpcom_simple = ( new Host() )->is_wpcom_simple();
117
118        global $publicize;
119        /**
120         * If publicize is not initialzed on WPCOM,
121         * it means that we are either on a public facing page
122         * or a page where Publicize is not needed.
123         * So, we will skip the whole set up here.
124         */
125        if ( $is_wpcom_simple && ! $publicize ) {
126            return;
127        }
128
129        global $publicize_ui;
130
131        if ( ! isset( $publicize_ui ) ) {
132            $publicize_ui = new Publicize_UI();
133        }
134
135        $rest_controllers = array(
136            REST_API\Connections_Controller::class,
137            REST_API\Connections_Post_Field::class,
138            REST_API\Scheduled_Actions_Controller::class,
139            REST_API\Services_Controller::class,
140            REST_API\Share_Post_Controller::class,
141            REST_API\Share_Status_Controller::class,
142            REST_API\Social_Image_Generator_Controller::class,
143            Jetpack_Social_Settings\Settings::class,
144        );
145
146        // Load the REST controllers.
147        foreach ( $rest_controllers as $controller ) {
148            if ( $is_wpcom_simple ) {
149                wpcom_rest_api_v2_load_plugin( $controller );
150            } else {
151                new $controller();
152            }
153        }
154
155        add_action( 'current_screen', array( self::class, 'add_filters_and_actions_for_screen' ), 5 );
156
157        ( new Social_Image_Generator\Setup() )->init();
158
159        // Things that should not happen on WPCOM.
160        if ( ! $is_wpcom_simple ) {
161            add_action( 'rest_api_init', array( new REST_Controller(), 'register_rest_routes' ) );
162        }
163    }
164
165    /**
166     * If the current_screen has 'edit' as the base, add filter to change the post list tables.
167     *
168     * @param object $current_screen The current screen.
169     */
170    public static function add_filters_and_actions_for_screen( $current_screen ) {
171        if ( 'edit' !== $current_screen->base ) {
172            return;
173        }
174
175        /**
176         * Filter to enable/disable the Share action on the post list screen.
177         *
178         * The Share action allows users to reshare published posts via Jetpack Social.
179         * It is automatically enabled for plans that support the 'republicize' feature,
180         * but can be disabled via this filter.
181         *
182         * @since 0.2.0 Originally in jetpack-post-list package.
183         * @since $$NEXT_VERSION$$ Moved to jetpack-publicize package.
184         *
185         * @param bool   $show_share Whether to show the share action. Default true.
186         * @param string $post_type  The current post type.
187         */
188        $show_share_action = Current_Plan::supports( 'republicize' )
189            && apply_filters( 'jetpack_post_list_display_share_action', true, $current_screen->post_type );
190
191        if ( $show_share_action ) {
192            self::maybe_add_share_action( $current_screen->post_type );
193        }
194    }
195
196    /**
197     * Add the Share action for post types that support publicize.
198     *
199     * @param string $post_type The post type.
200     */
201    public static function maybe_add_share_action( $post_type ) {
202        if (
203            post_type_supports( $post_type, 'publicize' ) &&
204            use_block_editor_for_post_type( $post_type )
205        ) {
206            add_filter( 'post_row_actions', array( self::class, 'add_share_action' ), 20, 2 );
207            add_filter( 'page_row_actions', array( self::class, 'add_share_action' ), 20, 2 );
208        }
209    }
210
211    /**
212     * Add the Share action link to the post row actions.
213     *
214     * @param array    $post_actions The current post actions.
215     * @param \WP_Post $post The post object.
216     * @return array Modified post actions.
217     */
218    public static function add_share_action( $post_actions, $post ) {
219        $edit_url = get_edit_post_link( $post->ID, 'raw' );
220        if ( ! $edit_url || 'publish' !== $post->post_status ) {
221            return $post_actions;
222        }
223
224        $url   = add_query_arg( 'jetpack-editor-action', 'share_post', $edit_url );
225        $text  = _x( 'Share', 'Share the post on social networks', 'jetpack-publicize-pkg' );
226        $title = _draft_or_post_title( $post );
227        /* translators: post title */
228        $label                 = sprintf( __( 'Share "%s" via Jetpack Social', 'jetpack-publicize-pkg' ), $title );
229        $post_actions['share'] = sprintf( '<a href="%s" aria-label="%s">%s</a>', esc_url( $url ), esc_attr( $label ), esc_html( $text ) );
230
231        return $post_actions;
232    }
233
234    /**
235     * Retrieves the blog ID based on the environment we're running in.
236     *
237     * @return int The WPCOM blog ID.
238     */
239    public static function get_blog_id() {
240        return defined( 'IS_WPCOM' ) && IS_WPCOM ? get_current_blog_id() : \Jetpack_Options::get_option( 'id' );
241    }
242}