This repository has been archived on 2022-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
divi/includes/builder/post/type/Layout.php

236 lines
6.2 KiB
PHP

<?php
if ( ! defined( 'ET_BUILDER_LAYOUT_POST_TYPE' ) ) {
define( 'ET_BUILDER_LAYOUT_POST_TYPE', 'et_pb_layout' );
}
require_once ET_BUILDER_DIR . 'post/query/Layouts.php';
class ET_Builder_Post_Type_Layout extends ET_Core_Post_Type {
/**
* @inheritDoc
*/
protected $_category_tax = 'layout_category';
/**
* @inheritDoc
*/
protected $_owner = 'builder';
/**
* @inheritDoc
*/
protected $_tag_tax = 'layout_pack';
/**
* @inheritDoc
*/
public $name = ET_BUILDER_LAYOUT_POST_TYPE;
/**
* ET_Builder_Post_Type_Layout constructor.
*/
public function __construct() {
parent::__construct();
add_action( "add_meta_boxes_{$this->name}", array( $this, 'wp_hook_add_meta_boxes' ) );
add_action( "manage_{$this->name}_posts_custom_column", array( $this, 'wp_hook_manage_posts_custom_column' ), 10, 2 );
add_filter( "manage_{$this->name}_posts_columns", array( $this, 'wp_hook_manage_posts_columns' ) );
}
/**
* @inheritDoc
*/
protected function _before_register() {
/**
* Filters {@see register_post_type()} args for the et_pb_layout post type.
*
* @deprecated Use {@see 'et_core_cpt_et_pb_layout_args'} instead.
*
* @since 3.1 Deprecated. See {@see 'et_core_cpt_et_pb_layout_args'}.
* @since 1.0
*
* @param $args
*/
$this->_args = apply_filters( 'et_pb_layout_args', $this->_args );
}
/**
* @inheritDoc
*/
protected function _get_args() {
return array(
'can_export' => true,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => false,
'map_meta_cap' => true,
'public' => false,
'publicly_queryable' => self::is_publicly_queryable(),
'query_var' => false,
'show_in_menu' => false,
'show_ui' => true,
'supports' => array(
'editor',
'excerpt',
'revisions',
'thumbnail',
'title',
),
'taxonomies' => array(
'layout_category',
'layout_pack',
'layout_type',
'module_width',
'scope',
),
);
}
/**
* @inheritDoc
*/
protected function _get_labels() {
return array(
'add_new' => esc_html_x( 'Add New', 'Layout', 'et_builder' ),
'add_new_item' => esc_html__( 'Add New Layout', 'et_builder' ),
'all_items' => esc_html__( 'All Layouts', 'et_builder' ),
'edit_item' => esc_html__( 'Edit Layout', 'et_builder' ),
'name' => esc_html__( 'Layouts', 'et_builder' ),
'new_item' => esc_html__( 'New Layout', 'et_builder' ),
'not_found' => esc_html__( 'Nothing found', 'et_builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'et_builder' ),
'parent_item_colon' => '',
'search_items' => esc_html__( 'Search Layouts', 'et_builder' ),
'singular_name' => et_builder_i18n( 'Layout' ),
'view_item' => esc_html__( 'View Layout', 'et_builder' ),
);
}
/**
* Get the class instance.
*
* @since 3.0.99
*
* @param string $type See {@see self::$wp_type} for accepted values. Default is 'cpt'.
* @param string $name The name/slug of the post object. Default is {@see self::$name}.
*
* @return self|null
*/
public static function instance( $type = 'cpt', $name = 'et_pb_layout' ) {
if ( ! $instance = parent::instance( $type, $name ) ) {
$instance = new self();
}
return $instance;
}
/**
* Whether or not a layout is global.
*
* @param $post_id
*
* @return bool
*/
public function is_global( $post_id ) {
$tax_name = ET_Builder_Post_Taxonomy_LayoutScope::instance()->name;
if ( $terms = get_the_terms( $post_id, $tax_name ) ) {
foreach ( $terms as $term ) {
if ( 'global' === $term->name ) {
return true;
}
}
}
return false;
}
/**
* Determines if the Library's CPT and taxonomies should be publicly queryable for the current request.
*
* @sine ??
*
* @return bool
*/
public static function is_publicly_queryable() {
// phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification
$get = $_GET;
$actions = array(
'et_fb_update_builder_assets',
'et_fb_retrieve_builder_data',
);
$is_ajax = isset( $_REQUEST['action'] ) && in_array( $_REQUEST['action'], $actions );
$is_VB = ( '1' === self::$_->array_get( $get, 'et_fb' ) || $is_ajax ) && et_pb_is_allowed( 'use_visual_builder' );
// phpcs:enable
$is_wpcli = defined( 'WP_CLI' ) && WP_CLI;
$has_preview = ! $is_VB && ! is_null( self::$_->array_get( $get, 'et_pb_preview', null ) );
$is_preview = $has_preview && et_core_security_check_passed( '', 'et_pb_preview_nonce', '', '_GET' );
return $is_VB || $is_preview || $is_wpcli;
}
/**
* @return ET_Builder_Post_Query_Layouts
*/
public function query() {
return new ET_Builder_Post_Query_Layouts( $this->name, $this->_category_tax, $this->_tag_tax );
}
/**
* Moves the excerpt meta box into the side column for this post type.
* {@see 'add_meta_boxes_{$type}'}
*
* @since 3.0.99
*/
public function wp_hook_add_meta_boxes() {
remove_meta_box( 'postexcerpt', null, 'normal' );
add_meta_box( 'postexcerpt', __( 'Description' ), 'post_excerpt_meta_box', null, 'side', 'default' );
}
/**
* Adds custom columns to the Divi Library admin page.
* {@see 'manage_{$post_type}_posts_columns'}
*
* @since 3.1 Relocated from `builder/layouts.php`.
* @since 2.5.7
*/
public function wp_hook_manage_posts_columns( $columns ) {
$_new_columns = array();
foreach ( $columns as $column_key => $column ) {
$_new_columns[ $column_key ] = $column;
if ( 'taxonomy-layout_type' === $column_key ) {
$_new_columns['layout_global'] = esc_html__( 'Global', 'et_builder' );
}
}
return $_new_columns;
}
/**
* Sets the content of our custom columns for each row on the Divi Library admin page.
* {@see 'manage_posts_custom_column'}
*
* @since 3.1 Relocated from `builder/layouts.php`.
* @since 2.5.7
*/
public function wp_hook_manage_posts_custom_column( $column_key, $post_id ) {
switch ( $column_key ) {
case 'layout_global':
if ( $this->is_global( $post_id ) ) {
echo '<span class="et-builder-library__icon--global" aria-label="Global"/>';
} else {
echo '<span aria-label="Not Global"/>';
}
break;
}
}
}