run:R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
23.8 KB
2026-03-11 16:18:51
R W Run
7.8 KB
2026-03-11 16:18:52
R W Run
36.1 KB
2026-03-11 16:18:51
R W Run
11.9 KB
2026-03-11 16:18:52
R W Run
18.94 KB
2026-03-11 16:18:52
R W Run
7.35 KB
2026-03-11 16:18:52
R W Run
28.6 KB
2026-03-11 16:18:51
R W Run
316 By
2026-03-11 16:18:51
R W Run
12.9 KB
2026-03-11 16:18:51
R W Run
61.02 KB
2026-03-11 16:18:52
R W Run
15 KB
2026-03-11 16:18:51
R W Run
112.05 KB
2026-03-11 16:18:51
R W Run
12.47 KB
2026-03-11 16:18:51
R W Run
15.07 KB
2026-03-11 16:18:52
R W Run
9.84 KB
2026-03-11 16:18:52
R W Run
13.17 KB
2026-03-11 16:18:52
R W Run
33.83 KB
2026-03-11 16:18:51
R W Run
42.63 KB
2026-03-11 16:18:51
R W Run
55.71 KB
2026-03-11 16:18:52
R W Run
12.53 KB
2026-03-11 16:18:51
R W Run
2.55 KB
2026-03-11 16:18:52
R W Run
28.92 KB
2026-03-11 16:18:52
R W Run
539 By
2026-03-11 16:18:51
R W Run
367 By
2026-03-11 16:18:52
R W Run
42.65 KB
2026-03-11 16:18:51
R W Run
401 By
2026-03-11 16:18:51
R W Run
6.61 KB
2026-03-11 16:18:51
R W Run
664 By
2026-03-11 16:18:52
R W Run
20.63 KB
2026-03-11 16:18:51
R W Run
2.18 KB
2026-03-11 16:18:52
R W Run
453 By
2026-03-11 16:18:52
R W Run
457 By
2026-03-11 16:18:51
R W Run
36.83 KB
2026-03-11 16:18:52
R W Run
2.41 KB
2026-03-11 16:18:52
R W Run
8.28 KB
2026-03-11 16:18:51
R W Run
13.89 KB
2026-03-11 16:18:51
R W Run
11.76 KB
2026-03-11 16:18:51
R W Run
2.65 KB
2026-03-11 16:18:51
R W Run
7.43 KB
2026-03-11 16:18:51
R W Run
17.46 KB
2026-03-11 16:18:51
R W Run
5.14 KB
2026-03-11 16:18:52
R W Run
16.7 KB
2026-03-11 16:18:51
R W Run
8.28 KB
2026-03-11 16:18:52
R W Run
2.92 KB
2026-03-11 16:18:52
R W Run
1.32 KB
2026-03-11 16:18:51
R W Run
4.6 KB
2026-03-11 16:18:52
R W Run
11.62 KB
2026-03-11 16:18:52
R W Run
2.5 KB
2026-03-11 16:18:51
R W Run
1.97 KB
2026-03-11 16:18:51
R W Run
11.25 KB
2026-03-11 16:18:52
R W Run
5.32 KB
2026-03-11 16:18:51
R W Run
10.99 KB
2026-03-11 16:18:52
R W Run
68.32 KB
2026-03-11 16:18:51
R W Run
6.34 KB
2026-03-11 16:18:51
R W Run
5.49 KB
2026-03-11 16:18:51
R W Run
1.99 KB
2026-03-11 16:18:52
R W Run
7.02 KB
2026-03-11 16:18:51
R W Run
4.91 KB
2026-03-11 16:18:52
R W Run
16.86 KB
2026-03-11 16:18:51
R W Run
24.23 KB
2026-03-11 16:18:51
R W Run
3.97 KB
2026-03-11 16:18:51
R W Run
47.66 KB
2026-03-11 16:18:51
R W Run
9.22 KB
2026-03-11 16:18:51
R W Run
25.51 KB
2026-03-11 16:18:51
R W Run
198.38 KB
2026-03-11 16:18:52
R W Run
56.65 KB
2026-03-11 16:18:51
R W Run
10.46 KB
2026-03-11 16:18:51
R W Run
10.95 KB
2026-03-11 16:18:52
R W Run
29.26 KB
2026-03-11 16:18:51
R W Run
70.91 KB
2026-03-11 16:18:52
R W Run
35.3 KB
2026-03-11 16:18:52
R W Run
16.61 KB
2026-03-11 16:18:52
R W Run
2.57 KB
2026-03-11 16:18:52
R W Run
39.83 KB
2026-03-11 16:18:51
R W Run
70.64 KB
2026-03-11 16:18:51
R W Run
15.56 KB
2026-03-11 16:18:52
R W Run
7.33 KB
2026-03-11 16:18:52
R W Run
253 By
2026-03-11 16:18:51
R W Run
7.96 KB
2026-03-11 16:18:52
R W Run
3.23 KB
2026-03-11 16:18:52
R W Run
969 By
2026-03-11 16:18:52
R W Run
16.28 KB
2026-03-11 16:18:51
R W Run
7.22 KB
2026-03-11 16:18:51
R W Run
12.95 KB
2026-03-11 16:18:51
R W Run
6.53 KB
2026-03-11 16:18:51
R W Run
3.42 KB
2026-03-11 16:18:52
R W Run
5.84 KB
2026-03-11 16:18:51
R W Run
1.97 KB
2026-03-11 16:18:51
R W Run
4.3 KB
2026-03-11 16:18:52
R W Run
2.91 KB
2026-03-11 16:18:51
R W Run
16.46 KB
2026-03-11 16:18:52
R W Run
40.6 KB
2026-03-11 16:18:51
R W Run
20.22 KB
2026-03-11 16:18:51
R W Run
36.11 KB
2026-03-11 16:18:52
R W Run
17.01 KB
2026-03-11 16:18:51
R W Run
7.27 KB
2026-03-11 16:18:52
R W Run
6.62 KB
2026-03-11 16:18:52
R W Run
16.49 KB
2026-03-11 16:18:52
R W Run
1.79 KB
2026-03-11 16:18:52
R W Run
29.82 KB
2026-03-11 16:18:51
R W Run
6.67 KB
2026-03-11 16:18:52
R W Run
8.98 KB
2026-03-11 16:18:52
R W Run
19.42 KB
2026-03-11 16:18:51
R W Run
12.01 KB
2026-03-11 16:18:51
R W Run
17.11 KB
2026-03-11 16:18:51
R W Run
6.74 KB
2026-03-11 16:18:52
R W Run
30.93 KB
2026-03-11 16:18:51
R W Run
4.99 KB
2026-03-11 16:18:51
R W Run
4.25 KB
2026-03-11 16:18:51
R W Run
24.72 KB
2026-03-11 16:18:51
R W Run
29.96 KB
2026-03-11 16:18:52
R W Run
6.41 KB
2026-03-11 16:18:51
R W Run
160 KB
2026-03-11 16:18:51
R W Run
6.72 KB
2026-03-11 16:18:52
R W Run
10.92 KB
2026-03-11 16:18:51
R W Run
4.77 KB
2026-03-11 16:18:51
R W Run
3.38 KB
2026-03-11 16:18:51
R W Run
11.18 KB
2026-03-11 16:18:51
R W Run
62.19 KB
2026-03-11 16:18:51
R W Run
2.46 KB
2026-03-11 16:18:51
R W Run
9.17 KB
2026-03-11 16:18:51
R W Run
32.15 KB
2026-03-11 16:18:51
R W Run
34.05 KB
2026-03-11 16:18:52
R W Run
7.15 KB
2026-03-11 16:18:51
R W Run
3.47 KB
2026-03-11 16:18:52
R W Run
1.87 KB
2026-03-11 16:18:52
R W Run
30.91 KB
2026-03-11 16:18:51
R W Run
7.29 KB
2026-03-11 16:18:52
R W Run
7.35 KB
2026-03-11 16:18:51
R W Run
12.54 KB
2026-03-11 16:18:51
R W Run
19.12 KB
2026-03-11 16:18:51
R W Run
18.12 KB
2026-03-11 16:18:52
R W Run
39.99 KB
2026-03-11 16:18:52
R W Run
5.17 KB
2026-03-11 16:18:52
R W Run
979 By
2026-03-11 16:18:51
R W Run
18.44 KB
2026-03-11 16:18:52
R W Run
10.24 KB
2026-03-11 16:18:51
R W Run
1.77 KB
2026-03-11 16:18:52
R W Run
34.9 KB
2026-03-11 16:18:51
R W Run
7.19 KB
2026-03-11 16:18:52
R W Run
160.5 KB
2026-03-11 16:18:51
R W Run
64.27 KB
2026-03-11 16:18:51
R W Run
27.95 KB
2026-03-11 16:18:51
R W Run
4.69 KB
2026-03-11 16:18:51
R W Run
2.94 KB
2026-03-11 16:18:51
R W Run
43.13 KB
2026-03-11 16:18:52
R W Run
2.25 KB
2026-03-11 16:18:52
R W Run
22.5 KB
2026-03-11 16:18:51
R W Run
13.01 KB
2026-03-11 16:18:52
R W Run
3.27 KB
2026-03-11 16:18:51
R W Run
18 KB
2026-03-11 16:18:51
R W Run
210.4 KB
2026-03-11 16:18:52
R W Run
25.86 KB
2026-03-11 16:18:52
R W Run
115.85 KB
2026-03-11 16:18:51
R W Run
373 By
2026-03-11 16:18:52
R W Run
343 By
2026-03-11 16:18:52
R W Run
338 By
2026-03-11 16:18:51
R W Run
100.73 KB
2026-03-11 16:18:52
R W Run
130.93 KB
2026-03-11 16:18:51
R W Run
19.1 KB
2026-03-11 16:18:51
R W Run
17.41 KB
2026-03-11 16:18:52
R W Run
41.98 KB
2026-03-11 16:18:52
R W Run
400 By
2026-03-11 16:18:52
R W Run
11.1 KB
2026-03-11 16:18:52
R W Run
37.02 KB
2026-03-11 16:18:51
R W Run
2.24 KB
2026-03-11 16:18:51
R W Run
188.13 KB
2026-03-11 16:18:51
R W Run
338 By
2026-03-11 16:18:51
R W Run
38 KB
2026-03-11 16:18:51
R W Run
4.02 KB
2026-03-11 16:18:52
R W Run
5.38 KB
2026-03-11 16:18:51
R W Run
3.05 KB
2026-03-11 16:18:52
R W Run
2.61 KB
2026-03-11 16:18:51
R W Run
1.16 KB
2026-03-11 16:18:52
R W Run
4.04 KB
2026-03-11 16:18:51
R W Run
3.71 KB
2026-03-11 16:18:51
R W Run
24.6 KB
2026-03-11 16:18:51
R W Run
9.56 KB
2026-03-11 16:18:51
R W Run
346.43 KB
2026-03-11 16:18:52
R W Run
281.84 KB
2026-03-11 16:18:52
R W Run
14.95 KB
2026-03-11 16:18:51
R W Run
8.44 KB
2026-03-11 16:18:52
R W Run
168.95 KB
2026-03-11 16:18:52
R W Run
20.71 KB
2026-03-11 16:18:52
R W Run
25.27 KB
2026-03-11 16:18:51
R W Run
5.72 KB
2026-03-11 16:18:51
R W Run
4.63 KB
2026-03-11 16:18:52
R W Run
81.73 KB
2026-03-11 16:18:51
R W Run
67.18 KB
2026-03-11 16:18:51
R W Run
156.36 KB
2026-03-11 16:18:52
R W Run
55.19 KB
2026-03-11 16:18:51
R W Run
162 By
2026-03-11 16:18:51
R W Run
61.72 KB
2026-03-11 16:18:51
R W Run
216.06 KB
2026-03-11 16:18:52
R W Run
65.09 KB
2026-03-11 16:18:51
R W Run
25.24 KB
2026-03-11 16:18:52
R W Run
4.81 KB
2026-03-11 16:18:51
R W Run
6.48 KB
2026-03-11 16:18:52
R W Run
21.25 KB
2026-03-11 16:18:51
R W Run
2.79 KB
2026-03-11 16:18:52
R W Run
89.69 KB
2026-03-11 16:18:52
R W Run
19.42 KB
2026-03-11 16:18:52
R W Run
3.69 KB
2026-03-11 16:18:52
R W Run
4.11 KB
2026-03-11 16:18:51
R W Run
40.74 KB
2026-03-11 16:18:51
R W Run
25.38 KB
2026-03-11 16:18:51
R W Run
43.31 KB
2026-03-11 16:18:52
R W Run
102.57 KB
2026-03-11 16:18:52
R W Run
6.18 KB
2026-03-11 16:18:51
R W Run
124.47 KB
2026-03-11 16:18:52
R W Run
35.65 KB
2026-03-11 16:18:52
R W Run
6.94 KB
2026-03-11 16:18:52
R W Run
67.04 KB
2026-03-11 16:18:52
R W Run
10.62 KB
2026-03-11 16:18:51
R W Run
289.35 KB
2026-03-11 16:18:52
R W Run
36.23 KB
2026-03-11 16:18:51
R W Run
200 By
2026-03-11 16:18:52
R W Run
200 By
2026-03-11 16:18:52
R W Run
98.29 KB
2026-03-11 16:18:52
R W Run
30.02 KB
2026-03-11 16:18:52
R W Run
19.03 KB
2026-03-11 16:18:52
R W Run
5.06 KB
2026-03-11 16:18:52
R W Run
255 By
2026-03-11 16:18:51
R W Run
22.66 KB
2026-03-11 16:18:52
R W Run
154.63 KB
2026-03-11 16:18:51
R W Run
9.68 KB
2026-03-11 16:18:51
R W Run
258 By
2026-03-11 16:18:51
R W Run
23.49 KB
2026-03-11 16:18:51
R W Run
3.16 KB
2026-03-11 16:18:51
R W Run
8.4 KB
2026-03-11 16:18:52
R W Run
441 By
2026-03-11 16:18:51
R W Run
7.39 KB
2026-03-11 16:18:51
R W Run
173 KB
2026-03-11 16:18:52
R W Run
544 By
2026-03-11 16:18:52
R W Run
4.17 KB
2026-03-11 16:18:51
R W Run
35.97 KB
2026-03-11 16:18:52
R W Run
1.69 KB
2026-03-11 16:18:51
R W Run
2.84 KB
2026-03-11 16:18:52
R W Run
6.09 KB
2026-03-11 16:18:51
R W Run
8.71 KB
2026-03-11 16:18:51
R W Run
131.84 KB
2026-03-11 16:18:51
R W Run
37.45 KB
2026-03-11 16:18:51
R W Run
173.89 KB
2026-03-11 16:18:51
R W Run
7.09 KB
2026-03-11 16:18:51
R W Run
6.41 KB
2026-03-11 16:18:51
R W Run
1.08 KB
2026-03-11 16:18:51
R W Run
69.46 KB
2026-03-11 16:18:52
R W Run
445 By
2026-03-11 16:18:51
R W Run
799 By
2026-03-11 16:18:52
R W Run
error_log
📄category-template.php
1<?php
2/**
3 * Taxonomy API: Core category-specific template tags
4 *
5 * @package WordPress
6 * @subpackage Template
7 * @since 1.2.0
8 */
9
10/**
11 * Retrieves category link URL.
12 *
13 * @since 1.0.0
14 *
15 * @see get_term_link()
16 *
17 * @param int|object $category Category ID or object.
18 * @return string Link on success, empty string if category does not exist.
19 */
20function get_category_link( $category ) {
21 if ( ! is_object( $category ) ) {
22 $category = (int) $category;
23 }
24
25 $category = get_term_link( $category );
26
27 if ( is_wp_error( $category ) ) {
28 return '';
29 }
30
31 return $category;
32}
33
34/**
35 * Retrieves category parents with separator.
36 *
37 * @since 1.2.0
38 * @since 4.8.0 The `$visited` parameter was deprecated and renamed to `$deprecated`.
39 *
40 * @param int $category_id Category ID.
41 * @param bool $link Optional. Whether to format with link. Default false.
42 * @param string $separator Optional. How to separate categories. Default '/'.
43 * @param bool $nicename Optional. Whether to use nice name for display. Default false.
44 * @param array $deprecated Not used.
45 * @return string|WP_Error A list of category parents on success, WP_Error on failure.
46 */
47function get_category_parents( $category_id, $link = false, $separator = '/', $nicename = false, $deprecated = array() ) {
48
49 if ( ! empty( $deprecated ) ) {
50 _deprecated_argument( __FUNCTION__, '4.8.0' );
51 }
52
53 $format = $nicename ? 'slug' : 'name';
54
55 $args = array(
56 'separator' => $separator,
57 'link' => $link,
58 'format' => $format,
59 );
60
61 return get_term_parents_list( $category_id, 'category', $args );
62}
63
64/**
65 * Retrieves post categories.
66 *
67 * This tag may be used outside The Loop by passing a post ID as the parameter.
68 *
69 * Note: This function only returns results from the default "category" taxonomy.
70 * For custom taxonomies use get_the_terms().
71 *
72 * @since 0.71
73 *
74 * @param int|false $post_id Optional. The post ID. Defaults to current post ID.
75 * @return WP_Term[] Array of WP_Term objects, one for each category assigned to the post.
76 */
77function get_the_category( $post_id = false ) {
78 $categories = get_the_terms( $post_id, 'category' );
79 if ( ! $categories || is_wp_error( $categories ) ) {
80 $categories = array();
81 }
82
83 $categories = array_values( $categories );
84
85 foreach ( array_keys( $categories ) as $key ) {
86 _make_cat_compat( $categories[ $key ] );
87 }
88
89 /**
90 * Filters the array of categories to return for a post.
91 *
92 * @since 3.1.0
93 * @since 4.4.0 Added the `$post_id` parameter.
94 *
95 * @param WP_Term[] $categories An array of categories to return for the post.
96 * @param int|false $post_id The post ID.
97 */
98 return apply_filters( 'get_the_categories', $categories, $post_id );
99}
100
101/**
102 * Retrieves category name based on category ID.
103 *
104 * @since 0.71
105 *
106 * @param int $cat_id Category ID.
107 * @return string|WP_Error Category name on success, WP_Error on failure.
108 */
109function get_the_category_by_ID( $cat_id ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
110 $cat_id = (int) $cat_id;
111 $category = get_term( $cat_id );
112
113 if ( is_wp_error( $category ) ) {
114 return $category;
115 }
116
117 return ( $category ) ? $category->name : '';
118}
119
120/**
121 * Retrieves category list for a post in either HTML list or custom format.
122 *
123 * Generally used for quick, delimited (e.g. comma-separated) lists of categories,
124 * as part of a post entry meta.
125 *
126 * For a more powerful, list-based function, see wp_list_categories().
127 *
128 * @since 1.5.1
129 *
130 * @see wp_list_categories()
131 *
132 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
133 *
134 * @param string $separator Optional. Separator between the categories. By default, the links are placed
135 * in an unordered list. An empty string will result in the default behavior.
136 * @param string $parents Optional. How to display the parents. Accepts 'multiple', 'single', or empty.
137 * Default empty string.
138 * @param int|false $post_id Optional. ID of the post to retrieve categories for. Defaults to the current post.
139 * @return string Category list for a post.
140 */
141function get_the_category_list( $separator = '', $parents = '', $post_id = false ) {
142 global $wp_rewrite;
143
144 if ( ! is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) {
145 /** This filter is documented in wp-includes/category-template.php */
146 return apply_filters( 'the_category', '', $separator, $parents );
147 }
148
149 /**
150 * Filters the categories before building the category list.
151 *
152 * @since 4.4.0
153 *
154 * @param WP_Term[] $categories An array of the post's categories.
155 * @param int|false $post_id ID of the post to retrieve categories for.
156 * When `false`, defaults to the current post in the loop.
157 */
158 $categories = apply_filters( 'the_category_list', get_the_category( $post_id ), $post_id );
159
160 if ( empty( $categories ) ) {
161 /** This filter is documented in wp-includes/category-template.php */
162 return apply_filters( 'the_category', __( 'Uncategorized' ), $separator, $parents );
163 }
164
165 $rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? 'rel="category tag"' : 'rel="category"';
166
167 $thelist = '';
168 if ( '' === $separator ) {
169 $thelist .= '<ul class="post-categories">';
170 foreach ( $categories as $category ) {
171 $thelist .= "\n\t<li>";
172 switch ( strtolower( $parents ) ) {
173 case 'multiple':
174 if ( $category->parent ) {
175 $thelist .= get_category_parents( $category->parent, true, $separator );
176 }
177 $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>';
178 break;
179 case 'single':
180 $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>';
181 if ( $category->parent ) {
182 $thelist .= get_category_parents( $category->parent, false, $separator );
183 }
184 $thelist .= $category->name . '</a></li>';
185 break;
186 case '':
187 default:
188 $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>';
189 }
190 }
191 $thelist .= '</ul>';
192 } else {
193 $i = 0;
194 foreach ( $categories as $category ) {
195 if ( 0 < $i ) {
196 $thelist .= $separator;
197 }
198 switch ( strtolower( $parents ) ) {
199 case 'multiple':
200 if ( $category->parent ) {
201 $thelist .= get_category_parents( $category->parent, true, $separator );
202 }
203 $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>';
204 break;
205 case 'single':
206 $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>';
207 if ( $category->parent ) {
208 $thelist .= get_category_parents( $category->parent, false, $separator );
209 }
210 $thelist .= "$category->name</a>";
211 break;
212 case '':
213 default:
214 $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>';
215 }
216 ++$i;
217 }
218 }
219
220 /**
221 * Filters the category or list of categories.
222 *
223 * @since 1.2.0
224 *
225 * @param string $thelist List of categories for the current post.
226 * @param string $separator Separator used between the categories.
227 * @param string $parents How to display the category parents. Accepts 'multiple',
228 * 'single', or empty.
229 */
230 return apply_filters( 'the_category', $thelist, $separator, $parents );
231}
232
233/**
234 * Checks if the current post is within any of the given categories.
235 *
236 * The given categories are checked against the post's categories' term_ids, names and slugs.
237 * Categories given as integers will only be checked against the post's categories' term_ids.
238 *
239 * Prior to v2.5 of WordPress, category names were not supported.
240 * Prior to v2.7, category slugs were not supported.
241 * Prior to v2.7, only one category could be compared: in_category( $single_category ).
242 * Prior to v2.7, this function could only be used in the WordPress Loop.
243 * As of 2.7, the function can be used anywhere if it is provided a post ID or post object.
244 *
245 * For more information on this and similar theme functions, check out
246 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
247 * Conditional Tags} article in the Theme Developer Handbook.
248 *
249 * @since 1.2.0
250 * @since 2.7.0 The `$post` parameter was added.
251 *
252 * @param int|string|int[]|string[] $category Category ID, name, slug, or array of such
253 * to check against.
254 * @param int|null|WP_Post $post Optional. Post to check. Defaults to the current post.
255 * @return bool True if the current post is in any of the given categories.
256 */
257function in_category( $category, $post = null ) {
258 if ( empty( $category ) ) {
259 return false;
260 }
261
262 return has_category( $category, $post );
263}
264
265/**
266 * Displays category list for a post in either HTML list or custom format.
267 *
268 * @since 0.71
269 *
270 * @param string $separator Optional. Separator between the categories. By default, the links are placed
271 * in an unordered list. An empty string will result in the default behavior.
272 * @param string $parents Optional. How to display the parents. Accepts 'multiple', 'single', or empty.
273 * Default empty string.
274 * @param int|false $post_id Optional. ID of the post to retrieve categories for. Defaults to the current post.
275 */
276function the_category( $separator = '', $parents = '', $post_id = false ) {
277 echo get_the_category_list( $separator, $parents, $post_id );
278}
279
280/**
281 * Retrieves category description.
282 *
283 * @since 1.0.0
284 *
285 * @param int $category Optional. Category ID. Defaults to the current category ID.
286 * @return string Category description, if available.
287 */
288function category_description( $category = 0 ) {
289 return term_description( $category );
290}
291
292/**
293 * Displays or retrieves the HTML dropdown list of categories.
294 *
295 * The 'hierarchical' argument, which is disabled by default, will override the
296 * depth argument, unless it is true. When the argument is false, it will
297 * display all of the categories. When it is enabled it will use the value in
298 * the 'depth' argument.
299 *
300 * @since 2.1.0
301 * @since 4.2.0 Introduced the `value_field` argument.
302 * @since 4.6.0 Introduced the `required` argument.
303 * @since 6.1.0 Introduced the `aria_describedby` argument.
304 *
305 * @param array|string $args {
306 * Optional. Array or string of arguments to generate a categories drop-down element. See WP_Term_Query::__construct()
307 * for information on additional accepted arguments.
308 *
309 * @type string $show_option_all Text to display for showing all categories. Default empty.
310 * @type string $show_option_none Text to display for showing no categories. Default empty.
311 * @type string $option_none_value Value to use when no category is selected. Default empty.
312 * @type string $orderby Which column to use for ordering categories. See get_terms() for a list
313 * of accepted values. Default 'id' (term_id).
314 * @type bool $pad_counts See get_terms() for an argument description. Default false.
315 * @type bool|int $show_count Whether to include post counts. Accepts 0, 1, or their bool equivalents.
316 * Default 0.
317 * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their
318 * bool equivalents. Default 1.
319 * @type bool|int $hierarchical Whether to traverse the taxonomy hierarchy. Accepts 0, 1, or their bool
320 * equivalents. Default 0.
321 * @type int $depth Maximum depth. Default 0.
322 * @type int $tab_index Tab index for the select element. Default 0 (no tabindex).
323 * @type string $name Value for the 'name' attribute of the select element. Default 'cat'.
324 * @type string $id Value for the 'id' attribute of the select element. Defaults to the value
325 * of `$name`.
326 * @type string $class Value for the 'class' attribute of the select element. Default 'postform'.
327 * @type int|string $selected Value of the option that should be selected. Default 0.
328 * @type string $value_field Term field that should be used to populate the 'value' attribute
329 * of the option elements. Accepts any valid term field: 'term_id', 'name',
330 * 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description',
331 * 'parent', 'count'. Default 'term_id'.
332 * @type string|array $taxonomy Name of the taxonomy or taxonomies to retrieve. Default 'category'.
333 * @type bool $hide_if_empty True to skip generating markup if no categories are found.
334 * Default false (create select element even if no categories are found).
335 * @type bool $required Whether the `<select>` element should have the HTML5 'required' attribute.
336 * Default false.
337 * @type Walker $walker Walker object to use to build the output. Default empty which results in a
338 * Walker_CategoryDropdown instance being used.
339 * @type string $aria_describedby The 'id' of an element that contains descriptive text for the select.
340 * Default empty string.
341 * }
342 * @return string HTML dropdown list of categories.
343 */
344function wp_dropdown_categories( $args = '' ) {
345 $defaults = array(
346 'show_option_all' => '',
347 'show_option_none' => '',
348 'orderby' => 'id',
349 'order' => 'ASC',
350 'show_count' => 0,
351 'hide_empty' => 1,
352 'child_of' => 0,
353 'exclude' => '',
354 'echo' => 1,
355 'selected' => 0,
356 'hierarchical' => 0,
357 'name' => 'cat',
358 'id' => '',
359 'class' => 'postform',
360 'depth' => 0,
361 'tab_index' => 0,
362 'taxonomy' => 'category',
363 'hide_if_empty' => false,
364 'option_none_value' => -1,
365 'value_field' => 'term_id',
366 'required' => false,
367 'aria_describedby' => '',
368 );
369
370 $defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;
371
372 // Back compat.
373 if ( isset( $args['type'] ) && 'link' === $args['type'] ) {
374 _deprecated_argument(
375 __FUNCTION__,
376 '3.0.0',
377 sprintf(
378 /* translators: 1: "type => link", 2: "taxonomy => link_category" */
379 __( '%1$s is deprecated. Use %2$s instead.' ),
380 '<code>type => link</code>',
381 '<code>taxonomy => link_category</code>'
382 )
383 );
384 $args['taxonomy'] = 'link_category';
385 }
386
387 // Parse incoming $args into an array and merge it with $defaults.
388 $parsed_args = wp_parse_args( $args, $defaults );
389
390 $option_none_value = $parsed_args['option_none_value'];
391
392 if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) {
393 $parsed_args['pad_counts'] = true;
394 }
395
396 $tab_index = $parsed_args['tab_index'];
397
398 $tab_index_attribute = '';
399 if ( (int) $tab_index > 0 ) {
400 $tab_index_attribute = " tabindex=\"$tab_index\"";
401 }
402
403 // Avoid clashes with the 'name' param of get_terms().
404 $get_terms_args = $parsed_args;
405 unset( $get_terms_args['name'] );
406 $categories = get_terms( $get_terms_args );
407
408 $name = esc_attr( $parsed_args['name'] );
409 $class = esc_attr( $parsed_args['class'] );
410 $id = $parsed_args['id'] ? esc_attr( $parsed_args['id'] ) : $name;
411 $required = $parsed_args['required'] ? 'required' : '';
412
413 $aria_describedby_attribute = $parsed_args['aria_describedby'] ? ' aria-describedby="' . esc_attr( $parsed_args['aria_describedby'] ) . '"' : '';
414
415 if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
416 $output = "<select $required name='$name' id='$id' class='$class'$tab_index_attribute$aria_describedby_attribute>\n";
417 } else {
418 $output = '';
419 }
420 if ( empty( $categories ) && ! $parsed_args['hide_if_empty'] && ! empty( $parsed_args['show_option_none'] ) ) {
421
422 /**
423 * Filters a taxonomy drop-down display element.
424 *
425 * A variety of taxonomy drop-down display elements can be modified
426 * just prior to display via this filter. Filterable arguments include
427 * 'show_option_none', 'show_option_all', and various forms of the
428 * term name.
429 *
430 * @since 1.2.0
431 *
432 * @see wp_dropdown_categories()
433 *
434 * @param string $element Category name.
435 * @param WP_Term|null $category The category object, or null if there's no corresponding category.
436 */
437 $show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
438 $output .= "\t<option value='" . esc_attr( $option_none_value ) . "' selected='selected'>$show_option_none</option>\n";
439 }
440
441 if ( ! empty( $categories ) ) {
442
443 if ( $parsed_args['show_option_all'] ) {
444
445 /** This filter is documented in wp-includes/category-template.php */
446 $show_option_all = apply_filters( 'list_cats', $parsed_args['show_option_all'], null );
447 $selected = ( '0' === (string) $parsed_args['selected'] ) ? " selected='selected'" : '';
448 $output .= "\t<option value='0'$selected>$show_option_all</option>\n";
449 }
450
451 if ( $parsed_args['show_option_none'] ) {
452
453 /** This filter is documented in wp-includes/category-template.php */
454 $show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
455 $selected = selected( $option_none_value, $parsed_args['selected'], false );
456 $output .= "\t<option value='" . esc_attr( $option_none_value ) . "'$selected>$show_option_none</option>\n";
457 }
458
459 if ( $parsed_args['hierarchical'] ) {
460 $depth = $parsed_args['depth']; // Walk the full depth.
461 } else {
462 $depth = -1; // Flat.
463 }
464 $output .= walk_category_dropdown_tree( $categories, $depth, $parsed_args );
465 }
466
467 if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
468 $output .= "</select>\n";
469 }
470
471 /**
472 * Filters the taxonomy drop-down output.
473 *
474 * @since 2.1.0
475 *
476 * @param string $output HTML output.
477 * @param array $parsed_args Arguments used to build the drop-down.
478 */
479 $output = apply_filters( 'wp_dropdown_cats', $output, $parsed_args );
480
481 if ( $parsed_args['echo'] ) {
482 echo $output;
483 }
484
485 return $output;
486}
487
488/**
489 * Displays or retrieves the HTML list of categories.
490 *
491 * @since 2.1.0
492 * @since 4.4.0 Introduced the `hide_title_if_empty` and `separator` arguments.
493 * @since 4.4.0 The `current_category` argument was modified to optionally accept an array of values.
494 * @since 6.1.0 Default value of the 'use_desc_for_title' argument was changed from 1 to 0.
495 *
496 * @param array|string $args {
497 * Array of optional arguments. See get_categories(), get_terms(), and WP_Term_Query::__construct()
498 * for information on additional accepted arguments.
499 *
500 * @type int|int[] $current_category ID of category, or array of IDs of categories, that should get the
501 * 'current-cat' class. Default 0.
502 * @type int $depth Category depth. Used for tab indentation. Default 0.
503 * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their
504 * bool equivalents. Default 1.
505 * @type int[]|string $exclude Array or comma/space-separated string of term IDs to exclude.
506 * If `$hierarchical` is true, descendants of `$exclude` terms will also
507 * be excluded; see `$exclude_tree`. See get_terms().
508 * Default empty string.
509 * @type int[]|string $exclude_tree Array or comma/space-separated string of term IDs to exclude, along
510 * with their descendants. See get_terms(). Default empty string.
511 * @type string $feed Text to use for the feed link. Default 'Feed for all posts filed
512 * under [cat name]'.
513 * @type string $feed_image URL of an image to use for the feed link. Default empty string.
514 * @type string $feed_type Feed type. Used to build feed link. See get_term_feed_link().
515 * Default empty string (default feed).
516 * @type bool $hide_title_if_empty Whether to hide the `$title_li` element if there are no terms in
517 * the list. Default false (title will always be shown).
518 * @type string $separator Separator between links. Default '<br />'.
519 * @type bool|int $show_count Whether to include post counts. Accepts 0, 1, or their bool equivalents.
520 * Default 0.
521 * @type string $show_option_all Text to display for showing all categories. Default empty string.
522 * @type string $show_option_none Text to display for the 'no categories' option.
523 * Default 'No categories'.
524 * @type string $style The style used to display the categories list. If 'list', categories
525 * will be output as an unordered list. If left empty or another value,
526 * categories will be output separated by `<br>` tags. Default 'list'.
527 * @type string $taxonomy Name of the taxonomy to retrieve. Default 'category'.
528 * @type string $title_li Text to use for the list title `<li>` element. Pass an empty string
529 * to disable. Default 'Categories'.
530 * @type bool|int $use_desc_for_title Whether to use the category description as the title attribute.
531 * Accepts 0, 1, or their bool equivalents. Default 0.
532 * @type Walker $walker Walker object to use to build the output. Default empty which results
533 * in a Walker_Category instance being used.
534 * }
535 * @return void|string|false Void if 'echo' argument is true, HTML list of categories if 'echo' is false.
536 * False if the taxonomy does not exist.
537 */
538function wp_list_categories( $args = '' ) {
539 $defaults = array(
540 'child_of' => 0,
541 'current_category' => 0,
542 'depth' => 0,
543 'echo' => 1,
544 'exclude' => '',
545 'exclude_tree' => '',
546 'feed' => '',
547 'feed_image' => '',
548 'feed_type' => '',
549 'hide_empty' => 1,
550 'hide_title_if_empty' => false,
551 'hierarchical' => true,
552 'order' => 'ASC',
553 'orderby' => 'name',
554 'separator' => '<br />',
555 'show_count' => 0,
556 'show_option_all' => '',
557 'show_option_none' => __( 'No categories' ),
558 'style' => 'list',
559 'taxonomy' => 'category',
560 'title_li' => __( 'Categories' ),
561 'use_desc_for_title' => 0,
562 );
563
564 $parsed_args = wp_parse_args( $args, $defaults );
565
566 if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) {
567 $parsed_args['pad_counts'] = true;
568 }
569
570 // Descendants of exclusions should be excluded too.
571 if ( $parsed_args['hierarchical'] ) {
572 $exclude_tree = array();
573
574 if ( $parsed_args['exclude_tree'] ) {
575 $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude_tree'] ) );
576 }
577
578 if ( $parsed_args['exclude'] ) {
579 $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude'] ) );
580 }
581
582 $parsed_args['exclude_tree'] = $exclude_tree;
583 $parsed_args['exclude'] = '';
584 }
585
586 if ( ! isset( $parsed_args['class'] ) ) {
587 $parsed_args['class'] = ( 'category' === $parsed_args['taxonomy'] ) ? 'categories' : $parsed_args['taxonomy'];
588 }
589
590 if ( ! taxonomy_exists( $parsed_args['taxonomy'] ) ) {
591 return false;
592 }
593
594 $show_option_all = $parsed_args['show_option_all'];
595 $show_option_none = $parsed_args['show_option_none'];
596
597 $categories = get_categories( $parsed_args );
598
599 $output = '';
600
601 if ( $parsed_args['title_li'] && 'list' === $parsed_args['style']
602 && ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] )
603 ) {
604 $output = '<li class="' . esc_attr( $parsed_args['class'] ) . '">' . $parsed_args['title_li'] . '<ul>';
605 }
606
607 if ( empty( $categories ) ) {
608 if ( ! empty( $show_option_none ) ) {
609 if ( 'list' === $parsed_args['style'] ) {
610 $output .= '<li class="cat-item-none">' . $show_option_none . '</li>';
611 } else {
612 $output .= $show_option_none;
613 }
614 }
615 } else {
616 if ( ! empty( $show_option_all ) ) {
617
618 $posts_page = '';
619
620 // For taxonomies that belong only to custom post types, point to a valid archive.
621 $taxonomy_object = get_taxonomy( $parsed_args['taxonomy'] );
622 if ( ! in_array( 'post', $taxonomy_object->object_type, true ) && ! in_array( 'page', $taxonomy_object->object_type, true ) ) {
623 foreach ( $taxonomy_object->object_type as $object_type ) {
624 $_object_type = get_post_type_object( $object_type );
625
626 // Grab the first one.
627 if ( ! empty( $_object_type->has_archive ) ) {
628 $posts_page = get_post_type_archive_link( $object_type );
629 break;
630 }
631 }
632 }
633
634 // Fallback for the 'All' link is the posts page.
635 if ( ! $posts_page ) {
636 if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) ) {
637 $posts_page = get_permalink( get_option( 'page_for_posts' ) );
638 } else {
639 $posts_page = home_url( '/' );
640 }
641 }
642
643 $posts_page = esc_url( $posts_page );
644 if ( 'list' === $parsed_args['style'] ) {
645 $output .= "<li class='cat-item-all'><a href='$posts_page'>$show_option_all</a></li>";
646 } else {
647 $output .= "<a href='$posts_page'>$show_option_all</a>";
648 }
649 }
650
651 if ( empty( $parsed_args['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) {
652 $current_term_object = get_queried_object();
653 if ( $current_term_object && $parsed_args['taxonomy'] === $current_term_object->taxonomy ) {
654 $parsed_args['current_category'] = get_queried_object_id();
655 }
656 }
657
658 if ( $parsed_args['hierarchical'] ) {
659 $depth = $parsed_args['depth'];
660 } else {
661 $depth = -1; // Flat.
662 }
663 $output .= walk_category_tree( $categories, $depth, $parsed_args );
664 }
665
666 if ( $parsed_args['title_li'] && 'list' === $parsed_args['style']
667 && ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] )
668 ) {
669 $output .= '</ul></li>';
670 }
671
672 /**
673 * Filters the HTML output of a taxonomy list.
674 *
675 * @since 2.1.0
676 *
677 * @param string $output HTML output.
678 * @param array|string $args An array or query string of taxonomy-listing arguments. See
679 * wp_list_categories() for information on accepted arguments.
680 */
681 $html = apply_filters( 'wp_list_categories', $output, $args );
682
683 if ( $parsed_args['echo'] ) {
684 echo $html;
685 } else {
686 return $html;
687 }
688}
689
690/**
691 * Displays a tag cloud.
692 *
693 * Outputs a list of tags in what is called a 'tag cloud', where the size of each tag
694 * is determined by how many times that particular tag has been assigned to posts.
695 *
696 * @since 2.3.0
697 * @since 2.8.0 Added the `taxonomy` argument.
698 * @since 4.8.0 Added the `show_count` argument.
699 *
700 * @param array|string $args {
701 * Optional. Array or string of arguments for displaying a tag cloud. See wp_generate_tag_cloud()
702 * and get_terms() for the full lists of arguments that can be passed in `$args`.
703 *
704 * @type int $number The number of tags to display. Accepts any positive integer
705 * or zero to return all. Default 45.
706 * @type string $link Whether to display term editing links or term permalinks.
707 * Accepts 'edit' and 'view'. Default 'view'.
708 * @type string $post_type The post type. Used to highlight the proper post type menu
709 * on the linked edit page. Defaults to the first post type
710 * associated with the taxonomy.
711 * @type bool $echo Whether or not to echo the return value. Default true.
712 * }
713 * @return void|string|string[] Void if 'echo' argument is true, or on failure. Otherwise, tag cloud
714 * as a string or an array, depending on 'format' argument.
715 */
716function wp_tag_cloud( $args = '' ) {
717 $defaults = array(
718 'smallest' => 8,
719 'largest' => 22,
720 'unit' => 'pt',
721 'number' => 45,
722 'format' => 'flat',
723 'separator' => "\n",
724 'orderby' => 'name',
725 'order' => 'ASC',
726 'exclude' => '',
727 'include' => '',
728 'link' => 'view',
729 'taxonomy' => 'post_tag',
730 'post_type' => '',
731 'echo' => true,
732 'show_count' => 0,
733 );
734
735 $args = wp_parse_args( $args, $defaults );
736
737 $tags = get_terms(
738 array_merge(
739 $args,
740 array(
741 'orderby' => 'count',
742 'order' => 'DESC',
743 )
744 )
745 ); // Always query top tags.
746
747 if ( empty( $tags ) || is_wp_error( $tags ) ) {
748 return;
749 }
750
751 foreach ( $tags as $key => $tag ) {
752 if ( 'edit' === $args['link'] ) {
753 $link = get_edit_term_link( $tag, $tag->taxonomy, $args['post_type'] );
754 } else {
755 $link = get_term_link( $tag, $tag->taxonomy );
756 }
757
758 if ( is_wp_error( $link ) ) {
759 return;
760 }
761
762 $tags[ $key ]->link = $link;
763 $tags[ $key ]->id = $tag->term_id;
764 }
765
766 // Here's where those top tags get sorted according to $args.
767 $return = wp_generate_tag_cloud( $tags, $args );
768
769 /**
770 * Filters the tag cloud output.
771 *
772 * @since 2.3.0
773 *
774 * @param string|string[] $return Tag cloud as a string or an array, depending on 'format' argument.
775 * @param array $args An array of tag cloud arguments. See wp_tag_cloud()
776 * for information on accepted arguments.
777 */
778 $return = apply_filters( 'wp_tag_cloud', $return, $args );
779
780 if ( 'array' === $args['format'] || empty( $args['echo'] ) ) {
781 return $return;
782 }
783
784 echo $return;
785}
786
787/**
788 * Default topic count scaling for tag links.
789 *
790 * @since 2.9.0
791 *
792 * @param int $count Number of posts with that tag.
793 * @return int Scaled count.
794 */
795function default_topic_count_scale( $count ) {
796 return (int) round( log10( $count + 1 ) * 100 );
797}
798
799/**
800 * Generates a tag cloud (heatmap) from provided data.
801 *
802 * @todo Complete functionality.
803 * @since 2.3.0
804 * @since 4.8.0 Added the `show_count` argument.
805 *
806 * @param WP_Term[] $tags Array of WP_Term objects to generate the tag cloud for.
807 * @param string|array $args {
808 * Optional. Array or string of arguments for generating a tag cloud.
809 *
810 * @type int $smallest Smallest font size used to display tags. Paired
811 * with the value of `$unit`, to determine CSS text
812 * size unit. Default 8 (pt).
813 * @type int $largest Largest font size used to display tags. Paired
814 * with the value of `$unit`, to determine CSS text
815 * size unit. Default 22 (pt).
816 * @type string $unit CSS text size unit to use with the `$smallest`
817 * and `$largest` values. Accepts any valid CSS text
818 * size unit. Default 'pt'.
819 * @type int $number The number of tags to return. Accepts any
820 * positive integer or zero to return all.
821 * Default 0.
822 * @type string $format Format to display the tag cloud in. Accepts 'flat'
823 * (tags separated with spaces), 'list' (tags displayed
824 * in an unordered list), or 'array' (returns an array).
825 * Default 'flat'.
826 * @type string $separator HTML or text to separate the tags. Default "\n" (newline).
827 * @type string $orderby Value to order tags by. Accepts 'name' or 'count'.
828 * Default 'name'. The {@see 'tag_cloud_sort'} filter
829 * can also affect how tags are sorted.
830 * @type string $order How to order the tags. Accepts 'ASC' (ascending),
831 * 'DESC' (descending), or 'RAND' (random). Default 'ASC'.
832 * @type int|bool $filter Whether to enable filtering of the final output
833 * via {@see 'wp_generate_tag_cloud'}. Default 1.
834 * @type array $topic_count_text Nooped plural text from _n_noop() to supply to
835 * tag counts. Default null.
836 * @type callable $topic_count_text_callback Callback used to generate nooped plural text for
837 * tag counts based on the count. Default null.
838 * @type callable $topic_count_scale_callback Callback used to determine the tag count scaling
839 * value. Default default_topic_count_scale().
840 * @type bool|int $show_count Whether to display the tag counts. Default 0. Accepts
841 * 0, 1, or their bool equivalents.
842 * }
843 * @return string|string[] Tag cloud as a string or an array, depending on 'format' argument.
844 */
845function wp_generate_tag_cloud( $tags, $args = '' ) {
846 $defaults = array(
847 'smallest' => 8,
848 'largest' => 22,
849 'unit' => 'pt',
850 'number' => 0,
851 'format' => 'flat',
852 'separator' => "\n",
853 'orderby' => 'name',
854 'order' => 'ASC',
855 'topic_count_text' => null,
856 'topic_count_text_callback' => null,
857 'topic_count_scale_callback' => 'default_topic_count_scale',
858 'filter' => 1,
859 'show_count' => 0,
860 );
861
862 $args = wp_parse_args( $args, $defaults );
863
864 $return = ( 'array' === $args['format'] ) ? array() : '';
865
866 if ( empty( $tags ) ) {
867 return $return;
868 }
869
870 // Juggle topic counts.
871 if ( isset( $args['topic_count_text'] ) ) {
872 // First look for nooped plural support via topic_count_text.
873 $translate_nooped_plural = $args['topic_count_text'];
874 } elseif ( ! empty( $args['topic_count_text_callback'] ) ) {
875 // Look for the alternative callback style. Ignore the previous default.
876 if ( 'default_topic_count_text' === $args['topic_count_text_callback'] ) {
877 /* translators: %s: Number of items (tags). */
878 $translate_nooped_plural = _n_noop( '%s item', '%s items' );
879 } else {
880 $translate_nooped_plural = false;
881 }
882 } elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) {
883 // If no callback exists, look for the old-style single_text and multiple_text arguments.
884 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingular,WordPress.WP.I18n.NonSingularStringLiteralPlural
885 $translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] );
886 } else {
887 // This is the default for when no callback, plural, or argument is passed in.
888 /* translators: %s: Number of items (tags). */
889 $translate_nooped_plural = _n_noop( '%s item', '%s items' );
890 }
891
892 /**
893 * Filters how the items in a tag cloud are sorted.
894 *
895 * @since 2.8.0
896 *
897 * @param WP_Term[] $tags Ordered array of terms.
898 * @param array $args An array of tag cloud arguments.
899 */
900 $tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args );
901 if ( empty( $tags_sorted ) ) {
902 return $return;
903 }
904
905 if ( $tags_sorted !== $tags ) {
906 $tags = $tags_sorted;
907 unset( $tags_sorted );
908 } else {
909 if ( 'RAND' === $args['order'] ) {
910 shuffle( $tags );
911 } else {
912 // SQL cannot save you; this is a second (potentially different) sort on a subset of data.
913 if ( 'name' === $args['orderby'] ) {
914 uasort( $tags, '_wp_object_name_sort_cb' );
915 } else {
916 uasort( $tags, '_wp_object_count_sort_cb' );
917 }
918
919 if ( 'DESC' === $args['order'] ) {
920 $tags = array_reverse( $tags, true );
921 }
922 }
923 }
924
925 if ( $args['number'] > 0 ) {
926 $tags = array_slice( $tags, 0, $args['number'] );
927 }
928
929 $counts = array();
930 $real_counts = array(); // For the alt tag.
931 foreach ( (array) $tags as $key => $tag ) {
932 $real_counts[ $key ] = $tag->count;
933 $counts[ $key ] = call_user_func( $args['topic_count_scale_callback'], $tag->count );
934 }
935
936 $min_count = min( $counts );
937 $spread = max( $counts ) - $min_count;
938 if ( $spread <= 0 ) {
939 $spread = 1;
940 }
941 $font_spread = $args['largest'] - $args['smallest'];
942 if ( $font_spread < 0 ) {
943 $font_spread = 1;
944 }
945 $font_step = $font_spread / $spread;
946
947 $aria_label = false;
948 /*
949 * Determine whether to output an 'aria-label' attribute with the tag name and count.
950 * When tags have a different font size, they visually convey an important information
951 * that should be available to assistive technologies too. On the other hand, sometimes
952 * themes set up the Tag Cloud to display all tags with the same font size (setting
953 * the 'smallest' and 'largest' arguments to the same value).
954 * In order to always serve the same content to all users, the 'aria-label' gets printed out:
955 * - when tags have a different size
956 * - when the tag count is displayed (for example when users check the checkbox in the
957 * Tag Cloud widget), regardless of the tags font size
958 */
959 if ( $args['show_count'] || 0 !== $font_spread ) {
960 $aria_label = true;
961 }
962
963 // Assemble the data that will be used to generate the tag cloud markup.
964 $tags_data = array();
965 foreach ( $tags as $key => $tag ) {
966 $tag_id = isset( $tag->id ) ? $tag->id : $key;
967
968 $count = $counts[ $key ];
969 $real_count = $real_counts[ $key ];
970
971 if ( $translate_nooped_plural ) {
972 $formatted_count = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) );
973 } else {
974 $formatted_count = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args );
975 }
976
977 $tags_data[] = array(
978 'id' => $tag_id,
979 'url' => ( '#' !== $tag->link ) ? $tag->link : '#',
980 'role' => ( '#' !== $tag->link ) ? '' : ' role="button"',
981 'name' => $tag->name,
982 'formatted_count' => $formatted_count,
983 'slug' => $tag->slug,
984 'real_count' => $real_count,
985 'class' => 'tag-cloud-link tag-link-' . $tag_id,
986 'font_size' => $args['smallest'] + ( $count - $min_count ) * $font_step,
987 'aria_label' => $aria_label ? sprintf( ' aria-label="%1$s (%2$s)"', esc_attr( $tag->name ), esc_attr( $formatted_count ) ) : '',
988 'show_count' => $args['show_count'] ? '<span class="tag-link-count"> (' . $real_count . ')</span>' : '',
989 );
990 }
991
992 /**
993 * Filters the data used to generate the tag cloud.
994 *
995 * @since 4.3.0
996 *
997 * @param array[] $tags_data An array of term data arrays for terms used to generate the tag cloud.
998 */
999 $tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data );
1000
1001 $a = array();
1002
1003 // Generate the output links array.
1004 foreach ( $tags_data as $key => $tag_data ) {
1005 $class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 );
1006 $a[] = sprintf(
1007 '<a href="%1$s"%2$s class="%3$s" style="font-size: %4$s;"%5$s>%6$s%7$s</a>',
1008 esc_url( $tag_data['url'] ),
1009 $tag_data['role'],
1010 esc_attr( $class ),
1011 esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ),
1012 $tag_data['aria_label'],
1013 esc_html( $tag_data['name'] ),
1014 $tag_data['show_count']
1015 );
1016 }
1017
1018 switch ( $args['format'] ) {
1019 case 'array':
1020 $return =& $a;
1021 break;
1022 case 'list':
1023 /*
1024 * Force role="list", as some browsers (sic: Safari 10) don't expose to assistive
1025 * technologies the default role when the list is styled with `list-style: none`.
1026 * Note: this is redundant but doesn't harm.
1027 */
1028 $return = "<ul class='wp-tag-cloud' role='list'>\n\t<li>";
1029 $return .= implode( "</li>\n\t<li>", $a );
1030 $return .= "</li>\n</ul>\n";
1031 break;
1032 default:
1033 $return = implode( $args['separator'], $a );
1034 break;
1035 }
1036
1037 if ( $args['filter'] ) {
1038 /**
1039 * Filters the generated output of a tag cloud.
1040 *
1041 * The filter is only evaluated if a true value is passed
1042 * to the $filter argument in wp_generate_tag_cloud().
1043 *
1044 * @since 2.3.0
1045 *
1046 * @see wp_generate_tag_cloud()
1047 *
1048 * @param string[]|string $return String containing the generated HTML tag cloud output
1049 * or an array of tag links if the 'format' argument
1050 * equals 'array'.
1051 * @param WP_Term[] $tags An array of terms used in the tag cloud.
1052 * @param array $args An array of wp_generate_tag_cloud() arguments.
1053 */
1054 return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args );
1055 } else {
1056 return $return;
1057 }
1058}
1059
1060/**
1061 * Serves as a callback for comparing objects based on name.
1062 *
1063 * Used with `uasort()`.
1064 *
1065 * @since 3.1.0
1066 * @access private
1067 *
1068 * @param object $a The first object to compare.
1069 * @param object $b The second object to compare.
1070 * @return int Negative number if `$a->name` is less than `$b->name`, zero if they are equal,
1071 * or greater than zero if `$a->name` is greater than `$b->name`.
1072 */
1073function _wp_object_name_sort_cb( $a, $b ) {
1074 return strnatcasecmp( $a->name, $b->name );
1075}
1076
1077/**
1078 * Serves as a callback for comparing objects based on count.
1079 *
1080 * Used with `uasort()`.
1081 *
1082 * @since 3.1.0
1083 * @access private
1084 *
1085 * @param object $a The first object to compare.
1086 * @param object $b The second object to compare.
1087 * @return int Negative number if `$a->count` is less than `$b->count`, zero if they are equal,
1088 * or greater than zero if `$a->count` is greater than `$b->count`.
1089 */
1090function _wp_object_count_sort_cb( $a, $b ) {
1091 return ( $a->count - $b->count );
1092}
1093
1094//
1095// Helper functions.
1096//
1097
1098/**
1099 * Retrieves HTML list content for category list.
1100 *
1101 * @since 2.1.0
1102 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
1103 * to the function signature.
1104 *
1105 * @uses Walker_Category to create HTML list content.
1106 * @see Walker::walk() for parameters and return description.
1107 *
1108 * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments.
1109 * @return string
1110 */
1111function walk_category_tree( ...$args ) {
1112 // The user's options are the third parameter.
1113 if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {
1114 $walker = new Walker_Category();
1115 } else {
1116 /**
1117 * @var Walker $walker
1118 */
1119 $walker = $args[2]['walker'];
1120 }
1121 return $walker->walk( ...$args );
1122}
1123
1124/**
1125 * Retrieves HTML dropdown (select) content for category list.
1126 *
1127 * @since 2.1.0
1128 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
1129 * to the function signature.
1130 *
1131 * @uses Walker_CategoryDropdown to create HTML dropdown content.
1132 * @see Walker::walk() for parameters and return description.
1133 *
1134 * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments.
1135 * @return string
1136 */
1137function walk_category_dropdown_tree( ...$args ) {
1138 // The user's options are the third parameter.
1139 if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {
1140 $walker = new Walker_CategoryDropdown();
1141 } else {
1142 /**
1143 * @var Walker $walker
1144 */
1145 $walker = $args[2]['walker'];
1146 }
1147 return $walker->walk( ...$args );
1148}
1149
1150//
1151// Tags.
1152//
1153
1154/**
1155 * Retrieves the link to the tag.
1156 *
1157 * @since 2.3.0
1158 *
1159 * @see get_term_link()
1160 *
1161 * @param int|object $tag Tag ID or object.
1162 * @return string Link on success, empty string if tag does not exist.
1163 */
1164function get_tag_link( $tag ) {
1165 return get_category_link( $tag );
1166}
1167
1168/**
1169 * Retrieves the tags for a post.
1170 *
1171 * @since 2.3.0
1172 *
1173 * @param int|WP_Post $post Post ID or object.
1174 * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms
1175 * or the post does not exist, WP_Error on failure.
1176 */
1177function get_the_tags( $post = 0 ) {
1178 $terms = get_the_terms( $post, 'post_tag' );
1179
1180 /**
1181 * Filters the array of tags for the given post.
1182 *
1183 * @since 2.3.0
1184 *
1185 * @see get_the_terms()
1186 *
1187 * @param WP_Term[]|false|WP_Error $terms Array of WP_Term objects on success, false if there are no terms
1188 * or the post does not exist, WP_Error on failure.
1189 */
1190 return apply_filters( 'get_the_tags', $terms );
1191}
1192
1193/**
1194 * Retrieves the tags for a post formatted as a string.
1195 *
1196 * @since 2.3.0
1197 *
1198 * @param string $before Optional. String to use before the tags. Default empty.
1199 * @param string $sep Optional. String to use between the tags. Default empty.
1200 * @param string $after Optional. String to use after the tags. Default empty.
1201 * @param int $post_id Optional. Post ID. Defaults to the current post ID.
1202 * @return string|false|WP_Error A list of tags on success, false if there are no terms,
1203 * WP_Error on failure.
1204 */
1205function get_the_tag_list( $before = '', $sep = '', $after = '', $post_id = 0 ) {
1206 $tag_list = get_the_term_list( $post_id, 'post_tag', $before, $sep, $after );
1207
1208 /**
1209 * Filters the tags list for a given post.
1210 *
1211 * @since 2.3.0
1212 *
1213 * @param string $tag_list List of tags.
1214 * @param string $before String to use before the tags.
1215 * @param string $sep String to use between the tags.
1216 * @param string $after String to use after the tags.
1217 * @param int $post_id Post ID.
1218 */
1219 return apply_filters( 'the_tags', $tag_list, $before, $sep, $after, $post_id );
1220}
1221
1222/**
1223 * Displays the tags for a post.
1224 *
1225 * @since 2.3.0
1226 *
1227 * @param string $before Optional. String to use before the tags. Defaults to 'Tags:'.
1228 * @param string $sep Optional. String to use between the tags. Default ', '.
1229 * @param string $after Optional. String to use after the tags. Default empty.
1230 */
1231function the_tags( $before = null, $sep = ', ', $after = '' ) {
1232 if ( null === $before ) {
1233 $before = __( 'Tags: ' );
1234 }
1235
1236 $the_tags = get_the_tag_list( $before, $sep, $after );
1237
1238 if ( ! is_wp_error( $the_tags ) ) {
1239 echo $the_tags;
1240 }
1241}
1242
1243/**
1244 * Retrieves tag description.
1245 *
1246 * @since 2.8.0
1247 *
1248 * @param int $tag Optional. Tag ID. Defaults to the current tag ID.
1249 * @return string Tag description, if available.
1250 */
1251function tag_description( $tag = 0 ) {
1252 return term_description( $tag );
1253}
1254
1255/**
1256 * Retrieves term description.
1257 *
1258 * @since 2.8.0
1259 * @since 4.9.2 The `$taxonomy` parameter was deprecated.
1260 *
1261 * @param int $term Optional. Term ID. Defaults to the current term ID.
1262 * @param null $deprecated Deprecated. Not used.
1263 * @return string Term description, if available.
1264 */
1265function term_description( $term = 0, $deprecated = null ) {
1266 if ( ! $term && ( is_tax() || is_tag() || is_category() ) ) {
1267 $term = get_queried_object();
1268 if ( $term ) {
1269 $term = $term->term_id;
1270 }
1271 }
1272
1273 $description = get_term_field( 'description', $term );
1274
1275 return is_wp_error( $description ) ? '' : $description;
1276}
1277
1278/**
1279 * Retrieves the terms of the taxonomy that are attached to the post.
1280 *
1281 * @since 2.5.0
1282 *
1283 * @param int|WP_Post $post Post ID or object.
1284 * @param string $taxonomy Taxonomy name.
1285 * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms
1286 * or the post does not exist, WP_Error on failure.
1287 */
1288function get_the_terms( $post, $taxonomy ) {
1289 $post = get_post( $post );
1290
1291 if ( ! $post ) {
1292 return false;
1293 }
1294
1295 $terms = get_object_term_cache( $post->ID, $taxonomy );
1296
1297 if ( false === $terms ) {
1298 $terms = wp_get_object_terms( $post->ID, $taxonomy );
1299 if ( ! is_wp_error( $terms ) ) {
1300 $term_ids = wp_list_pluck( $terms, 'term_id' );
1301 wp_cache_add( $post->ID, $term_ids, $taxonomy . '_relationships' );
1302 }
1303 }
1304
1305 /**
1306 * Filters the list of terms attached to the given post.
1307 *
1308 * @since 3.1.0
1309 *
1310 * @param WP_Term[]|WP_Error $terms Array of attached terms, or WP_Error on failure.
1311 * @param int $post_id Post ID.
1312 * @param string $taxonomy Name of the taxonomy.
1313 */
1314 $terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );
1315
1316 if ( empty( $terms ) ) {
1317 return false;
1318 }
1319
1320 return $terms;
1321}
1322
1323/**
1324 * Retrieves a post's terms as a list with specified format.
1325 *
1326 * Terms are linked to their respective term listing pages.
1327 *
1328 * @since 2.5.0
1329 *
1330 * @param int $post_id Post ID.
1331 * @param string $taxonomy Taxonomy name.
1332 * @param string $before Optional. String to use before the terms. Default empty.
1333 * @param string $sep Optional. String to use between the terms. Default empty.
1334 * @param string $after Optional. String to use after the terms. Default empty.
1335 * @return string|false|WP_Error A list of terms on success, false if there are no terms,
1336 * WP_Error on failure.
1337 */
1338function get_the_term_list( $post_id, $taxonomy, $before = '', $sep = '', $after = '' ) {
1339 $terms = get_the_terms( $post_id, $taxonomy );
1340
1341 if ( is_wp_error( $terms ) ) {
1342 return $terms;
1343 }
1344
1345 if ( empty( $terms ) ) {
1346 return false;
1347 }
1348
1349 $links = array();
1350
1351 foreach ( $terms as $term ) {
1352 $link = get_term_link( $term, $taxonomy );
1353 if ( is_wp_error( $link ) ) {
1354 return $link;
1355 }
1356 $links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>';
1357 }
1358
1359 /**
1360 * Filters the term links for a given taxonomy.
1361 *
1362 * The dynamic portion of the hook name, `$taxonomy`, refers
1363 * to the taxonomy slug.
1364 *
1365 * Possible hook names include:
1366 *
1367 * - `term_links-category`
1368 * - `term_links-post_tag`
1369 * - `term_links-post_format`
1370 *
1371 * @since 2.5.0
1372 *
1373 * @param string[] $links An array of term links.
1374 */
1375 $term_links = apply_filters( "term_links-{$taxonomy}", $links ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
1376
1377 return $before . implode( $sep, $term_links ) . $after;
1378}
1379
1380/**
1381 * Retrieves term parents with separator.
1382 *
1383 * @since 4.8.0
1384 *
1385 * @param int $term_id Term ID.
1386 * @param string $taxonomy Taxonomy name.
1387 * @param string|array $args {
1388 * Array of optional arguments.
1389 *
1390 * @type string $format Use term names or slugs for display. Accepts 'name' or 'slug'.
1391 * Default 'name'.
1392 * @type string $separator Separator for between the terms. Default '/'.
1393 * @type bool $link Whether to format as a link. Default true.
1394 * @type bool $inclusive Include the term to get the parents for. Default true.
1395 * }
1396 * @return string|WP_Error A list of term parents on success, WP_Error or empty string on failure.
1397 */
1398function get_term_parents_list( $term_id, $taxonomy, $args = array() ) {
1399 $list = '';
1400 $term = get_term( $term_id, $taxonomy );
1401
1402 if ( is_wp_error( $term ) ) {
1403 return $term;
1404 }
1405
1406 if ( ! $term ) {
1407 return $list;
1408 }
1409
1410 $term_id = $term->term_id;
1411
1412 $defaults = array(
1413 'format' => 'name',
1414 'separator' => '/',
1415 'link' => true,
1416 'inclusive' => true,
1417 );
1418
1419 $args = wp_parse_args( $args, $defaults );
1420
1421 foreach ( array( 'link', 'inclusive' ) as $bool ) {
1422 $args[ $bool ] = wp_validate_boolean( $args[ $bool ] );
1423 }
1424
1425 $parents = get_ancestors( $term_id, $taxonomy, 'taxonomy' );
1426
1427 if ( $args['inclusive'] ) {
1428 array_unshift( $parents, $term_id );
1429 }
1430
1431 foreach ( array_reverse( $parents ) as $term_id ) {
1432 $parent = get_term( $term_id, $taxonomy );
1433 $name = ( 'slug' === $args['format'] ) ? $parent->slug : $parent->name;
1434
1435 if ( $args['link'] ) {
1436 $list .= '<a href="' . esc_url( get_term_link( $parent->term_id, $taxonomy ) ) . '">' . $name . '</a>' . $args['separator'];
1437 } else {
1438 $list .= $name . $args['separator'];
1439 }
1440 }
1441
1442 return $list;
1443}
1444
1445/**
1446 * Displays the terms for a post in a list.
1447 *
1448 * @since 2.5.0
1449 *
1450 * @param int $post_id Post ID.
1451 * @param string $taxonomy Taxonomy name.
1452 * @param string $before Optional. String to use before the terms. Default empty.
1453 * @param string $sep Optional. String to use between the terms. Default ', '.
1454 * @param string $after Optional. String to use after the terms. Default empty.
1455 * @return void|false Void on success, false on failure.
1456 */
1457function the_terms( $post_id, $taxonomy, $before = '', $sep = ', ', $after = '' ) {
1458 $term_list = get_the_term_list( $post_id, $taxonomy, $before, $sep, $after );
1459
1460 if ( is_wp_error( $term_list ) ) {
1461 return false;
1462 }
1463
1464 /**
1465 * Filters the list of terms to display.
1466 *
1467 * @since 2.9.0
1468 *
1469 * @param string $term_list List of terms to display.
1470 * @param string $taxonomy The taxonomy name.
1471 * @param string $before String to use before the terms.
1472 * @param string $sep String to use between the terms.
1473 * @param string $after String to use after the terms.
1474 */
1475 echo apply_filters( 'the_terms', $term_list, $taxonomy, $before, $sep, $after );
1476}
1477
1478/**
1479 * Checks if the current post has any of given category.
1480 *
1481 * The given categories are checked against the post's categories' term_ids, names and slugs.
1482 * Categories given as integers will only be checked against the post's categories' term_ids.
1483 *
1484 * If no categories are given, determines if post has any categories.
1485 *
1486 * @since 3.1.0
1487 *
1488 * @param string|int|array $category Optional. The category name/term_id/slug,
1489 * or an array of them to check for. Default empty.
1490 * @param int|WP_Post $post Optional. Post to check. Defaults to the current post.
1491 * @return bool True if the current post has any of the given categories
1492 * (or any category, if no category specified). False otherwise.
1493 */
1494function has_category( $category = '', $post = null ) {
1495 return has_term( $category, 'category', $post );
1496}
1497
1498/**
1499 * Checks if the current post has any of given tags.
1500 *
1501 * The given tags are checked against the post's tags' term_ids, names and slugs.
1502 * Tags given as integers will only be checked against the post's tags' term_ids.
1503 *
1504 * If no tags are given, determines if post has any tags.
1505 *
1506 * For more information on this and similar theme functions, check out
1507 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
1508 * Conditional Tags} article in the Theme Developer Handbook.
1509 *
1510 * @since 2.6.0
1511 * @since 2.7.0 Tags given as integers are only checked against
1512 * the post's tags' term_ids, not names or slugs.
1513 * @since 2.7.0 Can be used outside of the WordPress Loop if `$post` is provided.
1514 *
1515 * @param string|int|array $tag Optional. The tag name/term_id/slug,
1516 * or an array of them to check for. Default empty.
1517 * @param int|WP_Post $post Optional. Post to check. Defaults to the current post.
1518 * @return bool True if the current post has any of the given tags
1519 * (or any tag, if no tag specified). False otherwise.
1520 */
1521function has_tag( $tag = '', $post = null ) {
1522 return has_term( $tag, 'post_tag', $post );
1523}
1524
1525/**
1526 * Checks if the current post has any of given terms.
1527 *
1528 * The given terms are checked against the post's terms' term_ids, names and slugs.
1529 * Terms given as integers will only be checked against the post's terms' term_ids.
1530 *
1531 * If no terms are given, determines if post has any terms.
1532 *
1533 * @since 3.1.0
1534 *
1535 * @param string|int|array $term Optional. The term name/term_id/slug,
1536 * or an array of them to check for. Default empty.
1537 * @param string $taxonomy Optional. Taxonomy name. Default empty.
1538 * @param int|WP_Post $post Optional. Post to check. Defaults to the current post.
1539 * @return bool True if the current post has any of the given terms
1540 * (or any term, if no term specified). False otherwise.
1541 */
1542function has_term( $term = '', $taxonomy = '', $post = null ) {
1543 $post = get_post( $post );
1544
1545 if ( ! $post ) {
1546 return false;
1547 }
1548
1549 $r = is_object_in_term( $post->ID, $taxonomy, $term );
1550 if ( is_wp_error( $r ) ) {
1551 return false;
1552 }
1553
1554 return $r;
1555}
1556
Ui Ux Design – Teachers Night Out https://cardgames4educators.com Wed, 16 Oct 2024 22:24:18 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://cardgames4educators.com/wp-content/uploads/2024/06/cropped-Card-4-Educators-logo-32x32.png Ui Ux Design – Teachers Night Out https://cardgames4educators.com 32 32 Masters In English How English Speaker https://cardgames4educators.com/masters-in-english-how-english-speaker/ https://cardgames4educators.com/masters-in-english-how-english-speaker/#comments Mon, 27 May 2024 08:54:45 +0000 https://themexriver.com/wp/kadu/?p=1

Erat himenaeos neque id sagittis massa. Hac suscipit pulvinar dignissim platea magnis eu. Don tellus a pharetra inceptos efficitur dui pulvinar. Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent pulvinar odio volutpat parturient. Quisque risus finibus suspendisse mus purus magnis facilisi condimentum consectetur dui. Curae elit suspendisse cursus vehicula.

Turpis taciti class non vel pretium quis pulvinar tempor lobortis nunc. Libero phasellus parturient sapien volutpat malesuada ornare. Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae. Porta est tempor ex eget feugiat vulputate ipsum. Justo nec iaculis habitant diam arcu fermentum.

We offer comprehen sive emplo ment services such as assistance wit employer compliance.Our company is your strategic HR partner as instead of HR. john smithson

Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae.

Exploring Learning Landscapes in Academic

Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent.

]]>
https://cardgames4educators.com/masters-in-english-how-english-speaker/feed/ 1