class-jetpack-seo-posts.php
5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<?php
/**
* Class containing utility static methods for managing SEO options for Posts and Pages.
*
* @package automattic/jetpack
*/
/**
* Provides static utility methods for managing SEO options for Posts and Pages.
*/
class Jetpack_SEO_Posts {
/**
* Key of the post meta values that will be used to store post custom data.
*/
const DESCRIPTION_META_KEY = 'advanced_seo_description';
const HTML_TITLE_META_KEY = 'jetpack_seo_html_title';
const NOINDEX_META_KEY = 'jetpack_seo_noindex';
const POST_META_KEYS_ARRAY = array(
self::DESCRIPTION_META_KEY,
self::HTML_TITLE_META_KEY,
self::NOINDEX_META_KEY,
);
/**
* Build meta description for post SEO.
*
* @param WP_Post|null $post Source of data for custom description.
*
* @return string Post description or empty string.
*/
public static function get_post_description( $post = null ) {
$post = get_post( $post );
if ( ! ( $post instanceof WP_Post ) ) {
return '';
}
if ( post_password_required() || ! is_singular() ) {
return '';
}
// Business users can overwrite the description.
$custom_description = self::get_post_custom_description( $post );
if ( ! empty( $custom_description ) ) {
return $custom_description;
}
if ( ! empty( $post->post_excerpt ) ) {
return $post->post_excerpt;
}
return $post->post_content;
}
/**
* Returns post's custom meta description if it is set, and if
* SEO tools are enabled for current blog.
*
* @param WP_Post|null $post Source of data for custom description.
*
* @return string Custom description or empty string
*/
public static function get_post_custom_description( $post = null ) {
$post = get_post( $post );
if ( ! ( $post instanceof WP_Post ) ) {
return '';
}
$custom_description = get_post_meta( $post->ID, self::DESCRIPTION_META_KEY, true );
if ( empty( $custom_description ) || ! Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) {
return '';
}
return $custom_description;
}
/**
* Gets a custom HTML title for a post if one is set, and if
* SEO tools are enabled for the current blog.
*
* @param WP_Post|null $post Source of data for the custom HTML title.
*
* @return string Custom HTML title or an empty string if not set.
*/
public static function get_post_custom_html_title( $post = null ) {
$post = get_post( $post );
if ( ! ( $post instanceof WP_Post ) ) {
return '';
}
$custom_html_title = get_post_meta( $post->ID, self::HTML_TITLE_META_KEY, true );
if ( empty( $custom_html_title ) || ! Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) {
return '';
}
return $custom_html_title;
}
/**
* Gets the `jetpack_seo_noindex` setting for a post, if
* SEO tools are enabled for the current blog.
*
* @param WP_Post|null $post Provided post or defaults to the global post.
*
* @return bool True if post should be marked as noindex, false otherwise.
*/
public static function get_post_noindex_setting( $post = null ) {
$post = get_post( $post );
if ( ! ( $post instanceof WP_Post ) ) {
return false;
}
$mark_as_noindex = get_post_meta( $post->ID, self::NOINDEX_META_KEY, true );
if ( empty( $mark_as_noindex ) || ! Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) {
return false;
}
return (bool) $mark_as_noindex;
}
/**
* Filter callback for `jetpack_sitemap_skip_post`; if a post has `jetpack_seo_noindex` set to true,
* then exclude that post from the Jetpack sitemap.
*
* @param bool $skip Whether to skip the post in the sitemap.
* @param WP_Post $post The post to check.
*
* @return bool
*/
public static function exclude_noindex_posts_from_jetpack_sitemap( $skip, $post ) {
$exclude = self::get_post_noindex_setting( $post );
if ( $exclude ) {
$skip = true;
}
return $skip;
}
/**
* Registers the following meta keys for use in the REST API:
* - self::DESCRIPTION_META_KEY
* - self::HTML_TITLE_META_KEY
*/
public static function register_post_meta() {
$description_args = array(
'type' => 'string',
'description' => __( 'Custom post description to be used in HTML <meta /> tag.', 'jetpack' ),
'single' => true,
'default' => '',
'show_in_rest' => array(
'name' => self::DESCRIPTION_META_KEY,
),
);
$html_title_args = array(
'type' => 'string',
'description' => __( 'Custom title to be used in HTML <title /> tag.', 'jetpack' ),
'single' => true,
'default' => '',
'show_in_rest' => array(
'name' => self::HTML_TITLE_META_KEY,
),
);
$noindex_args = array(
'type' => 'boolean',
'description' => __( 'Whether to hide the post from search engines and the Jetpack sitemap.', 'jetpack' ),
'single' => true,
'default' => false,
'show_in_rest' => array(
'name' => self::NOINDEX_META_KEY,
),
);
register_meta( 'post', self::DESCRIPTION_META_KEY, $description_args );
register_meta( 'post', self::HTML_TITLE_META_KEY, $html_title_args );
register_meta( 'post', self::NOINDEX_META_KEY, $noindex_args );
}
/**
* Register the Advanced SEO Gutenberg extension
*/
public static function register_gutenberg_extension() {
if ( Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) {
Jetpack_Gutenberg::set_extension_available( 'jetpack-seo' );
} else {
Jetpack_Gutenberg::set_extension_unavailable( 'jetpack-seo', 'jetpack_seo_disabled' );
}
}
}