%PDF- %PDF-
Direktori : /var/www/tif-dev/wp-content/plugins/lazy-blocks/classes/ |
Current File : //var/www/tif-dev/wp-content/plugins/lazy-blocks/classes/class-templates.php |
<?php /** * LazyBlocks templates. * * @package lazyblocks */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * LazyBlocks_Templates class. Class to work with LazyBlocks CPT. */ class LazyBlocks_Templates { /** * LazyBlocks_Templates constructor. */ public function __construct() { add_action( 'init', array( $this, 'register_post_type' ) ); // add template to posts. add_filter( 'register_post_type_args', array( $this, 'register_post_type_args' ), 20, 2 ); // enqueue Gutenberg on templates screen. add_action( 'enqueue_block_editor_assets', array( $this, 'templates_editor_enqueue_scripts' ) ); // additional elements in blocks list table. add_filter( 'disable_months_dropdown', array( $this, 'disable_months_dropdown' ), 10, 2 ); add_filter( 'post_row_actions', array( $this, 'post_row_actions' ), 10, 2 ); add_filter( 'manage_lazyblocks_templates_posts_columns', array( $this, 'manage_posts_columns' ) ); add_filter( 'manage_lazyblocks_templates_posts_custom_column', array( $this, 'manage_posts_custom_column' ), 10, 2 ); } /** * Templates list. * * @var array|null */ private $templates = null; /** * Templates list added by user using add_template method. * * @var null */ private $user_templates = null; /** * Add template. * * @param array $data - block data. */ public function add_template( $data ) { if ( null === $this->user_templates ) { $this->user_templates = array(); } $this->user_templates[] = apply_filters( 'lzb/add_user_template', $data ); } /** * Get all templates array. * * @param bool $db_only - get templates from database only. * @param bool $no_cache - get templates without cache. * * @return array|null */ public function get_templates( $db_only = false, $no_cache = false ) { // fetch templates. if ( null === $this->templates || $no_cache ) { $this->templates = array(); // get all lazyblocks_templates post types. // Don't use WP_Query on the admin side https://core.trac.wordpress.org/ticket/18408 . $all_templates = get_posts( array( 'post_type' => 'lazyblocks_templates', // phpcs:ignore 'posts_per_page' => -1, 'showposts' => -1, 'paged' => -1, ) ); foreach ( $all_templates as $template ) { $post_types = get_post_meta( $template->ID, '_lzb_template_post_types', true ); $template_lock = get_post_meta( $template->ID, '_lzb_template_lock', true ); $blocks = (array) json_decode( urldecode( get_post_meta( $template->ID, '_lzb_template_blocks', true ) ), true ); $this->templates[] = array( 'id' => $template->ID, 'title' => $template->post_title, 'post_types' => $post_types, 'template_lock' => $template_lock, 'blocks' => $blocks, ); } } if ( ! $db_only && $this->user_templates ) { return array_merge( $this->templates, $this->user_templates ); } return $this->templates; } /** * Add templates to posts. * * @param array $args - post type args. * @param string $post_type - post type. * * @return array */ public function register_post_type_args( $args, $post_type ) { // get all templates. $all_templates = $this->get_templates(); foreach ( $all_templates as $template ) { if ( ! in_array( $post_type, (array) $template['post_types'], true ) ) { continue; } if ( ! empty( $template['blocks'] ) ) { $args['template'] = $template['blocks']; if ( ! isset( $args['supports'] ) ) { $args['supports'] = array(); } if ( ! in_array( 'custom-fields', $args['supports'], true ) ) { $args['supports'][] = 'custom-fields'; } } if ( $template['template_lock'] ) { $args['template_lock'] = $template['template_lock']; } return $args; } return $args; } /** * Register CPT. */ public function register_post_type() { register_post_type( 'lazyblocks_templates', array( 'labels' => array( 'name' => __( 'Templates', 'lazy-blocks' ), 'singular_name' => __( 'Template', 'lazy-blocks' ), ), 'public' => false, 'has_archive' => false, 'show_ui' => true, 'show_in_menu' => 'edit.php?post_type=lazyblocks', 'show_in_rest' => true, 'capabilities' => array( 'edit_post' => 'edit_lazyblock', 'edit_posts' => 'edit_lazyblocks', 'edit_others_posts' => 'edit_other_lazyblocks', 'publish_posts' => 'publish_lazyblocks', 'read_post' => 'read_lazyblock', 'read_private_posts' => 'read_private_lazyblocks', 'delete_posts' => 'delete_lazyblocks', 'delete_post' => 'delete_lazyblock', ), 'rewrite' => true, 'supports' => array( 'title', 'editor', 'revisions', 'custom-fields', ), ) ); // Actual template settings. register_meta( 'post', '_lzb_template_lock', array( 'object_subtype' => 'lazyblocks_templates', 'type' => 'string', 'default' => '', 'single' => true, 'show_in_rest' => true, 'auth_callback' => array( __CLASS__, 'rest_auth' ), ) ); register_meta( 'post', '_lzb_template_post_types', array( 'object_subtype' => 'lazyblocks_templates', 'type' => 'array', 'single' => true, 'show_in_rest' => array( 'schema' => array( 'type' => 'array', 'items' => array( 'type' => 'string', ), ), ), 'auth_callback' => array( __CLASS__, 'rest_auth' ), ) ); register_meta( 'post', '_lzb_template_blocks', array( 'object_subtype' => 'lazyblocks_templates', 'type' => 'string', 'default' => '', 'single' => true, 'show_in_rest' => true, 'auth_callback' => array( __CLASS__, 'rest_auth' ), ) ); register_meta( 'post', '_lzb_template_convert_blocks_to_content', array( 'object_subtype' => 'lazyblocks_templates', 'type' => 'boolean', 'default' => false, 'single' => true, 'show_in_rest' => true, 'auth_callback' => array( __CLASS__, 'rest_auth' ), ) ); } /** * Determines REST API authentication. * * @param bool $allowed Whether it is allowed. * @param string $meta_key The meta key being checked. * @param int $post_id The post ID being checked. * @param int $user_id The user ID being checked. * * @return bool Whether the user can do it. */ public static function rest_auth( $allowed, $meta_key, $post_id, $user_id ) { return user_can( $user_id, 'edit_post', $post_id ); } /** * Disable month dropdown. * * @param array $return disabled dropdown or no. * @param object $post_type current post type name. * * @return array */ public function disable_months_dropdown( $return, $post_type ) { return 'lazyblocks_templates' === $post_type ? true : $return; } /** * Remove unused actions from actions row. * * @param array $actions actions for posts. * @param object $post current post data. * * @return array */ public function post_row_actions( $actions = array(), $post = null ) { if ( ! $post || 'lazyblocks_templates' !== $post->post_type ) { return $actions; } // remove quick edit link. if ( isset( $actions['inline hide-if-no-js'] ) ) { unset( $actions['inline hide-if-no-js'] ); } return $actions; } /** * Add additional columns to templates. * * @param array $columns columns of the table. * * @return array */ public function manage_posts_columns( $columns = array() ) { $columns = array( 'cb' => $columns['cb'], 'title' => $columns['title'], 'lazyblocks_template_post_types' => esc_html__( 'Post Types', 'lazy-blocks' ), 'lazyblocks_template_lock' => esc_html__( 'Template Lock', 'lazy-blocks' ), ); return $columns; } /** * Add thumb to the column * * @param bool $column_name column name. */ public function manage_posts_custom_column( $column_name = false ) { global $post; if ( 'lazyblocks_template_post_types' === $column_name ) { $post_types = get_post_meta( $post->ID, '_lzb_template_post_types', true ); if ( ! empty( $post_types ) ) { foreach ( $post_types as $type ) { $type_object = get_post_type_object( $type ); echo '<code>' . esc_html( isset( $type_object->labels->singular_name ) ? $type_object->labels->singular_name : $type ) . '</code> '; } } else { echo '-'; } } if ( 'lazyblocks_template_lock' === $column_name ) { $template_lock = get_post_meta( $post->ID, '_lzb_template_lock', true ); if ( 'all' === $template_lock ) { echo '<code>' . esc_html__( 'All', 'lazy-blocks' ) . '</code>'; } elseif ( 'insert' === $template_lock ) { echo '<code>' . esc_html__( 'Insert', 'lazy-blocks' ) . '</code>'; } else { echo '-'; } } } /** * Enqueue constructor styles and scripts. */ public function templates_editor_enqueue_scripts() { if ( 'lazyblocks_templates' === get_post_type() ) { $templates = $this->get_templates( true ); $post_types = array(); $template_id = get_the_ID(); foreach ( $templates as $template ) { if ( $template['id'] !== $template_id ) { $post_types = array_merge( (array) $template['post_types'], $post_types ); } } wp_enqueue_script( 'lazyblocks-templates', lazyblocks()->plugin_url() . 'assets/admin/templates/index.min.js', array( 'wp-blocks', 'wp-block-library', 'wp-data', 'wp-element', 'wp-components', 'wp-api', 'wp-i18n' ), '2.5.3', true ); wp_localize_script( 'lazyblocks-templates', 'lazyblocksTemplatesData', array( 'used_post_types_for_templates' => $post_types, ) ); wp_enqueue_style( 'lazyblocks-templates', lazyblocks()->plugin_url() . 'assets/admin/templates/style.min.css', '', '2.5.3' ); wp_style_add_data( 'lazyblocks-templates', 'rtl', 'replace' ); wp_style_add_data( 'lazyblocks-templates', 'suffix', '.min' ); } } }