You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
9.2 KiB
PHP

<?php
/**
* ET_Theme_Builder_Local_Library_Item class
*
* @package Builder
* @subpackage ThemeBuilder
* @since 4.18.0
*/
/**
* Class used to implement local library in the theme builder.
* */
class ET_Theme_Builder_Local_Library_Item {
/**
* Data util.
*
* @var ET_Core_Data_Utils
*/
protected static $_;
/**
* The library item post.
*
* @var WP_Post|null
*/
public $item_post = null;
/**
* The library item type. i.e template and preset.
*
* @deprecated Use get_item_type() instead. This should be private variable, eventually.
*
* @var string
*/
public $item_type;
/**
* The contructor.
*
* @since 4.18.0
*
* @param integer|null $item_id Iem post id.
*/
public function __construct( $item_id = null ) {
if ( $item_id ) {
$this->init_item( $item_id );
}
self::$_ = ET_Core_Data_Utils::instance();
}
/**
* Returns the Library Item type.
*
* @return string
*/
public function get_item_type() {
return $this->item_type;
}
/**
* Init item.
*
* @param integer $item_id Item post id.
*/
public function init_item( $item_id ) {
// Initalize item post.
$item_post = et_theme_builder_get_library_item_post( $item_id );
if ( is_wp_error( $item_post ) ) {
return new WP_Error( 'et_library_item_not_exists', __( 'Library Item does not exist.', 'et_builder' ) );
}
$this->item_post = $item_post;
$item_type = et_theme_builder_get_library_item_type( $item_post );
if ( is_wp_error( $item_post ) ) {
return $item_type;
}
$this->item_type = $item_type;
}
/**
* Use the local library item.
*
* @param array $args Item details.
*/
public function use_library_item( $args = [] ) {
if ( ! $this->item_post || ! $this->item_type ) {
return new WP_Error(
'no_library_item_found',
esc_html__( 'No library item found', 'et_builder' ),
array(
'status' => 400,
)
);
}
switch ( $this->item_type ) {
case ET_THEME_BUILDER_ITEM_TEMPLATE:
return $this->use_template();
case ET_THEME_BUILDER_ITEM_SET:
return $this->use_preset( $args );
// `default` case is already handled in the above `if` statement.
}
}
// phpcs:disable Squiz.Commenting.FunctionComment.ParamCommentFullStop -- Respecting punctuation.
/**
* Use local library template.
*
* @param array $global_layouts Optional. Array containing the necessary params.
* $params = [
* 'header' => (int|string) Header Layout ID. `use_global` string when TB global layout (relink option) is to be used.
* 'body' => (int|string) Body Layout ID. `use_global` string when TB global layout (relink option) is to be used.
* 'footer' => (int|string) Footer Layout ID. `use_global` string when TB global layout (relink option) is to be used.
* ]
*/
public function use_template( $global_layouts = [] ) {
$template_data = array(
'layouts' => et_theme_builder_create_layouts_from_library_template( $this->item_post, $global_layouts ),
'settings' => et_theme_builder_get_template_settings( $this->item_post->ID, true ),
);
return $template_data;
}
// phpcs:enable
/**
* Populate Data to implement Use Preset functionality in TB.
*
* @param array $args Additional arguments.
*
* @return array
*/
public function use_preset( $args = [] ) {
$preset = [];
$_ = et_();
$override_default_website_template = $_->array_get( $args, 'override_default_website_template' );
$incoming_layout_duplicate_decision = $_->array_get( $args, 'incoming_layout_duplicate_decision' );
$global_layouts = [];
$default_template_id = 0;
$maybe_default_template_id = get_post_meta( $this->item_post->ID, '_et_default_template_id', true );
$default_template_id = is_string( $maybe_default_template_id ) ? absint( $maybe_default_template_id ) : 0;
if ( 'duplicate' === $incoming_layout_duplicate_decision || $override_default_website_template ) {
if ( $default_template_id > 0 ) {
// $context is raw, because get_post()->post_content by default uses `raw`.
$default_template = get_post( $default_template_id );
$global_layouts = et_theme_builder_create_layouts_from_library_template( $default_template );
$preset[ $default_template_id ] = [
'layouts' => $global_layouts,
'settings' => et_theme_builder_get_template_settings( $default_template_id, true ),
];
}
if ( ! $override_default_website_template ) {
// Layouts should be created for each templates when `Import as static layouts` is clicked.
$global_layouts = [];
}
}
$template_ids = get_post_meta( $this->item_post->ID, '_et_template_id', false );
foreach ( $template_ids as $maybe_template_id ) {
$template_id = absint( $maybe_template_id );
if ( $default_template_id === $template_id && 'relink' !== $incoming_layout_duplicate_decision ) {
continue;
}
if ( $default_template_id === $template_id && 'relink' === $incoming_layout_duplicate_decision ) {
foreach ( [ 'header', 'body', 'footer' ] as $layout_type ) {
if ( '1' === get_post_meta( $template_id, "_et_{$layout_type}_layout_global", true ) ) {
$global_layouts[ $layout_type ] = 'use_global';
}
}
}
$library_item = new self( $template_id );
$preset[ $template_id ] = $library_item->use_template( $global_layouts );
}
return $preset;
}
/**
* Returns TRUE when the given Preset ID contains a global layout.
*
* @return bool
*/
public function has_global_layouts() {
if ( ET_THEME_BUILDER_ITEM_SET !== $this->item_type ) {
return false;
}
$has_global_layouts = '1' === get_post_meta( $this->item_post->ID, '_et_has_global_layouts', true );
return $has_global_layouts;
}
/**
* Returns TRUE when the given Preset ID contains a default template.
*
* @return bool
*/
public function has_default_template() {
if ( ET_THEME_BUILDER_ITEM_SET !== $this->item_type ) {
return false;
}
$has_default_template = '1' === get_post_meta( $this->item_post->ID, '_et_has_default_template', true );
return $has_default_template;
}
/**
* Gets the default template ID when the $item_type is preset.
*
* @return bool
*/
public function get_default_template_id() {
if ( ! $this->has_default_template() ) {
return 0;
}
$template_ids = get_post_meta( $this->item_post->ID, '_et_template_id', false );
$default_template_id = 0;
foreach ( $template_ids as $template_id ) {
$is_default = (bool) get_post_meta( $template_id, '_et_default', true );
if ( $is_default ) {
$default_template_id = $template_id;
} else {
continue;
}
return $default_template_id;
}
}
/**
* Get the theme builder id.
*
* @since 4.18.0
*
* @return int The theme builder id.
*/
public function get_theme_builder_id() {
return $this->theme_builder_id;
}
/**
* Gets the item field.
*
* @param string $field_name Database field name.
* @param string $context Refer get_post_field() for context.
* @param string $default Default value to return when actual value does not exist.
* @return string
*/
public function get_item_field( $field_name = 'post_title', $context = 'display', $default = '' ) {
if ( is_a( $this->item_post, 'WP_Post' ) ) {
return get_post_field( $field_name, $this->item_post->ID, $context );
} else {
return $default;
}
}
/**
* Gets the item title field.
*
* @param string $context Refer get_post_field() for context.
* @param string $default Default value to return when actual value does not exist.
* @return string
*/
public function get_item_title( $context = 'display', $default = '' ) {
return $this->get_item_field( 'post_title', $context );
}
/**
* Gets the item title field formatted to be displayed in Theme Builder.
*
* @return int|WP_Error Valid Post ID on success. 0 or WP_Error on failure.
*/
public function duplicate_template_item() {
$template_meta_keys = array(
'_et_autogenerated_title',
'_et_enabled',
'_et_header_layout_enabled',
'_et_body_layout_enabled',
'_et_footer_layout_enabled',
'_et_template_title',
'_et_use_on',
'_et_exclude_from',
'_et_header_layout_global',
'_et_body_layout_global',
'_et_footer_layout_global',
'_et_set_template',
'_et_default',
);
foreach ( $template_meta_keys as $key ) {
$post_meta_value = get_post_meta( $this->item_post->ID, $key, true );
// `empty()` must NOT be used because meta value may contain '0' and the post meta will be skipped during duplication.
if ( isset( $post_meta_value ) && '' !== $post_meta_value ) {
$template_meta_input[ $key ] = $post_meta_value;
}
}
$new_item = array(
'post_title' => $this->item_post->post_title,
'post_content' => wp_slash( $this->item_post->post_content ),
'post_status' => 'publish',
'post_type' => $this->item_post->post_type,
'meta_input' => $template_meta_input,
'tax_input' => array(
'et_tb_item_type' => ET_THEME_BUILDER_ITEM_TEMPLATE,
),
);
return wp_insert_post( $new_item );
}
/**
* Duplicates the Library Item.
*
* @return int
*/
public function duplicate_item() {
$item_duplication_function = "duplicate_{$this->get_item_type()}_item";
$duplicated_item_id = $this->$item_duplication_function();
return $duplicated_item_id;
}
}