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; } }