|
1 <?php |
|
2 /** |
|
3 * Sitemaps: WP_Sitemaps_Posts class |
|
4 * |
|
5 * Builds the sitemaps for the 'post' object type. |
|
6 * |
|
7 * @package WordPress |
|
8 * @subpackage Sitemaps |
|
9 * @since 5.5.0 |
|
10 */ |
|
11 |
|
12 /** |
|
13 * Posts XML sitemap provider. |
|
14 * |
|
15 * @since 5.5.0 |
|
16 */ |
|
17 class WP_Sitemaps_Posts extends WP_Sitemaps_Provider { |
|
18 /** |
|
19 * WP_Sitemaps_Posts constructor. |
|
20 * |
|
21 * @since 5.5.0 |
|
22 */ |
|
23 public function __construct() { |
|
24 $this->name = 'posts'; |
|
25 $this->object_type = 'post'; |
|
26 } |
|
27 |
|
28 /** |
|
29 * Returns the public post types, which excludes nav_items and similar types. |
|
30 * Attachments are also excluded. This includes custom post types with public = true. |
|
31 * |
|
32 * @since 5.5.0 |
|
33 * |
|
34 * @return WP_Post_Type[] Array of registered post type objects keyed by their name. |
|
35 */ |
|
36 public function get_object_subtypes() { |
|
37 $post_types = get_post_types( array( 'public' => true ), 'objects' ); |
|
38 unset( $post_types['attachment'] ); |
|
39 |
|
40 $post_types = array_filter( $post_types, 'is_post_type_viewable' ); |
|
41 |
|
42 /** |
|
43 * Filters the list of post object sub types available within the sitemap. |
|
44 * |
|
45 * @since 5.5.0 |
|
46 * |
|
47 * @param WP_Post_Type[] $post_types Array of registered post type objects keyed by their name. |
|
48 */ |
|
49 return apply_filters( 'wp_sitemaps_post_types', $post_types ); |
|
50 } |
|
51 |
|
52 /** |
|
53 * Gets a URL list for a post type sitemap. |
|
54 * |
|
55 * @since 5.5.0 |
|
56 * |
|
57 * @param int $page_num Page of results. |
|
58 * @param string $post_type Optional. Post type name. Default empty. |
|
59 * @return array Array of URLs for a sitemap. |
|
60 */ |
|
61 public function get_url_list( $page_num, $post_type = '' ) { |
|
62 // Bail early if the queried post type is not supported. |
|
63 $supported_types = $this->get_object_subtypes(); |
|
64 |
|
65 if ( ! isset( $supported_types[ $post_type ] ) ) { |
|
66 return array(); |
|
67 } |
|
68 |
|
69 /** |
|
70 * Filters the posts URL list before it is generated. |
|
71 * |
|
72 * Passing a non-null value will effectively short-circuit the generation, |
|
73 * returning that value instead. |
|
74 * |
|
75 * @since 5.5.0 |
|
76 * |
|
77 * @param array $url_list The URL list. Default null. |
|
78 * @param string $post_type Post type name. |
|
79 * @param int $page_num Page of results. |
|
80 */ |
|
81 $url_list = apply_filters( |
|
82 'wp_sitemaps_posts_pre_url_list', |
|
83 null, |
|
84 $post_type, |
|
85 $page_num |
|
86 ); |
|
87 |
|
88 if ( null !== $url_list ) { |
|
89 return $url_list; |
|
90 } |
|
91 |
|
92 $args = $this->get_posts_query_args( $post_type ); |
|
93 $args['paged'] = $page_num; |
|
94 |
|
95 $query = new WP_Query( $args ); |
|
96 |
|
97 $url_list = array(); |
|
98 |
|
99 /* |
|
100 * Add a URL for the homepage in the pages sitemap. |
|
101 * Shows only on the first page if the reading settings are set to display latest posts. |
|
102 */ |
|
103 if ( 'page' === $post_type && 1 === $page_num && 'posts' === get_option( 'show_on_front' ) ) { |
|
104 // Extract the data needed for home URL to add to the array. |
|
105 $sitemap_entry = array( |
|
106 'loc' => home_url( '/' ), |
|
107 ); |
|
108 |
|
109 /** |
|
110 * Filters the sitemap entry for the home page when the 'show_on_front' option equals 'posts'. |
|
111 * |
|
112 * @since 5.5.0 |
|
113 * |
|
114 * @param array $sitemap_entry Sitemap entry for the home page. |
|
115 */ |
|
116 $sitemap_entry = apply_filters( 'wp_sitemaps_posts_show_on_front_entry', $sitemap_entry ); |
|
117 $url_list[] = $sitemap_entry; |
|
118 } |
|
119 |
|
120 foreach ( $query->posts as $post ) { |
|
121 $sitemap_entry = array( |
|
122 'loc' => get_permalink( $post ), |
|
123 ); |
|
124 |
|
125 /** |
|
126 * Filters the sitemap entry for an individual post. |
|
127 * |
|
128 * @since 5.5.0 |
|
129 * |
|
130 * @param array $sitemap_entry Sitemap entry for the post. |
|
131 * @param WP_Post $post Post object. |
|
132 * @param string $post_type Name of the post_type. |
|
133 */ |
|
134 $sitemap_entry = apply_filters( 'wp_sitemaps_posts_entry', $sitemap_entry, $post, $post_type ); |
|
135 $url_list[] = $sitemap_entry; |
|
136 } |
|
137 |
|
138 return $url_list; |
|
139 } |
|
140 |
|
141 /** |
|
142 * Gets the max number of pages available for the object type. |
|
143 * |
|
144 * @since 5.5.0 |
|
145 * |
|
146 * @param string $post_type Optional. Post type name. Default empty. |
|
147 * @return int Total number of pages. |
|
148 */ |
|
149 public function get_max_num_pages( $post_type = '' ) { |
|
150 if ( empty( $post_type ) ) { |
|
151 return 0; |
|
152 } |
|
153 |
|
154 /** |
|
155 * Filters the max number of pages before it is generated. |
|
156 * |
|
157 * Passing a non-null value will short-circuit the generation, |
|
158 * returning that value instead. |
|
159 * |
|
160 * @since 5.5.0 |
|
161 * |
|
162 * @param int|null $max_num_pages The maximum number of pages. Default null. |
|
163 * @param string $post_type Post type name. |
|
164 */ |
|
165 $max_num_pages = apply_filters( 'wp_sitemaps_posts_pre_max_num_pages', null, $post_type ); |
|
166 |
|
167 if ( null !== $max_num_pages ) { |
|
168 return $max_num_pages; |
|
169 } |
|
170 |
|
171 $args = $this->get_posts_query_args( $post_type ); |
|
172 $args['fields'] = 'ids'; |
|
173 $args['no_found_rows'] = false; |
|
174 |
|
175 $query = new WP_Query( $args ); |
|
176 |
|
177 $min_num_pages = ( 'page' === $post_type && 'posts' === get_option( 'show_on_front' ) ) ? 1 : 0; |
|
178 return isset( $query->max_num_pages ) ? max( $min_num_pages, $query->max_num_pages ) : 1; |
|
179 } |
|
180 |
|
181 /** |
|
182 * Returns the query args for retrieving posts to list in the sitemap. |
|
183 * |
|
184 * @since 5.5.0 |
|
185 * |
|
186 * @param string $post_type Post type name. |
|
187 * @return array Array of WP_Query arguments. |
|
188 */ |
|
189 protected function get_posts_query_args( $post_type ) { |
|
190 /** |
|
191 * Filters the query arguments for post type sitemap queries. |
|
192 * |
|
193 * @see WP_Query for a full list of arguments. |
|
194 * |
|
195 * @since 5.5.0 |
|
196 * |
|
197 * @param array $args Array of WP_Query arguments. |
|
198 * @param string $post_type Post type name. |
|
199 */ |
|
200 $args = apply_filters( |
|
201 'wp_sitemaps_posts_query_args', |
|
202 array( |
|
203 'orderby' => 'ID', |
|
204 'order' => 'ASC', |
|
205 'post_type' => $post_type, |
|
206 'posts_per_page' => wp_sitemaps_get_max_urls( $this->object_type ), |
|
207 'post_status' => array( 'publish' ), |
|
208 'no_found_rows' => true, |
|
209 'update_post_term_cache' => false, |
|
210 'update_post_meta_cache' => false, |
|
211 ), |
|
212 $post_type |
|
213 ); |
|
214 |
|
215 return $args; |
|
216 } |
|
217 } |