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