PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.5
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.5
16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 All 506 releases
jetpack / extensions / blocks / premium-content / premium-content.php

premium-content.php in Jetpack – WP Security, Backup, Speed, & Growth 16.3-a.5, at extensions/blocks/premium-content/premium-content.php

174 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Premium Content Block.
4 *
5 * @package automattic/jetpack
6 */
7
8 namespace Automattic\Jetpack\Extensions\Premium_Content;
9
10 use Automattic\Jetpack\Blocks;
11 use Jetpack_Gutenberg;
12 use WP_Post;
13 use const Automattic\Jetpack\Extensions\Subscriptions\META_NAME_CONTAINS_PAID_CONTENT;
14
15 require_once __DIR__ . '/_inc/access-check.php';
16 require_once __DIR__ . '/logged-out-view/logged-out-view.php';
17 require_once __DIR__ . '/subscriber-view/subscriber-view.php';
18 require_once __DIR__ . '/buttons/buttons.php';
19 require_once __DIR__ . '/login-button/login-button.php';
20 require_once JETPACK__PLUGIN_DIR . 'extensions/blocks/subscriptions/constants.php';
21
22 /**
23 * Registers the block for use in Gutenberg
24 * This is done via an action so that we can disable
25 * registration if we need to.
26 */
27 function register_block() {
28
29 require_once JETPACK__PLUGIN_DIR . '/modules/memberships/class-jetpack-memberships.php';
30 if ( \Jetpack_Memberships::should_enable_monetize_blocks_in_editor() ) {
31 Blocks::jetpack_register_block(
32 __DIR__,
33 array(
34 'render_callback' => __NAMESPACE__ . '\render_block',
35 'provides_context' => array(
36 'premium-content/planId' => 'selectedPlanId', // Deprecated.
37 'premium-content/planIds' => 'selectedPlanIds',
38 'isPremiumContentChild' => 'isPremiumContentChild',
39 ),
40 )
41 );
42 }
43
44 register_post_meta(
45 'post',
46 META_NAME_CONTAINS_PAID_CONTENT,
47 array(
48 'show_in_rest' => true,
49 'single' => true,
50 'type' => 'boolean',
51 'auth_callback' => function () {
52 return wp_get_current_user()->has_cap( 'edit_posts' );
53 },
54 )
55 );
56
57 // This ensures Jetpack will sync this post meta to WPCOM.
58 add_filter(
59 'jetpack_sync_post_meta_whitelist',
60 function ( $allowed_meta ) {
61 return array_merge(
62 $allowed_meta,
63 array(
64 META_NAME_CONTAINS_PAID_CONTENT,
65 )
66 );
67 }
68 );
69
70 add_action( 'wp_after_insert_post', __NAMESPACE__ . '\add_paid_content_post_meta', 99, 2 );
71 }
72 add_action( 'init', __NAMESPACE__ . '\register_block' );
73 add_action( 'template_redirect', __NAMESPACE__ . '\prewarm_premium_content_session_cookie' );
74
75 /**
76 * Render callback.
77 *
78 * @param array $attributes Array containing the block attributes.
79 * @param string $content String containing the block content.
80 *
81 * @return string
82 */
83 function render_block( $attributes, $content ) {
84 if ( ! pre_render_checks() ) {
85 return '';
86 }
87
88 // Render the Stripe nudge when Stripe is unconnected
89 if ( ! membership_checks() ) {
90 $stripe_nudge = render_stripe_nudge();
91 return $stripe_nudge . $content;
92 }
93
94 // We don't use FEATURE_NAME here because styles are not in /container folder.
95 Jetpack_Gutenberg::load_assets_as_required( 'premium-content' );
96 return $content;
97 }
98
99 /**
100 * Server-side rendering for the stripe connection nudge.
101 *
102 * @return string Final content to render.
103 */
104 function render_stripe_nudge() {
105 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
106 \require_lib( 'memberships' );
107 $blog_id = get_current_blog_id();
108 $settings = (array) \get_memberships_settings_for_site( $blog_id );
109
110 return stripe_nudge(
111 $settings['connect_url'],
112 __( 'Connect to Stripe to use this block on your site.', 'jetpack' ),
113 __( 'Connect', 'jetpack' )
114 );
115 } else {
116 // On WoA sites, the Stripe connection url is not easily available
117 // server-side, so we redirect them to the post in the editor in order
118 // to connect.
119 return stripe_nudge(
120 get_edit_post_link( get_the_ID() ),
121 __( 'Connect to Stripe in the editor to use this block on your site.', 'jetpack' ),
122 __( 'Edit post', 'jetpack' )
123 );
124 }
125 }
126
127 /**
128 * Render the stripe nudge.
129 *
130 * @param string $checkout_url Url for the CTA.
131 * @param string $description Text of the nudge.
132 * @param string $button_text Text of the button.
133 *
134 * @return string Final content to render.
135 */
136 function stripe_nudge( $checkout_url, $description, $button_text ) {
137 require_once JETPACK__PLUGIN_DIR . '_inc/lib/components.php';
138 return \Jetpack_Components::render_frontend_nudge(
139 array(
140 'checkoutUrl' => $checkout_url,
141 'description' => $description,
142 'buttonText' => $button_text,
143 )
144 );
145 }
146
147 /**
148 * Add a meta to prevent publication on firehose, ES AI or Reader
149 *
150 * @param int $post_id Post id.
151 * @param WP_Post $post Post being saved.
152 * @return void
153 */
154 function add_paid_content_post_meta( int $post_id, WP_Post $post ) {
155 if ( $post->post_type !== 'post' && $post->post_type !== 'page' ) {
156 return;
157 }
158
159 $contains_paid_content = has_block( 'premium-content/container', $post );
160 if ( $contains_paid_content ) {
161 update_post_meta(
162 $post_id,
163 META_NAME_CONTAINS_PAID_CONTENT,
164 $contains_paid_content
165 );
166 }
167 if ( ! $contains_paid_content ) {
168 delete_post_meta(
169 $post_id,
170 META_NAME_CONTAINS_PAID_CONTENT
171 );
172 }
173 }
174