PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.2.3
Jetpack – WP Security, Backup, Speed, & Growth v12.2.3
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 3 years ago class-jetpack-seo-titles.php 3 years ago class-jetpack-seo-utils.php 4 years ago class-jetpack-seo.php 3 years ago
class-jetpack-seo.php
255 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 form 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 Jetpack_SEO_Posts::register_gutenberg_extension();
59 // Exclude posts with 'jetpack_seo_noindex' set true from the Jetpack sitemap.
60 add_filter( 'jetpack_sitemap_skip_post', array( 'Jetpack_SEO_Posts', 'exclude_noindex_posts_from_jetpack_sitemap' ), 10, 2 );
61 }
62
63 /**
64 * Helper method to fetch authors.
65 */
66 private function get_authors() {
67 global $wp_query;
68
69 $authors = array();
70
71 foreach ( $wp_query->posts as $post ) {
72 $authors[] = get_the_author_meta( 'display_name', (int) $post->post_author );
73 }
74
75 $authors = array_unique( $authors );
76
77 return $authors;
78 }
79
80 /**
81 * Constructs open graph tag data.
82 *
83 * @param array $tags Array of tag data.
84 * @return array of tag data.
85 */
86 public function set_custom_og_tags( $tags ) {
87 $custom_title = Jetpack_SEO_Titles::get_custom_title();
88
89 if ( ! empty( $custom_title ) ) {
90 $tags['og:title'] = $custom_title;
91 }
92
93 $post_custom_description = Jetpack_SEO_Posts::get_post_custom_description( get_post() );
94 $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description();
95
96 if ( class_exists( 'woocommerce' ) && is_shop() ) {
97 $shop_page_id = get_option( 'woocommerce_shop_page_id' );
98 if ( $shop_page_id ) {
99 $post_custom_description = Jetpack_SEO_Posts::get_post_custom_description( get_post( $shop_page_id ) );
100 }
101 }
102
103 if ( is_front_page() && ! empty( $front_page_meta ) ) {
104 $tags['og:description'] = $front_page_meta;
105 } elseif ( ! empty( $post_custom_description ) ) {
106 $tags['og:description'] = $post_custom_description;
107 }
108
109 return $tags;
110 }
111
112 /**
113 * Outputs Jetpack's SEO <meta> tags.
114 */
115 public function meta_tags() {
116 global $wp_query;
117
118 $post_count = is_countable( $wp_query->posts ) ? count( $wp_query->posts ) : 0;
119 $period = '';
120 $template = '';
121 $meta = array();
122
123 /**
124 * Can be used to specify a list of themes that set their own meta tags.
125 *
126 * If current site is using one of the themes listed as conflicting, inserting Jetpack SEO
127 * meta tags will be prevented.
128 *
129 * @module seo-tools
130 *
131 * @since 4.4.0
132 *
133 * @param array List of conflicted theme names. Defaults to empty array.
134 */
135 $conflicted_themes = apply_filters( 'jetpack_seo_meta_tags_conflicted_themes', array() );
136
137 if ( isset( $conflicted_themes[ get_option( 'template' ) ] ) ) {
138 return;
139 }
140
141 $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description();
142 $description = $front_page_meta ? $front_page_meta : get_bloginfo( 'description' );
143 $meta['description'] = trim( $description );
144
145 // Try to target things if we're on a "specific" page of any kind.
146 if ( is_singular() ) {
147 if ( ! ( is_front_page() && Jetpack_SEO_Utils::get_front_page_meta_description() ) ) {
148 $description = Jetpack_SEO_Posts::get_post_description( get_post() );
149
150 if ( $description ) {
151 $description = wp_trim_words(
152 strip_shortcodes(
153 wp_strip_all_tags( $description, true )
154 )
155 );
156 $meta['description'] = $description;
157 }
158 }
159 } elseif ( is_author() ) {
160 $obj = get_queried_object();
161
162 $meta['description'] = sprintf(
163 /* translators: first property is an user's display name, the second is the site's title. */
164 _x( 'Read all of the posts by %1$s on %2$s', 'Read all of the posts by Author Name on Blog Title', 'jetpack' ),
165 isset( $obj->display_name ) ? $obj->display_name : __( 'the author', 'jetpack' ),
166 get_bloginfo( 'title' )
167 );
168 } elseif ( is_tag() || is_category() || is_tax() ) {
169 $obj = get_queried_object();
170 $description = '';
171
172 if ( isset( $obj->term_id ) && isset( $obj->taxonomy ) ) {
173 $description = get_term_field( 'description', $obj->term_id, $obj->taxonomy, 'raw' );
174 }
175
176 if ( ! is_wp_error( $description ) && $description ) {
177 $meta['description'] = wp_trim_words( $description );
178 } else {
179 $authors = $this->get_authors();
180
181 $meta['description'] = wp_sprintf(
182 /* translators: %1$s: A post category. %2$l: Post authors. */
183 _x( 'Posts about %1$s written by %2$l', 'Posts about Category written by John and Bob', 'jetpack' ),
184 single_term_title( '', false ),
185 $authors
186 );
187 }
188 } elseif ( is_date() ) {
189 if ( is_year() ) {
190 $period = get_query_var( 'year' );
191
192 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A year date. */
193 $template = _nx(
194 '%1$s post published by %2$l in the year %3$s', // Singular.
195 '%1$s posts published by %2$l in the year %3$s', // Plural.
196 $post_count, // Number.
197 '10 posts published by John in the year 2012', // Context.
198 'jetpack'
199 );
200 } elseif ( is_month() ) {
201 $period = gmdate( 'F Y', mktime( 0, 0, 0, get_query_var( 'monthnum' ), 1, get_query_var( 'year' ) ) );
202
203 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A month/year date. */
204 $template = _nx(
205 '%1$s post published by %2$l during %3$s', // Singular.
206 '%1$s posts published by %2$l during %3$s', // Plural.
207 $post_count, // Number.
208 '10 posts publishes by John during May 2012', // Context.
209 'jetpack'
210 );
211 } elseif ( is_day() ) {
212 $period = gmdate(
213 'F j, Y',
214 mktime( 0, 0, 0, get_query_var( 'monthnum' ), get_query_var( 'day' ), get_query_var( 'year' ) )
215 );
216
217 /* translators: %1$s: Number of posts published. %2$l: Post author. %3$s: A month/day/year date. */
218 $template = _nx(
219 '%1$s post published by %2$l on %3$s', // Singular.
220 '%1$s posts published by %2$l on %3$s', // Plural.
221 $post_count, // Number.
222 '10 posts published by John on May 30, 2012', // Context.
223 'jetpack'
224 );
225 }
226
227 $authors = $this->get_authors();
228 $meta['description'] = wp_sprintf( $template, $post_count, $authors, $period );
229 }
230
231 $mark_as_noindex = Jetpack_SEO_Posts::get_post_noindex_setting( get_post() );
232 if ( $mark_as_noindex ) {
233 $meta['robots'] = 'noindex';
234 }
235
236 /**
237 * Can be used to edit the default SEO tools meta tags.
238 *
239 * @module seo-tools
240 *
241 * @since 4.4.0
242 *
243 * @param array Array that consists of meta name and meta content pairs.
244 */
245 $meta = apply_filters( 'jetpack_seo_meta_tags', $meta );
246
247 // Output them.
248 foreach ( $meta as $name => $content ) {
249 if ( ! empty( $content ) ) {
250 echo '<meta name="' . esc_attr( $name ) . '" content="' . esc_attr( $content ) . '" />' . "\n";
251 }
252 }
253 }
254 }
255