__NAMESPACE__ . '\render_block' ) ); } add_action( 'init', __NAMESPACE__ . '\register_block' ); /** * Sharing Buttons block registration/dependency declaration. * * @param array $attr Array containing the Sharing Buttons block attributes. * @param string $content String containing the Sharing Buttons block content. * @param object $block Object containing block data. * * @return string */ function render_block( $attr, $content, $block ) { $service_name = $attr['service']; $title = $attr['label'] ?? $service_name; $icon = get_social_logo( $service_name ); $style_type = $block->context['styleType'] ?? 'icon-text'; $post_id = $block->context['postId'] ?? 0; $data_shared = sprintf( 'sharing-%1$s-%2$d', $service_name, $post_id ); $services = get_services(); $service = new $services[ $service_name ]( $service_name, array() ); $link_props = $service->get_link( $post_id, 'share=' . esc_attr( $service_name ) . '&nb=1', esc_attr( $data_shared ) ); $link_url = $link_props['url']; $link_classes = sprintf( 'jetpack-sharing-button__button style-%1$s share-%2$s', $style_type, $service_name ); $link_aria_label = sprintf( /* translators: %s refers to a string representation of sharing service, e.g. Facebook */ esc_html__( 'Share on %s', 'jetpack' ), esc_html( $title ) ); $styles = array(); if ( array_key_exists( 'iconColorValue', $block->context ) && ! empty( $block->context['iconColorValue'] ) ) { $styles['color'] = $block->context['iconColorValue']; } if ( array_key_exists( 'iconBackgroundColorValue', $block->context ) && ! empty( $block->context['iconBackgroundColorValue'] ) ) { $styles['background-color'] = $block->context['iconBackgroundColorValue']; } $link_styles = ''; foreach ( $styles as $property => $value ) { $link_styles .= $property . ':' . $value . ';'; } Jetpack_Gutenberg::load_assets_as_required( __DIR__ ); $component = '
  • '; $component .= sprintf( '', esc_url( $link_url ), esc_attr( $link_classes ), esc_attr( $link_styles ), esc_attr( $service_name ), esc_attr( $data_shared ), esc_attr( $link_aria_label ) ); $component .= $style_type !== 'text' ? $icon : ''; $component .= ''; $component .= ''; $component .= '
  • '; return $component; } /** * Get services for the Sharing Buttons block. * * @return array Array of services. */ function get_services() { $services = array( 'print' => Share_Print_Block::class, 'mail' => Share_Email_Block::class, 'facebook' => Share_Facebook_Block::class, 'linkedin' => Share_LinkedIn_Block::class, 'reddit' => Share_Reddit_Block::class, 'twitter' => Share_Twitter_Block::class, 'tumblr' => Share_Tumblr_Block::class, 'pinterest' => Share_Pinterest_Block::class, 'pocket' => Share_Pocket_Block::class, 'telegram' => Share_Telegram_Block::class, 'whatsapp' => Jetpack_Share_WhatsApp_Block::class, 'mastodon' => Share_Mastodon_Block::class, 'nextdoor' => Share_Nextdoor_Block::class, 'x' => Share_X_Block::class, ); return $services; } /** * Launch sharing requests on page load when a specific query string is used. * * @return void */ function sharing_process_requests() { global $post; // Only process if: single post and share={service} defined if ( ( is_page() || is_single() ) && isset( $_GET['share'] ) && is_string( $_GET['share'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $services = get_services(); $service_name = sanitize_text_field( wp_unslash( $_GET['share'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended // Only allow services that have been defined in get_services(). if ( ! array_key_exists( $service_name, $services ) ) { return; } $service = new $services[ ( $service_name ) ]( $service_name, array() ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( $service ) { $service->process_request( $post, $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing } } } add_action( 'template_redirect', __NAMESPACE__ . '\sharing_process_requests', 9 );