18
|
1 |
<?php |
|
2 |
/** |
|
3 |
* Utilities used to fetch and create templates. |
|
4 |
* |
|
5 |
* @package WordPress |
|
6 |
* @since 5.8.0 |
|
7 |
*/ |
|
8 |
|
|
9 |
/** |
|
10 |
* Build a unified template object based a post Object. |
|
11 |
* |
|
12 |
* @access private |
|
13 |
* @since 5.8.0 |
|
14 |
* |
|
15 |
* @param WP_Post $post Template post. |
|
16 |
* |
|
17 |
* @return WP_Block_Template|WP_Error Template. |
|
18 |
*/ |
|
19 |
function _build_template_result_from_post( $post ) { |
|
20 |
$terms = get_the_terms( $post, 'wp_theme' ); |
|
21 |
|
|
22 |
if ( is_wp_error( $terms ) ) { |
|
23 |
return $terms; |
|
24 |
} |
|
25 |
|
|
26 |
if ( ! $terms ) { |
|
27 |
return new WP_Error( 'template_missing_theme', __( 'No theme is defined for this template.' ) ); |
|
28 |
} |
|
29 |
|
|
30 |
$theme = $terms[0]->name; |
|
31 |
|
|
32 |
$template = new WP_Block_Template(); |
|
33 |
$template->wp_id = $post->ID; |
|
34 |
$template->id = $theme . '//' . $post->post_name; |
|
35 |
$template->theme = $theme; |
|
36 |
$template->content = $post->post_content; |
|
37 |
$template->slug = $post->post_name; |
|
38 |
$template->source = 'custom'; |
|
39 |
$template->type = $post->post_type; |
|
40 |
$template->description = $post->post_excerpt; |
|
41 |
$template->title = $post->post_title; |
|
42 |
$template->status = $post->post_status; |
|
43 |
$template->has_theme_file = false; |
|
44 |
|
|
45 |
return $template; |
|
46 |
} |
|
47 |
|
|
48 |
/** |
|
49 |
* Retrieves a list of unified template objects based on a query. |
|
50 |
* |
|
51 |
* @since 5.8.0 |
|
52 |
* |
|
53 |
* @param array $query { |
|
54 |
* Optional. Arguments to retrieve templates. |
|
55 |
* |
|
56 |
* @type array $slug__in List of slugs to include. |
|
57 |
* @type int $wp_id Post ID of customized template. |
|
58 |
* } |
|
59 |
* @param string $template_type Optional. The template type (post type). Default 'wp_template'. |
|
60 |
* @return WP_Block_Template[] Block template objects. |
|
61 |
*/ |
|
62 |
function get_block_templates( $query = array(), $template_type = 'wp_template' ) { |
|
63 |
$wp_query_args = array( |
|
64 |
'post_status' => array( 'auto-draft', 'draft', 'publish' ), |
|
65 |
'post_type' => $template_type, |
|
66 |
'posts_per_page' => -1, |
|
67 |
'no_found_rows' => true, |
|
68 |
'tax_query' => array( |
|
69 |
array( |
|
70 |
'taxonomy' => 'wp_theme', |
|
71 |
'field' => 'name', |
|
72 |
'terms' => wp_get_theme()->get_stylesheet(), |
|
73 |
), |
|
74 |
), |
|
75 |
); |
|
76 |
|
|
77 |
if ( isset( $query['slug__in'] ) ) { |
|
78 |
$wp_query_args['post_name__in'] = $query['slug__in']; |
|
79 |
} |
|
80 |
|
|
81 |
// This is only needed for the regular templates CPT listing and editor. |
|
82 |
if ( isset( $query['wp_id'] ) ) { |
|
83 |
$wp_query_args['p'] = $query['wp_id']; |
|
84 |
} else { |
|
85 |
$wp_query_args['post_status'] = 'publish'; |
|
86 |
} |
|
87 |
|
|
88 |
$template_query = new WP_Query( $wp_query_args ); |
|
89 |
$query_result = array(); |
|
90 |
foreach ( $template_query->posts as $post ) { |
|
91 |
$template = _build_template_result_from_post( $post ); |
|
92 |
|
|
93 |
if ( ! is_wp_error( $template ) ) { |
|
94 |
$query_result[] = $template; |
|
95 |
} |
|
96 |
} |
|
97 |
|
|
98 |
return $query_result; |
|
99 |
} |
|
100 |
|
|
101 |
/** |
|
102 |
* Retrieves a single unified template object using its id. |
|
103 |
* |
|
104 |
* @since 5.8.0 |
|
105 |
* |
|
106 |
* @param string $id Template unique identifier (example: theme_slug//template_slug). |
|
107 |
* @param string $template_type wp_template. |
|
108 |
* |
|
109 |
* @return WP_Block_Template|null Template. |
|
110 |
*/ |
|
111 |
function get_block_template( $id, $template_type = 'wp_template' ) { |
|
112 |
$parts = explode( '//', $id, 2 ); |
|
113 |
if ( count( $parts ) < 2 ) { |
|
114 |
return null; |
|
115 |
} |
|
116 |
list( $theme, $slug ) = $parts; |
|
117 |
$wp_query_args = array( |
|
118 |
'post_name__in' => array( $slug ), |
|
119 |
'post_type' => $template_type, |
|
120 |
'post_status' => array( 'auto-draft', 'draft', 'publish', 'trash' ), |
|
121 |
'posts_per_page' => 1, |
|
122 |
'no_found_rows' => true, |
|
123 |
'tax_query' => array( |
|
124 |
array( |
|
125 |
'taxonomy' => 'wp_theme', |
|
126 |
'field' => 'name', |
|
127 |
'terms' => $theme, |
|
128 |
), |
|
129 |
), |
|
130 |
); |
|
131 |
$template_query = new WP_Query( $wp_query_args ); |
|
132 |
$posts = $template_query->posts; |
|
133 |
|
|
134 |
if ( count( $posts ) > 0 ) { |
|
135 |
$template = _build_template_result_from_post( $posts[0] ); |
|
136 |
|
|
137 |
if ( ! is_wp_error( $template ) ) { |
|
138 |
return $template; |
|
139 |
} |
|
140 |
} |
|
141 |
|
|
142 |
return null; |
|
143 |
} |