PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.2.2
Jetpack – WP Security, Backup, Speed, & Growth v14.2.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 2 years ago class-jetpack-seo-titles.php 3 years ago class-jetpack-seo-utils.php 2 years ago class-jetpack-seo.php 1 year ago
class-jetpack-seo.php
287 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 class Jetpack_SEO {
12 /**
13 * Constructor.
14 */
15 public function __construct() {
16 add_action( 'init', array( $this, 'init' ) );
17 }
18
19 /**
20 * Initialization method for Jetpack_SEO.
21 */
22 public function init() {
23 /**
24 * Can be used to prevent SEO tools from inserting custom meta tags.
25 *
26 * @module seo-tools
27 *
28 * @since 4.4.0
29 *
30 * @param bool true Should Jetpack's SEO Meta Tags be enabled. Defaults to true.
31 */
32 if ( apply_filters( 'jetpack_seo_meta_tags_enabled', true ) ) {
33 add_action( 'wp_head', array( $this, 'meta_tags' ) );
34
35 // Add support for editing page excerpts in pages, regardless of theme support.
36 add_post_type_support( 'page', 'excerpt' );
37 }
38
39 /**
40 * Can be used to prevent SEO tools from modifying site titles.
41 *
42 * @module seo-tools
43 *
44 * @since 4.4.0
45 *
46 * @param bool true Should Jetpack SEO modify site titles. Defaults to true.
47 */
48 if ( apply_filters( 'jetpack_seo_custom_titles', true ) ) {
49 // Overwrite page title with custom SEO meta title for themes that support title-tag.
50 add_filter( 'pre_get_document_title', array( 'Jetpack_SEO_Titles', 'get_custom_title' ) );
51
52 // Add overwrite support for themes that don't support title-tag.
53 add_filter( 'wp_title', array( 'Jetpack_SEO_Titles', 'get_custom_title' ) );
54 }
55
56 add_filter( 'jetpack_open_graph_tags', array( $this, 'set_custom_og_tags' ) );
57 Jetpack_SEO_Posts::register_post_meta();
58 // Exclude posts with 'jetpack_seo_noindex' set true from the Jetpack sitemap.
59 add_filter( 'jetpack_sitemap_skip_post', array( 'Jetpack_SEO_Posts', 'exclude_noindex_posts_from_jetpack_sitemap' ), 10, 2 );
60 add_action( 'rest_api_init', array( $this, 'add_custom_field_post_type_meta' ) );
61 }
62
63 /**
64 * Add custom field meta to all public post types that don't already have it.
65 */
66 public function add_custom_field_post_type_meta() {
67 /**
68 * Filter the list of post types for which custom fields support is added.
69 *
70 * This filter allows modification of the post types that will be processed
71 * to add support for custom fields if they do not already support it.
72 *
73 * @since 14.2
74 *
75 * @param array $post_types An array of post type names.
76 */
77 $post_types = apply_filters(
78 'jetpack_seo_custom_field_post_types',
79 get_post_types(
80 array(
81 'public' => true,
82 'show_ui' => true,
83 '_builtin' => false,
84 )
85 )
86 );
87
88 foreach ( $post_types as $post_type ) {
89 if ( ! post_type_supports( $post_type, 'custom-fields' ) ) {
90 add_post_type_support( $post_type, 'custom-fields' );
91 }
92 }
93 }
94
95 /**
96 * Helper method to fetch authors.
97 */
98 private function get_authors() {
99 global $wp_query;
100
101 $authors = array();
102
103 foreach ( $wp_query->posts as $post ) {
104 $authors[] = get_the_author_meta( 'display_name', (int) $post->post_author );
105 }
106
107 $authors = array_unique( $authors );
108
109 return $authors;
110 }
111
112 /**
113 * Constructs open graph tag data.
114 *
115 * @param array $tags Array of tag data.
116 * @return array of tag data.
117 */
118 public function set_custom_og_tags( $tags ) {
119 $custom_title = Jetpack_SEO_Titles::get_custom_title();
120
121 if ( ! empty( $custom_title ) ) {
122 $tags['og:title'] = $custom_title;
123 }
124
125 $post_custom_description = Jetpack_SEO_Posts::get_post_custom_description( get_post() );
126 $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description();
127
128 if ( class_exists( 'woocommerce' ) && is_shop() ) {
129 $shop_page_id = get_option( 'woocommerce_shop_page_id' );
130 if ( $shop_page_id ) {
131 $post_custom_description = Jetpack_SEO_Posts::get_post_custom_description( get_post( $shop_page_id ) );
132 }
133 }
134
135 if ( is_front_page() && ! empty( $front_page_meta ) ) {
136 $tags['og:description'] = $front_page_meta;
137 } elseif ( ! empty( $post_custom_description ) ) {
138 $tags['og:description'] = $post_custom_description;
139 }
140
141 return $tags;
142 }
143
144 /**
145 * Outputs Jetpack's SEO <meta> tags.
146 */
147 public function meta_tags() {
148 global $wp_query;
149
150 $post_count = is_countable( $wp_query->posts ) ? count( $wp_query->posts ) : 0;
151 $period = '';
152 $template = '';
153 $meta = array();
154
155 /**
156 * Can be used to specify a list of themes that set their own meta tags.
157 *
158 * If current site is using one of the themes listed as conflicting, inserting Jetpack SEO
159 * meta tags will be prevented.
160 *
161 * @module seo-tools
162 *
163 * @since 4.4.0
164 *
165 * @param array List of conflicted theme names. Defaults to empty array.
166 */
167 $conflicted_themes = apply_filters( 'jetpack_seo_meta_tags_conflicted_themes', array() );
168
169 if ( isset( $conflicted_themes[ get_option( 'template' ) ] ) ) {
170 return;
171 }
172
173 $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description();
174 $description = $front_page_meta ? $front_page_meta : get_bloginfo( 'description' );
175 $meta['description'] = trim( $description );
176
177 // Try to target things if we're on a "specific" page of any kind.
178 if ( is_singular() ) {
179 if ( ! ( is_front_page() && Jetpack_SEO_Utils::get_front_page_meta_description() ) ) {
180 $description = Jetpack_SEO_Posts::get_post_description( get_post() );
181
182 if ( $description ) {
183 $description = wp_trim_words(
184 strip_shortcodes(
185 wp_strip_all_tags( $description, true )
186 )
187 );
188 $meta['description'] = $description;
189 }
190 }
191 } elseif ( is_author() ) {
192 $obj = get_queried_object();
193
194 $meta['description'] = sprintf(
195 /* translators: first property is an user's display name, the second is the site's title. */
196 _x( 'Read all of the posts by %1$s on %2$s', 'Read all of the posts by Author Name on Blog Title', 'jetpack' ),
197 isset( $obj->display_name ) ? $obj->display_name : __( 'the author', 'jetpack' ),
198 get_bloginfo( 'title' )
199 );
200 } elseif ( is_tag() || is_category() || is_tax() ) {
201 $obj = get_queried_object();
202 $description = '';
203
204 if ( isset( $obj->term_id ) && isset( $obj->taxonomy ) ) {
205 $description = get_term_field( 'description', $obj->term_id, $obj->taxonomy, 'raw' );
206 }
207
208 if ( ! is_wp_error( $description ) && $description ) {
209 $meta['description'] = wp_trim_words( $description );
210 } else {
211 $authors = $this->get_authors();
212
213 $meta['description'] = wp_sprintf(
214 /* translators: %1$s: A post category. %2$l: Post authors. */
215 _x( 'Posts about %1$s written by %2$l', 'Posts about Category written by John and Bob', 'jetpack' ),
216 single_term_title( '', false ),
217 $authors
218 );
219 }
220 } elseif ( is_date() ) {
221 if ( is_year() ) {
222 $period = get_query_var( 'year' );
223
224 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A year date. */
225 $template = _nx(
226 '%1$s post published by %2$l in the year %3$s', // Singular.
227 '%1$s posts published by %2$l in the year %3$s', // Plural.
228 $post_count, // Number.
229 '10 posts published by John in the year 2012', // Context.
230 'jetpack'
231 );
232 } elseif ( is_month() ) {
233 $period = gmdate( 'F Y', mktime( 0, 0, 0, get_query_var( 'monthnum' ), 1, get_query_var( 'year' ) ) );
234
235 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A month/year date. */
236 $template = _nx(
237 '%1$s post published by %2$l during %3$s', // Singular.
238 '%1$s posts published by %2$l during %3$s', // Plural.
239 $post_count, // Number.
240 '10 posts publishes by John during May 2012', // Context.
241 'jetpack'
242 );
243 } elseif ( is_day() ) {
244 $period = gmdate(
245 'F j, Y',
246 mktime( 0, 0, 0, get_query_var( 'monthnum' ), get_query_var( 'day' ), get_query_var( 'year' ) )
247 );
248
249 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A month/day/year date. */
250 $template = _nx(
251 '%1$s post published by %2$l on %3$s', // Singular.
252 '%1$s posts published by %2$l on %3$s', // Plural.
253 $post_count, // Number.
254 '10 posts published by John on May 30, 2012', // Context.
255 'jetpack'
256 );
257 }
258
259 $authors = $this->get_authors();
260 $meta['description'] = wp_sprintf( $template, $post_count, $authors, $period );
261 }
262
263 $mark_as_noindex = Jetpack_SEO_Posts::get_post_noindex_setting( get_post() );
264 if ( $mark_as_noindex ) {
265 $meta['robots'] = 'noindex';
266 }
267
268 /**
269 * Can be used to edit the default SEO tools meta tags.
270 *
271 * @module seo-tools
272 *
273 * @since 4.4.0
274 *
275 * @param array Array that consists of meta name and meta content pairs.
276 */
277 $meta = apply_filters( 'jetpack_seo_meta_tags', $meta );
278
279 // Output them.
280 foreach ( $meta as $name => $content ) {
281 if ( ! empty( $content ) ) {
282 echo '<meta name="' . esc_attr( $name ) . '" content="' . esc_attr( $content ) . '" />' . "\n";
283 }
284 }
285 }
286 }
287