angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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 }