1<?php
2/**
3 * Post format functions.
4 *
5 * @package WordPress
6 * @subpackage Post
7 */
8
9/**
10 * Retrieve the format slug for a post
11 *
12 * @since 3.1.0
13 *
14 * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to the current post in the loop.
15 * @return string|false The format if successful. False otherwise.
16 */
17function get_post_format( $post = null ) {
18 $post = get_post( $post );
19
20 if ( ! $post ) {
21 return false;
22 }
23
24 if ( ! post_type_supports( $post->post_type, 'post-formats' ) ) {
25 return false;
26 }
27
28 $_format = get_the_terms( $post->ID, 'post_format' );
29
30 if ( empty( $_format ) ) {
31 return false;
32 }
33
34 $format = reset( $_format );
35
36 return str_replace( 'post-format-', '', $format->slug );
37}
38
39/**
40 * Check if a post has any of the given formats, or any format.
41 *
42 * @since 3.1.0
43 *
44 * @param string|string[] $format Optional. The format or formats to check. Default empty array.
45 * @param WP_Post|int|null $post Optional. The post to check. Defaults to the current post in the loop.
46 * @return bool True if the post has any of the given formats (or any format, if no format specified),
47 * false otherwise.
48 */
49function has_post_format( $format = array(), $post = null ) {
50 $prefixed = array();
51
52 if ( $format ) {
53 foreach ( (array) $format as $single ) {
54 $prefixed[] = 'post-format-' . sanitize_key( $single );
55 }
56 }
57
58 return has_term( $prefixed, 'post_format', $post );
59}
60
61/**
62 * Assign a format to a post
63 *
64 * @since 3.1.0
65 *
66 * @param int|WP_Post $post The post for which to assign a format.
67 * @param string $format A format to assign. Use an empty string or array to remove all formats from the post.
68 * @return array|WP_Error|false Array of affected term IDs on success. WP_Error on error.
69 */
70function set_post_format( $post, $format ) {
71 $post = get_post( $post );
72
73 if ( ! $post ) {
74 return new WP_Error( 'invalid_post', __( 'Invalid post.' ) );
75 }
76
77 if ( ! empty( $format ) ) {
78 $format = sanitize_key( $format );
79 if ( 'standard' === $format || ! in_array( $format, get_post_format_slugs(), true ) ) {
80 $format = '';
81 } else {
82 $format = 'post-format-' . $format;
83 }
84 }
85
86 return wp_set_post_terms( $post->ID, $format, 'post_format' );
87}
88
89/**
90 * Returns an array of post format slugs to their translated and pretty display versions
91 *
92 * @since 3.1.0
93 *
94 * @return string[] Array of post format labels keyed by format slug.
95 */
96function get_post_format_strings() {
97 $strings = array(
98 'standard' => _x( 'Standard', 'Post format' ), // Special case. Any value that evals to false will be considered standard.
99 'aside' => _x( 'Aside', 'Post format' ),
100 'chat' => _x( 'Chat', 'Post format' ),
101 'gallery' => _x( 'Gallery', 'Post format' ),
102 'link' => _x( 'Link', 'Post format' ),
103 'image' => _x( 'Image', 'Post format' ),
104 'quote' => _x( 'Quote', 'Post format' ),
105 'status' => _x( 'Status', 'Post format' ),
106 'video' => _x( 'Video', 'Post format' ),
107 'audio' => _x( 'Audio', 'Post format' ),
108 );
109 return $strings;
110}
111
112/**
113 * Retrieves the array of post format slugs.
114 *
115 * @since 3.1.0
116 *
117 * @return string[] The array of post format slugs as both keys and values.
118 */
119function get_post_format_slugs() {
120 $slugs = array_keys( get_post_format_strings() );
121 return array_combine( $slugs, $slugs );
122}
123
124/**
125 * Returns a pretty, translated version of a post format slug
126 *
127 * @since 3.1.0
128 *
129 * @param string $slug A post format slug.
130 * @return string The translated post format name.
131 */
132function get_post_format_string( $slug ) {
133 $strings = get_post_format_strings();
134 if ( ! $slug ) {
135 return $strings['standard'];
136 } else {
137 return ( isset( $strings[ $slug ] ) ) ? $strings[ $slug ] : '';
138 }
139}
140
141/**
142 * Returns a link to a post format index.
143 *
144 * @since 3.1.0
145 *
146 * @param string $format The post format slug.
147 * @return string|WP_Error|false The post format term link.
148 */
149function get_post_format_link( $format ) {
150 $term = get_term_by( 'slug', 'post-format-' . $format, 'post_format' );
151 if ( ! $term || is_wp_error( $term ) ) {
152 return false;
153 }
154 return get_term_link( $term );
155}
156
157/**
158 * Filters the request to allow for the format prefix.
159 *
160 * @access private
161 * @since 3.1.0
162 *
163 * @param array $qvs
164 * @return array
165 */
166function _post_format_request( $qvs ) {
167 if ( ! isset( $qvs['post_format'] ) ) {
168 return $qvs;
169 }
170 $slugs = get_post_format_slugs();
171 if ( isset( $slugs[ $qvs['post_format'] ] ) ) {
172 $qvs['post_format'] = 'post-format-' . $slugs[ $qvs['post_format'] ];
173 }
174 $tax = get_taxonomy( 'post_format' );
175 if ( ! is_admin() ) {
176 $qvs['post_type'] = $tax->object_type;
177 }
178 return $qvs;
179}
180
181/**
182 * Filters the post format term link to remove the format prefix.
183 *
184 * @access private
185 * @since 3.1.0
186 *
187 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
188 *
189 * @param string $link
190 * @param WP_Term $term
191 * @param string $taxonomy
192 * @return string
193 */
194function _post_format_link( $link, $term, $taxonomy ) {
195 global $wp_rewrite;
196 if ( 'post_format' !== $taxonomy ) {
197 return $link;
198 }
199 if ( $wp_rewrite->get_extra_permastruct( $taxonomy ) ) {
200 return str_replace( "/{$term->slug}", '/' . str_replace( 'post-format-', '', $term->slug ), $link );
201 } else {
202 $link = remove_query_arg( 'post_format', $link );
203 return add_query_arg( 'post_format', str_replace( 'post-format-', '', $term->slug ), $link );
204 }
205}
206
207/**
208 * Remove the post format prefix from the name property of the term object created by get_term().
209 *
210 * @access private
211 * @since 3.1.0
212 *
213 * @param object $term
214 * @return object
215 */
216function _post_format_get_term( $term ) {
217 if ( isset( $term->slug ) ) {
218 $term->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );
219 }
220 return $term;
221}
222
223/**
224 * Remove the post format prefix from the name property of the term objects created by get_terms().
225 *
226 * @access private
227 * @since 3.1.0
228 *
229 * @param array $terms
230 * @param string|array $taxonomies
231 * @param array $args
232 * @return array
233 */
234function _post_format_get_terms( $terms, $taxonomies, $args ) {
235 if ( in_array( 'post_format', (array) $taxonomies, true ) ) {
236 if ( isset( $args['fields'] ) && 'names' === $args['fields'] ) {
237 foreach ( $terms as $order => $name ) {
238 $terms[ $order ] = get_post_format_string( str_replace( 'post-format-', '', $name ) );
239 }
240 } else {
241 foreach ( (array) $terms as $order => $term ) {
242 if ( isset( $term->taxonomy ) && 'post_format' === $term->taxonomy ) {
243 $terms[ $order ]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );
244 }
245 }
246 }
247 }
248 return $terms;
249}
250
251/**
252 * Remove the post format prefix from the name property of the term objects created by wp_get_object_terms().
253 *
254 * @access private
255 * @since 3.1.0
256 *
257 * @param array $terms
258 * @return array
259 */
260function _post_format_wp_get_object_terms( $terms ) {
261 foreach ( (array) $terms as $order => $term ) {
262 if ( isset( $term->taxonomy ) && 'post_format' === $term->taxonomy ) {
263 $terms[ $order ]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );
264 }
265 }
266 return $terms;
267}
268