*/
class WPUPG_Template_Editor {
/**
* Register actions and filters.
*
* @since 3.0.0
*/
public static function init() {
add_action( 'admin_menu', array( __CLASS__, 'add_submenu_page' ), 20 );
}
/**
* Add the template editor submenu to the WPUPG menu.
*
* @since 3.0.0
*/
public static function add_submenu_page() {
add_submenu_page( 'wpultimatepostgrid', __( 'WPUPG Template Editor', 'wp-ultimate-post-grid' ), __( 'Template Editor', 'wp-ultimate-post-grid' ), 'manage_options', 'wpupg_template_editor', array( __CLASS__, 'template_editor_page_template' ) );
}
/**
* Get the template for the template editor page.
*
* @since 3.0.0
*/
public static function template_editor_page_template() {
self::localize_admin_template();
echo '
Loading...
';
}
/**
* Localize JS for the template editor page.
*
* @since 5.8.0
*/
public static function localize_admin_template() {
// Get all modern templates.
$modern_templates = array();
$templates = WPUPG_Template_Manager::get_templates();
foreach ( $templates as $template ) {
$modern_templates[ $template['slug'] ] = self::prepare_template_for_editor( $template );
}
wp_localize_script( 'wpupg-admin-template', 'wpupg_admin_template', array(
'templates' => $modern_templates,
'shortcodes' => WPUPG_Template_Shortcodes::get_shortcodes(),
'icons' => WPUPG_Icon::get_all(),
'thumbnail_sizes' => get_intermediate_image_sizes(),
'preview_item' => self::get_default_preview_item(),
) );
}
/**
* Get the default preview item for the template editor.
*
* @since 3.4.0
*/
private static function get_default_preview_item() {
$preview_item = false;
// Get the latest published post that as a featured image set.
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 1,
'ignore_sticky_posts' => true,
'order_by' => 'date',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'value' => '0',
'compare' => '>'
),
),
);
$query = new WP_Query( $args );
$posts = $query->have_posts() ? $query->posts : array();
$post = isset( $posts[0] ) ? $posts[0] : false;
if ( $post ) {
$item = WPUPG_Item_Manager::get_item( $post->ID );
if ( $item ) {
$post_type = get_post_type_object( $post->post_type );
$preview_item = array(
'value' => $post->ID,
'label' => $post_type->labels->singular_name . ' - ' . $post->ID . ' - ' . $post->post_title,
'classes' => $item->classes(),
);
}
}
return $preview_item;
}
/**
* Prepare a template for the template editor.
*
* @since 3.0.0
* @param mixed $template Template to prepare.
*/
public static function prepare_template_for_editor( $template ) {
$template['style'] = self::extract_style_with_properties( $template );
return $template;
}
/**
* Extract the style and optional properties from a template stylesheet.
*
* @since 3.0.0
* @param mixed $template Template to extract from.
*/
private static function extract_style_with_properties( $template ) {
$css = WPUPG_Template_Manager::get_template_css( $template );
// Find properties in CSS.
$properties = array();
preg_match_all( "/:([^:;]+);\s*\/\*([^*]*)\*+([^\/*][^*]*\*+)*\//im", $css, $matches );
foreach ( $matches[2] as $index => $comment ) {
$value = trim( $matches[1][ $index ] );
$comment = trim( $comment );
// Check if it's one of our comments.
if ( 'wpupg_' === substr( $comment, 0, 6 ) ) {
$parts = explode( ' ', $comment );
// First part should be variable name.
$id = substr( $parts[0], 6 );
unset( $parts[0] );
if ( $id ) {
$property = array(
'id' => $id,
'name' => ucwords( str_replace( '_', ' ', $id ) ),
'default' => $value,
'value' => $value,
);
// Check if there are any parts left.
foreach ( $parts as $part ) {
$pieces = explode( '=', $part );
if ( 2 === count( $pieces ) ) {
if ( ! array_key_exists( $pieces[0], $property ) ) {
$property[ $pieces[0] ] = $pieces[1];
}
}
}
// Add to properties.
$properties[ $id ] = $property;
// Replace with variable in CSS.
$css = str_ireplace( $matches[0][ $index ], ': %wpupg_' . $id .'%;', $css );
}
}
}
return array(
'properties' => $properties,
'css' => $css,
);
}
}
WPUPG_Template_Editor::init();