PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.9.2
Jetpack – WP Security, Backup, Speed, & Growth v14.9.2
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 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / seo-tools / class-jetpack-seo.php
jetpack / modules / seo-tools Last commit date
class-jetpack-seo-posts.php 1 year ago class-jetpack-seo-titles.php 3 years ago class-jetpack-seo-utils.php 1 year ago class-jetpack-seo.php 1 year ago
class-jetpack-seo.php
289 lines
1 <?php
2 /**
3 * Main class file for the SEO Tools module.
4 *
5 * @package automattic/jetpack
6 */
7
8 /**
9 * An SEO expert walks into a bar, bars, pub, public house, Irish pub, drinks, beer, wine, liquor, Grey Goose, Cristal...
10 *
11 * @phan-constructor-used-for-side-effects
12 */
13 class Jetpack_SEO {
14 /**
15 * Constructor.
16 */
17 public function __construct() {
18 add_action( 'init', array( $this, 'init' ) );
19 }
20
21 /**
22 * Initialization method for Jetpack_SEO.
23 */
24 public function init() {
25 /**
26 * Can be used to prevent SEO tools from inserting custom meta tags.
27 *
28 * @module seo-tools
29 *
30 * @since 4.4.0
31 *
32 * @param bool true Should Jetpack's SEO Meta Tags be enabled. Defaults to true.
33 */
34 if ( apply_filters( 'jetpack_seo_meta_tags_enabled', true ) ) {
35 add_action( 'wp_head', array( $this, 'meta_tags' ) );
36
37 // Add support for editing page excerpts in pages, regardless of theme support.
38 add_post_type_support( 'page', 'excerpt' );
39 }
40
41 /**
42 * Can be used to prevent SEO tools from modifying site titles.
43 *
44 * @module seo-tools
45 *
46 * @since 4.4.0
47 *
48 * @param bool true Should Jetpack SEO modify site titles. Defaults to true.
49 */
50 if ( apply_filters( 'jetpack_seo_custom_titles', true ) ) {
51 // Overwrite page title with custom SEO meta title for themes that support title-tag.
52 add_filter( 'pre_get_document_title', array( 'Jetpack_SEO_Titles', 'get_custom_title' ) );
53
54 // Add overwrite support for themes that don't support title-tag.
55 add_filter( 'wp_title', array( 'Jetpack_SEO_Titles', 'get_custom_title' ) );
56 }
57
58 add_filter( 'jetpack_open_graph_tags', array( $this, 'set_custom_og_tags' ) );
59 Jetpack_SEO_Posts::register_post_meta();
60 // Exclude posts with 'jetpack_seo_noindex' set true from the Jetpack sitemap.
61 add_filter( 'jetpack_sitemap_skip_post', array( 'Jetpack_SEO_Posts', 'exclude_noindex_posts_from_jetpack_sitemap' ), 10, 2 );
62 add_action( 'rest_api_init', array( $this, 'add_custom_field_post_type_meta' ) );
63 }
64
65 /**
66 * Add custom field meta to all public post types that don't already have it.
67 */
68 public function add_custom_field_post_type_meta() {
69 /**
70 * Filter the list of post types for which custom fields support is added.
71 *
72 * This filter allows modification of the post types that will be processed
73 * to add support for custom fields if they do not already support it.
74 *
75 * @since 14.2
76 *
77 * @param array $post_types An array of post type names.
78 */
79 $post_types = apply_filters(
80 'jetpack_seo_custom_field_post_types',
81 get_post_types(
82 array(
83 'public' => true,
84 'show_ui' => true,
85 '_builtin' => false,
86 )
87 )
88 );
89
90 foreach ( $post_types as $post_type ) {
91 if ( ! post_type_supports( $post_type, 'custom-fields' ) ) {
92 add_post_type_support( $post_type, 'custom-fields' );
93 }
94 }
95 }
96
97 /**
98 * Helper method to fetch authors.
99 */
100 private function get_authors() {
101 global $wp_query;
102
103 $authors = array();
104
105 foreach ( $wp_query->posts as $post ) {
106 $authors[] = get_the_author_meta( 'display_name', (int) $post->post_author );
107 }
108
109 $authors = array_unique( $authors );
110
111 return $authors;
112 }
113
114 /**
115 * Constructs open graph tag data.
116 *
117 * @param array $tags Array of tag data.
118 * @return array of tag data.
119 */
120 public function set_custom_og_tags( $tags ) {
121 $custom_title = Jetpack_SEO_Titles::get_custom_title();
122
123 if ( ! empty( $custom_title ) ) {
124 $tags['og:title'] = $custom_title;
125 }
126
127 $post_custom_description = Jetpack_SEO_Posts::get_post_custom_description( get_post() );
128 $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description();
129
130 if ( class_exists( 'woocommerce' ) && is_shop() ) {
131 $shop_page_id = get_option( 'woocommerce_shop_page_id' );
132 if ( $shop_page_id ) {
133 $post_custom_description = Jetpack_SEO_Posts::get_post_custom_description( get_post( $shop_page_id ) );
134 }
135 }
136
137 if ( is_front_page() && ! empty( $front_page_meta ) ) {
138 $tags['og:description'] = $front_page_meta;
139 } elseif ( ! empty( $post_custom_description ) ) {
140 $tags['og:description'] = $post_custom_description;
141 }
142
143 return $tags;
144 }
145
146 /**
147 * Outputs Jetpack's SEO <meta> tags.
148 */
149 public function meta_tags() {
150 global $wp_query;
151
152 $post_count = is_countable( $wp_query->posts ) ? count( $wp_query->posts ) : 0;
153 $period = '';
154 $template = '';
155 $meta = array();
156
157 /**
158 * Can be used to specify a list of themes that set their own meta tags.
159 *
160 * If current site is using one of the themes listed as conflicting, inserting Jetpack SEO
161 * meta tags will be prevented.
162 *
163 * @module seo-tools
164 *
165 * @since 4.4.0
166 *
167 * @param array List of conflicted theme names. Defaults to empty array.
168 */
169 $conflicted_themes = apply_filters( 'jetpack_seo_meta_tags_conflicted_themes', array() );
170
171 if ( isset( $conflicted_themes[ get_option( 'template' ) ] ) ) {
172 return;
173 }
174
175 $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description();
176 $description = $front_page_meta ? $front_page_meta : get_bloginfo( 'description' );
177 $meta['description'] = trim( $description );
178
179 // Try to target things if we're on a "specific" page of any kind.
180 if ( is_singular() ) {
181 if ( ! ( is_front_page() && Jetpack_SEO_Utils::get_front_page_meta_description() ) ) {
182 $description = Jetpack_SEO_Posts::get_post_description( get_post() );
183
184 if ( $description ) {
185 $description = wp_trim_words(
186 strip_shortcodes(
187 wp_strip_all_tags( $description, true )
188 )
189 );
190 $meta['description'] = $description;
191 }
192 }
193 } elseif ( is_author() ) {
194 $obj = get_queried_object();
195
196 $meta['description'] = sprintf(
197 /* translators: first property is an user's display name, the second is the site's title. */
198 _x( 'Read all of the posts by %1$s on %2$s', 'Read all of the posts by Author Name on Blog Title', 'jetpack' ),
199 isset( $obj->display_name ) ? $obj->display_name : __( 'the author', 'jetpack' ),
200 get_bloginfo( 'title' )
201 );
202 } elseif ( is_tag() || is_category() || is_tax() ) {
203 $obj = get_queried_object();
204 $description = '';
205
206 if ( isset( $obj->term_id ) && isset( $obj->taxonomy ) ) {
207 $description = get_term_field( 'description', $obj->term_id, $obj->taxonomy, 'raw' );
208 }
209
210 if ( ! is_wp_error( $description ) && $description ) {
211 $meta['description'] = wp_trim_words( $description );
212 } else {
213 $authors = $this->get_authors();
214
215 $meta['description'] = wp_sprintf(
216 /* translators: %1$s: A post category. %2$l: Post authors. */
217 _x( 'Posts about %1$s written by %2$l', 'Posts about Category written by John and Bob', 'jetpack' ),
218 single_term_title( '', false ),
219 $authors
220 );
221 }
222 } elseif ( is_date() ) {
223 if ( is_year() ) {
224 $period = get_query_var( 'year' );
225
226 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A year date. */
227 $template = _nx(
228 '%1$s post published by %2$l in the year %3$s', // Singular.
229 '%1$s posts published by %2$l in the year %3$s', // Plural.
230 $post_count, // Number.
231 '10 posts published by John in the year 2012', // Context.
232 'jetpack'
233 );
234 } elseif ( is_month() ) {
235 $period = gmdate( 'F Y', mktime( 0, 0, 0, get_query_var( 'monthnum' ), 1, get_query_var( 'year' ) ) );
236
237 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A month/year date. */
238 $template = _nx(
239 '%1$s post published by %2$l during %3$s', // Singular.
240 '%1$s posts published by %2$l during %3$s', // Plural.
241 $post_count, // Number.
242 '10 posts publishes by John during May 2012', // Context.
243 'jetpack'
244 );
245 } elseif ( is_day() ) {
246 $period = gmdate(
247 'F j, Y',
248 mktime( 0, 0, 0, get_query_var( 'monthnum' ), get_query_var( 'day' ), get_query_var( 'year' ) )
249 );
250
251 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A month/day/year date. */
252 $template = _nx(
253 '%1$s post published by %2$l on %3$s', // Singular.
254 '%1$s posts published by %2$l on %3$s', // Plural.
255 $post_count, // Number.
256 '10 posts published by John on May 30, 2012', // Context.
257 'jetpack'
258 );
259 }
260
261 $authors = $this->get_authors();
262 $meta['description'] = wp_sprintf( $template, $post_count, $authors, $period );
263 }
264
265 $mark_as_noindex = Jetpack_SEO_Posts::get_post_noindex_setting( get_post() );
266 if ( $mark_as_noindex ) {
267 $meta['robots'] = 'noindex';
268 }
269
270 /**
271 * Can be used to edit the default SEO tools meta tags.
272 *
273 * @module seo-tools
274 *
275 * @since 4.4.0
276 *
277 * @param array Array that consists of meta name and meta content pairs.
278 */
279 $meta = apply_filters( 'jetpack_seo_meta_tags', $meta );
280
281 // Output them.
282 foreach ( $meta as $name => $content ) {
283 if ( ! empty( $content ) ) {
284 echo '<meta name="' . esc_attr( $name ) . '" content="' . esc_attr( $content ) . '" />' . "\n";
285 }
286 }
287 }
288 }
289