PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 12.6.2
Jetpack – WP Security, Backup, Speed, & Growth v12.6.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 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 All 501 releases
jetpack / modules / shortlinks.php

shortlinks.php in Jetpack – WP Security, Backup, Speed, & Growth 12.6.2, at modules/shortlinks.php

188 lines 4.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Module Name: WP.me Shortlinks
4 * Module Description: Generates shorter links using the wp.me domain.
5 * Sort Order: 8
6 * First Introduced: 1.1
7 * Requires Connection: Yes
8 * Auto Activate: No
9 * Module Tags: Social
10 * Feature: Writing
11 * Additional Search Queries: shortlinks, wp.me
12 *
13 * @package automattic/jetpack
14 */
15
16 add_filter( 'pre_get_shortlink', 'wpme_get_shortlink_handler', 1, 4 );
17
18 if ( ! function_exists( 'wpme_dec2sixtwo' ) ) {
19 /**
20 * Converts number to base 62.
21 *
22 * @param int $num Number.
23 *
24 * @return string Value in base 62.
25 */
26 function wpme_dec2sixtwo( $num ) {
27 $index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
28 $out = '';
29
30 if ( $num < 0 ) {
31 $out = '-';
32 $num = abs( $num );
33 }
34
35 for ( $t = floor( log10( $num ) / log10( 62 ) ); $t >= 0; $t-- ) {
36 $a = floor( $num / pow( 62, $t ) );
37 $out = $out . substr( $index, $a, 1 );
38 $num = $num - ( $a * pow( 62, $t ) );
39 }
40
41 return $out;
42 }
43 }
44
45 /**
46 * Returns the WP.me shortlink.
47 *
48 * @param int $id Post ID, or 0 for the current post.
49 * @param string $context The context for the link. One of 'post' or 'query'.
50 * @param bool $allow_slugs Whether to allow post slugs in the shortlink.
51 *
52 * @return string
53 */
54 function wpme_get_shortlink( $id = 0, $context = 'post', $allow_slugs = true ) {
55 global $wp_query;
56
57 $blog_id = Jetpack_Options::get_option( 'id' );
58
59 if ( 'query' === $context ) {
60 if ( is_singular() ) {
61 $id = $wp_query->get_queried_object_id();
62 $context = 'post';
63 } elseif ( is_front_page() ) {
64 $context = 'blog';
65 } else {
66 return '';
67 }
68 }
69
70 if ( 'blog' === $context ) {
71 if ( empty( $id ) ) {
72 $id = $blog_id;
73 }
74
75 return 'https://wp.me/' . wpme_dec2sixtwo( $id );
76 }
77
78 $post = get_post( $id );
79
80 if ( empty( $post ) ) {
81 return '';
82 }
83
84 $post_id = $post->ID;
85 $type = '';
86
87 if ( $allow_slugs && 'publish' === $post->post_status && 'post' === $post->post_type && strlen( $post->post_name ) <= 8 && false === strpos( $post->post_name, '%' )
88 && false === strpos( $post->post_name, '-' ) ) {
89 $id = $post->post_name;
90 $type = 's';
91 } else {
92 $id = wpme_dec2sixtwo( $post_id );
93 if ( 'page' === $post->post_type ) {
94 $type = 'P';
95 } elseif ( 'post' === $post->post_type || post_type_supports( $post->post_type, 'shortlinks' ) ) {
96 $type = 'p';
97 } elseif ( 'attachment' === $post->post_type ) {
98 $type = 'a';
99 }
100 }
101
102 if ( empty( $type ) ) {
103 return '';
104 }
105
106 return 'https://wp.me/' . $type . wpme_dec2sixtwo( $blog_id ) . '-' . $id;
107 }
108
109 /**
110 * Get the shortlink handler.
111 *
112 * Used with the Core pre_get_shortlink hook.
113 *
114 * @param string $shortlink Shortlink value from the action. Ignored.
115 * @param int $id Post ID (0 for the current post).
116 * @param string $context The context for the link. One of 'post' or 'query'.
117 * @param bool $allow_slugs Whether to allow post slugs in the shortlink.
118 *
119 * @return string
120 */
121 function wpme_get_shortlink_handler( $shortlink, $id, $context, $allow_slugs ) {
122 return wpme_get_shortlink( $id, $context, $allow_slugs );
123 }
124
125 /**
126 * Add Shortlinks to the REST API responses.
127 *
128 * @since 6.9.0
129 *
130 * @action rest_api_init
131 * @uses register_rest_field, wpme_rest_get_shortlink
132 */
133 function wpme_rest_register_shortlinks() {
134 // Post types that support shortlinks by default.
135 $supported_post_types = array(
136 'attachment',
137 'page',
138 'post',
139 );
140
141 // Add any CPT that may have declared support for shortlinks.
142 foreach ( get_post_types() as $post_type ) {
143 if (
144 post_type_supports( $post_type, 'shortlinks' )
145 && post_type_supports( $post_type, 'editor' )
146 ) {
147 $supported_post_types[] = $post_type;
148 }
149 }
150
151 register_rest_field(
152 $supported_post_types,
153 'jetpack_shortlink',
154 array(
155 'get_callback' => 'wpme_rest_get_shortlink',
156 'update_callback' => null,
157 'schema' => null,
158 )
159 );
160 }
161
162 /**
163 * Get the shortlink of a post.
164 *
165 * @since 6.9.0
166 *
167 * @param array $object Details of current post.
168 *
169 * @uses wpme_get_shortlink
170 *
171 * @return string
172 */
173 function wpme_rest_get_shortlink( $object ) {
174 return wpme_get_shortlink( $object['id'], array() );
175 }
176
177 // Add shortlinks to the REST API Post response.
178 add_action( 'rest_api_init', 'wpme_rest_register_shortlinks' );
179
180 /**
181 * Set the Shortlink Gutenberg extension as available.
182 */
183 function wpme_set_extension_available() {
184 Jetpack_Gutenberg::set_extension_available( 'jetpack/shortlinks' );
185 }
186
187 add_action( 'init', 'wpme_set_extension_available' );
188