block-template-utils.php (3760B)
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 }